defmethod: make the function known at compile time.
[sbcl.git] / src / assembly / x86 / arith.lisp
index 28d510f..ea10b50 100644 (file)
@@ -21,9 +21,7 @@
                                         (:policy :safe)
                                         (:save-p t))
                 ((:arg x (descriptor-reg any-reg) edx-offset)
-                 (:arg y (descriptor-reg any-reg)
-                       ;; this seems wrong esi-offset -- FIXME: What's it mean?
-                       edi-offset)
+                 (:arg y (descriptor-reg any-reg) edi-offset)
 
                  (:res res (descriptor-reg any-reg) edx-offset)
 
                 (inst ret)
 
                 DO-STATIC-FUN
+                ;; Same as: (inst enter (fixnumize 1))
                 (inst push ebp-tn)
-                (inst lea ebp-tn (make-ea :dword
-                                          :base esp-tn
-                                          :disp (* 2 n-word-bytes)))
+                (inst mov ebp-tn esp-tn)
                 (inst sub esp-tn (fixnumize 1))
-                (inst push (make-ea :dword :base ebp-tn :disp (- n-word-bytes)))
+                (inst push (make-ea :dword :base ebp-tn
+                            :disp (frame-byte-offset return-pc-save-offset)))
                 (inst mov ecx (fixnumize 2)) ; arg count
                 (inst jmp
                       (make-ea :dword
   (inst jmp :z FIXNUM)
 
   (inst push ebp-tn)
-  (inst lea ebp-tn (make-ea :dword :base esp-tn :disp (* 2 n-word-bytes)))
+  (inst mov ebp-tn esp-tn)
   (inst sub esp-tn (fixnumize 1))
-  (inst push (make-ea :dword :base ebp-tn :disp (- n-word-bytes)))
+  (inst push (make-ea :dword :base ebp-tn
+                      :disp (frame-byte-offset return-pc-save-offset)))
   (inst mov ecx (fixnumize 1))    ; arg count
   (inst jmp (make-ea :dword
                      :disp (+ nil-value (static-fun-offset '%negate))))
                 (inst ret)
 
                 DO-STATIC-FUN
-                (move ecx esp-tn)
+                (inst push ebp-tn)
+                (inst mov ebp-tn esp-tn)
                 (inst sub esp-tn (fixnumize 3))
-                (inst mov (make-ea :dword
-                                   :base ecx
-                                   :disp (frame-byte-offset ocfp-save-offset))
+                (inst mov (make-ea :dword :base esp-tn
+                                   :disp (frame-byte-offset
+                                          (+ sp->fp-offset
+                                             -3
+                                             ocfp-save-offset)))
                       ebp-tn)
-                (move ebp-tn ecx)
+                (inst lea ebp-tn (make-ea :dword :base esp-tn
+                                          :disp (frame-byte-offset
+                                          (+ sp->fp-offset
+                                             -3
+                                             ocfp-save-offset))))
                 (inst mov ecx (fixnumize 2))
                 (inst call (make-ea :dword
                                     :disp (+ nil-value
                     (:l `((inst mov y (1+ nil-value))
                           (inst cmp y x)))
                     (:g `((inst cmp x (1+ nil-value)))))
+                (inst pop ebp-tn)
                 (inst ret))
              #-sb-assembling
              `(define-vop (,name)
                 (:temporary (:sc unsigned-reg :offset edi-offset
                                  :from (:argument 1))
                             edi)
-
-                (:temporary (:sc unsigned-reg :offset ecx-offset
-                                 :from :eval)
-                            ecx)
                 (:conditional ,test)
                 (:generator 10
                    (move edx x)
                    (move edi y)
-                   (inst lea ecx (make-ea :dword
-                                          :disp (make-fixup ',name :assembly-routine)))
-                   (inst call ecx)))))
+                   (inst call (make-fixup ',name :assembly-routine))))))
 
   (define-cond-assem-rtn generic-< < two-arg-< :l)
   (define-cond-assem-rtn generic-> > two-arg-> :g))
   (inst cmp ecx other-pointer-lowtag)
   (inst jmp :e DO-STATIC-FUN)
 
-  ;; Not both other pointers
+  ;; At least one fixnum
   (inst cmp x y)
   RET
   (inst ret)
   (inst cmp x y)
   (inst jmp :e RET)
 
-  (move ecx esp-tn)
+  (inst push ebp-tn)
+  (inst mov ebp-tn esp-tn)
   (inst sub esp-tn (fixnumize 3))
-  (inst mov (make-ea :dword
-                     :base ecx
-                     :disp (frame-byte-offset ocfp-save-offset))
+  (inst mov (make-ea :dword :base esp-tn
+                     :disp (frame-byte-offset
+                            (+ sp->fp-offset
+                               -3
+                               ocfp-save-offset)))
         ebp-tn)
-  (move ebp-tn ecx)
+  (inst lea ebp-tn (make-ea :dword :base esp-tn
+                            :disp (frame-byte-offset
+                                   (+ sp->fp-offset
+                                      -3
+                                      ocfp-save-offset))))
   (inst mov ecx (fixnumize 2))
   (inst call (make-ea :dword
                       :disp (+ nil-value (static-fun-offset 'eql))))
   (load-symbol y t)
   (inst cmp x y)
+  (inst pop ebp-tn)
   (inst ret))
 
 #-sb-assembling
                :from (:argument 1))
               edi)
 
-  (:temporary (:sc unsigned-reg :offset ecx-offset
-               :from :eval)
-              ecx)
   (:conditional :e)
   (:generator 10
     (move edx x)
     (move edi y)
-    (inst lea ecx (make-ea :dword
-                           :disp (make-fixup 'generic-eql :assembly-routine)))
-    (inst call ecx)))
+    (inst call (make-fixup 'generic-eql :assembly-routine))))
 
 #+sb-assembling
 (define-assembly-routine (generic-=
   (inst ret)
 
   DO-STATIC-FUN
-  (move ecx esp-tn)
+  (inst push ebp-tn)
+  (inst mov ebp-tn esp-tn)
   (inst sub esp-tn (fixnumize 3))
-  (inst mov (make-ea :dword
-                     :base ecx
-                     :disp (frame-byte-offset ocfp-save-offset))
+  (inst mov (make-ea :dword :base esp-tn
+                     :disp (frame-byte-offset
+                            (+ sp->fp-offset
+                               -3
+                               ocfp-save-offset)))
         ebp-tn)
-  (move ebp-tn ecx)
+  (inst lea ebp-tn (make-ea :dword :base esp-tn
+                            :disp (frame-byte-offset
+                                   (+ sp->fp-offset
+                                      -3
+                                      ocfp-save-offset))))
   (inst mov ecx (fixnumize 2))
   (inst call (make-ea :dword
                       :disp (+ nil-value (static-fun-offset 'two-arg-=))))
   (load-symbol y t)
   (inst cmp x y)
+  (inst pop ebp-tn)
   (inst ret))
 
 #-sb-assembling
                :from (:argument 1))
               edi)
 
-  (:temporary (:sc unsigned-reg :offset ecx-offset
-               :from :eval)
-              ecx)
   (:conditional :e)
   (:generator 10
     (move edx x)
     (move edi y)
-    (inst lea ecx (make-ea :dword
-                           :disp (make-fixup 'generic-= :assembly-routine)))
-    (inst call ecx)))
+    (inst call (make-fixup 'generic-= :assembly-routine))))
 
 \f
 ;;; Support for the Mersenne Twister, MT19937, random number generator