From: Andrea Corallo Date: Sun, 11 Aug 2019 14:44:12 +0000 (+0200) Subject: add comp-emit-narg-prologue X-Git-Tag: emacs-28.0.90~2727^2~1291 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=29e17e08b395db8e08e4c91a543750f8021376e8;p=emacs.git add comp-emit-narg-prologue --- diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 3ce35983828..0a8ab551ebf 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -701,6 +701,29 @@ the annotation emission." (comp-stack-adjust (- arg)) (comp-copy-slot (+ arg (comp-sp))))))) +(defun comp-emit-narg-prologue (args-min non-rest) + "Emit the prologue for a narg function." + (cl-loop for i below args-min + do (progn + (comp-emit `(set-args-to-local ,i)) + (comp-emit '(inc-args)))) + (cl-loop for i from args-min below non-rest + for bb = (intern (format "entry_%s" i)) + for fallback = (intern (format "entry_fallback_%s" i)) + do (progn + (comp-emit `(cond-jump-narg-leq ,i ,bb ,fallback)) + (comp-mark-block-closed) + (comp-emit-block bb) + (comp-emit `(set-args-to-local ,i)) + (comp-emit '(inc-args))) + finally (comp-emit-jump 'entry_rest_args)) + (cl-loop for i from args-min below non-rest + do (comp-with-sp i + (comp-emit-block (intern (format "entry_fallback_%s" i))) + (comp-emit-set-const nil))) + (comp-emit-block 'entry_rest_args) + (comp-emit `(set-rest-args-to-local ,non-rest))) + (defun comp-limplify (func) "Given FUNC compute its LIMPLE ir." (let* ((frame-size (comp-func-frame-size func)) @@ -720,7 +743,7 @@ the annotation emission." do (cl-incf (comp-sp)) do (comp-emit `(setpar ,(comp-slot) ,i))) (let ((nonrest (comp-nargs-nonrest args))) - (comp-emit `(ncall-prolog ,nonrest)) + (comp-emit-narg-prologue args-min nonrest) (cl-incf (comp-sp) (1+ nonrest)))) ;; Body (comp-emit-block 'bb_1)