X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Fstatic-fn.lisp;h=ba7a40e21c32e6ed06832d49aca6a294abad32ad;hb=0d51ca7e5e624dc3bad5c87e14211e8e6f7b3a45;hp=cf8fdc5858f384d38f0af59726127317091652a9;hpb=0d871fd7a98fc4af92a8b942a1154761466ad8c9;p=sbcl.git diff --git a/src/compiler/x86/static-fn.lisp b/src/compiler/x86/static-fn.lisp index cf8fdc5..ba7a40e 100644 --- a/src/compiler/x86/static-fn.lisp +++ b/src/compiler/x86/static-fn.lisp @@ -16,9 +16,6 @@ (:policy :safe) (:variant-vars function) (:vop-var vop) - (:node-var node) - (:temporary (:sc unsigned-reg :offset ebx-offset - :from (:eval 0) :to (:eval 2)) ebx) (:temporary (:sc unsigned-reg :offset ecx-offset :from (:eval 0) :to (:eval 2)) ecx)) @@ -41,7 +38,12 @@ (<= num-results register-arg-count)) (error "either too many args (~W) or too many results (~W); max = ~W" num-args num-results register-arg-count)) - (let ((num-temps (max num-args num-results))) + (let ((num-temps (max num-args num-results)) + (node (sb!xc:gensym "NODE")) + (new-ebp-ea + '(make-ea :dword + :disp (frame-byte-offset (+ sp->fp-offset -3 ocfp-save-offset)) + :base esp-tn))) (collect ((temp-names) (temps) (arg-names) (args) (result-names) (results)) (dotimes (i num-results) (let ((result-name (intern (format nil "RESULT-~D" i)))) @@ -72,30 +74,25 @@ (:args ,@(args)) ,@(temps) (:results ,@(results)) + (:node-var ,node) (:generator ,(+ 50 num-args num-results) ,@(moves (temp-names) (arg-names)) - ;; If speed not more important than size, duplicate the + ;; If speed is at least as important as size, duplicate the ;; effect of the ENTER with discrete instructions. Takes - ;; 2+1+3+2=8 bytes as opposed to 4+3=7 bytes. - (cond ((policy node (>= speed space)) - (inst mov ebx esp-tn) - ;; Save the old-fp - (inst push ebp-tn) - ;; Ensure that at least three slots are available; one - ;; above, two more needed. - (inst sub esp-tn (fixnumize 2)) - (inst mov ebp-tn ebx)) + ;; 3+4+4=11 bytes as opposed to 1+4=5 bytes. + (cond ((policy ,node (>= speed space)) + (inst sub esp-tn ,(fixnumize 3)) + (inst mov ,new-ebp-ea ebp-tn) + (inst lea ebp-tn ,new-ebp-ea)) (t - (inst enter (fixnumize 2)) - ;; The enter instruction pushes EBP and then copies - ;; ESP into EBP. We want the new EBP to be the - ;; original ESP, so we fix it up afterwards. - (inst add ebp-tn (fixnumize 1)))) + ;; Dummy for return address. + (inst push ebp-tn) + (inst enter ,(fixnumize 1)))) ,(if (zerop num-args) '(inst xor ecx ecx) - `(inst mov ecx (fixnumize ,num-args))) + `(inst mov ecx ,(fixnumize num-args))) (note-this-location vop :call-site) ;; Old CMU CL comment: @@ -129,7 +126,8 @@ (default-unknown-values vop ,(if (zerop num-results) nil 'values) - ,num-results))) + ,num-results + ,node))) ,@(moves (result-names) (temp-names))))))) ) ; EVAL-WHEN