summaryrefslogtreecommitdiff
path: root/module/language/tree-il/compile-bytecode.scm
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2020-05-04 21:58:10 +0200
committerAndy Wingo <wingo@pobox.com>2020-05-04 21:58:10 +0200
commit6b2d56ce15c9f6126db6bd7d5951378e05b4303f (patch)
tree2aa78e9a0a01beecf6b450b0c092807a9d10870e /module/language/tree-il/compile-bytecode.scm
parentf0a9e537a0eb167acb71cdc223380610287e99fe (diff)
downloadguile-6b2d56ce15c9f6126db6bd7d5951378e05b4303f.tar.gz
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.
Diffstat (limited to 'module/language/tree-il/compile-bytecode.scm')
-rw-r--r--module/language/tree-il/compile-bytecode.scm11
1 files changed, 7 insertions, 4 deletions
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))
(($ <call> 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)))
(($ <prompt>) (visit-prompt exp env 'tail))