ensure-directories-exist: Signal an error when trying to create a
[sbcl.git] / src / assembly / x86-64 / arith.lisp
index b6a1934..684d16e 100644 (file)
                 (inst ret)
 
                 DO-STATIC-FUN
+                ;; Same as: (inst enter (* n-word-bytes 1))
                 (inst push rbp-tn)
-                (inst lea rbp-tn (make-ea :qword
-                                          :base rsp-tn
-                                          :disp (* 2 n-word-bytes)))
-                (inst sub rsp-tn (fixnumize 1))
-                (inst push (make-ea :qword :base rbp-tn :disp (- n-word-bytes)))
+                (inst mov rbp-tn rsp-tn)
+                (inst sub rsp-tn (* n-word-bytes 1))
+                (inst push (make-ea :qword :base rbp-tn
+                            :disp (frame-byte-offset return-pc-save-offset)))
                 (inst mov rcx (fixnumize 2)) ; arg count
                 (inst jmp
                       (make-ea :qword
                                         (static-fun-offset
                                          ',(symbolicate "TWO-ARG-" fun))))))))
 
+  #.`
   (define-generic-arith-routine (+ 10)
     (move res x)
     (inst add res y)
     (inst jmp :no OKAY)
-    (inst rcr res 1)                  ; carry has correct sign
-    (inst sar res 2)                  ; remove type bits
+    ;; Unbox the overflowed result, recovering the correct sign from
+    ;; the carry flag, then re-box as a bignum.
+    (inst rcr res 1)
+    ,@(when (> n-fixnum-tag-bits 1)   ; don't shift by 0
+            '((inst sar res (1- n-fixnum-tag-bits))))
 
     (move rcx res)
 
 
     OKAY)
 
+  #.`
   (define-generic-arith-routine (- 10)
     (move res x)
     (inst sub res y)
     (inst jmp :no OKAY)
+    ;; Unbox the overflowed result, recovering the correct sign from
+    ;; the carry flag, then re-box as a bignum.
     (inst cmc)                        ; carry has correct sign now
     (inst rcr res 1)
-    (inst sar res 2)                  ; remove type bits
+    ,@(when (> n-fixnum-tag-bits 1)   ; don't shift by 0
+            '((inst sar res (1- n-fixnum-tag-bits))))
 
     (move rcx res)
 
   (inst jmp :z FIXNUM)
 
   (inst push rbp-tn)
-  (inst lea rbp-tn (make-ea :qword :base rsp-tn :disp (* 2 n-word-bytes)))
-  (inst sub rsp-tn (fixnumize 1))
-  (inst push (make-ea :qword :base rbp-tn :disp (- n-word-bytes)))
+  (inst mov rbp-tn rsp-tn)
+  (inst sub rsp-tn (* n-word-bytes 1))
+  (inst push (make-ea :qword :base rbp-tn
+                      :disp (frame-byte-offset return-pc-save-offset)))
   (inst mov rcx (fixnumize 1))    ; arg count
   (inst jmp (make-ea :qword
                      :disp (+ nil-value (static-fun-offset '%negate))))
                 (inst ret)
 
                 DO-STATIC-FUN
-                (move rcx rsp-tn)
-                (inst sub rsp-tn (fixnumize 3))
-                (inst mov (make-ea :qword
-                                   :base rcx
-                                   :disp (frame-byte-offset ocfp-save-offset))
+                (inst sub rsp-tn (* n-word-bytes 3))
+                (inst mov (make-ea :qword :base rsp-tn
+                                   :disp (frame-byte-offset
+                                          (+ sp->fp-offset
+                                             -3
+                                             ocfp-save-offset)))
                       rbp-tn)
-                (move rbp-tn rcx)
+                (inst lea rbp-tn (make-ea :qword :base rsp-tn
+                                          :disp (frame-byte-offset
+                                          (+ sp->fp-offset
+                                             -3
+                                             ocfp-save-offset))))
                 (inst mov rcx (fixnumize 2))
                 (inst call (make-ea :qword
                                     :disp (+ nil-value
   (inst ret)
 
   DO-STATIC-FUN
-  (move rcx rsp-tn)
-  (inst sub rsp-tn (fixnumize 3))
-  (inst mov (make-ea :qword
-                     :base rcx
-                     :disp (frame-byte-offset ocfp-save-offset))
+  (inst sub rsp-tn (* n-word-bytes 3))
+  (inst mov (make-ea :qword :base rsp-tn
+                     :disp (frame-byte-offset
+                            (+ sp->fp-offset
+                               -3
+                               ocfp-save-offset)))
         rbp-tn)
-  (move rbp-tn rcx)
+  (inst lea rbp-tn (make-ea :qword :base rsp-tn
+                            :disp (frame-byte-offset
+                                   (+ sp->fp-offset
+                                      -3
+                                      ocfp-save-offset))))
   (inst mov rcx (fixnumize 2))
   (inst call (make-ea :qword
                       :disp (+ nil-value (static-fun-offset 'eql))))
   (inst ret)
 
   DO-STATIC-FUN
-  (move rcx rsp-tn)
-  (inst sub rsp-tn (fixnumize 3))
-  (inst mov (make-ea :qword
-                     :base rcx
-                     :disp (frame-byte-offset ocfp-save-offset))
+  (inst sub rsp-tn (* n-word-bytes 3))
+  (inst mov (make-ea :qword :base rsp-tn
+                     :disp (frame-byte-offset
+                            (+ sp->fp-offset
+                               -3
+                               ocfp-save-offset)))
         rbp-tn)
-  (move rbp-tn rcx)
+  (inst lea rbp-tn (make-ea :qword :base rsp-tn
+                            :disp (frame-byte-offset
+                                   (+ sp->fp-offset
+                                      -3
+                                      ocfp-save-offset))))
+
   (inst mov rcx (fixnumize 2))
   (inst call (make-ea :qword
                       :disp (+ nil-value (static-fun-offset 'two-arg-=))))