From 6b2d56ce15c9f6126db6bd7d5951378e05b4303f Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 4 May 2020 21:58:10 +0200 Subject: Avoid shuffle-down for tail calls * module/language/tree-il/compile-bytecode.scm (compile-closure): We can emit the precise move sequence and just do a reset-frame once, so go ahead and do that. --- module/language/tree-il/compile-bytecode.scm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'module/language/tree-il/compile-bytecode.scm') diff --git a/module/language/tree-il/compile-bytecode.scm b/module/language/tree-il/compile-bytecode.scm index 92f6a37f1..d0e5271ba 100644 --- a/module/language/tree-il/compile-bytecode.scm +++ b/module/language/tree-il/compile-bytecode.scm @@ -1246,10 +1246,13 @@ in the frame with for the lambda-case clause @var{clause}." (emit-return-values asm)) (($ src proc args) - (let ((from (stack-height env))) - (fold for-push (for-push proc env) args) - (emit-reset-frame asm (+ from 1 (length args))) - (emit-shuffle-down asm from 0) + (let* ((base (stack-height env)) + (env (fold for-push (for-push proc env) args))) + (let lp ((i (length args)) (env env)) + (when (<= 0 i) + (lp (1- i) (env-prev env)) + (emit-mov asm (+ (env-idx env) base) (env-idx env)))) + (emit-reset-frame asm (+ 1 (length args))) (emit-tail-call asm))) (($ ) (visit-prompt exp env 'tail)) -- cgit v1.2.3