Microoptimise TN-LEXICAL-DEPTH
[sbcl.git] / src / compiler / x86 / static-fn.lisp
index cf8fdc5..ba7a40e 100644 (file)
@@ -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))
 
                (<= 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))))
         (: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:
                      (default-unknown-values
                          vop
                          ,(if (zerop num-results) nil 'values)
-                       ,num-results)))
+                       ,num-results
+                       ,node)))
          ,@(moves (result-names) (temp-names)))))))
 
 ) ; EVAL-WHEN