1.0.10.35: fix sb-posix test on linux
[sbcl.git] / src / compiler / x86-64 / arith.lisp
index 37cc2a2..1f63042 100644 (file)
            (inst lea result (make-ea :qword :index number :scale 8)))
           (t
            (move result number)
-           (cond ((plusp amount)
-                  ;; We don't have to worry about overflow because of the
-                  ;; result type restriction.
-                  (inst shl result amount))
-                 (t
-                  ;; Since the shift instructions take the shift amount
-                  ;; modulo 64 we must special case amounts of 64 and more.
-                  ;; Because fixnums have only 61 bits, the result is 0 or
-                  ;; -1 for all amounts of 60 or more, so use this as the
-                  ;; limit instead.
-                  (inst sar result (min (- n-word-bits n-fixnum-tag-bits 1)
-                                        (- amount)))
-                  (inst and result (lognot fixnum-tag-mask))))))))
+           (cond ((< -64 amount 64)
+                  ;; this code is used both in ASH and ASH-SMOD61, so
+                  ;; be careful
+                  (if (plusp amount)
+                      (inst shl result amount)
+                      (progn
+                        (inst sar result (- amount))
+                        (inst and result (lognot fixnum-tag-mask)))))
+                 ((plusp amount)
+                  (if (sc-is result any-reg)
+                      (inst xor result result)
+                      (inst mov result 0)))
+                 (t (inst sar result 63)
+                    (inst and result (lognot fixnum-tag-mask))))))))
 
 (define-vop (fast-ash-left/fixnum=>fixnum)
   (:translate ash)
                                         (sc-is r signed-stack))
                                     (location= x r)))))
      (:info y)
-     (:arg-types untagged-num (:constant (or (unsigned-byte 64) (signed-byte 64))))
+     (:arg-types untagged-num (:constant (or (unsigned-byte 31) (signed-byte 32))))
      (:results (r :scs (unsigned-reg signed-reg) :from (:argument 0)
                   :load-if (not (and (or (sc-is x unsigned-stack)
                                          (sc-is x signed-stack))
 
 (define-full-reffer bignum-ref * bignum-digits-offset other-pointer-lowtag
   (unsigned-reg) unsigned-num sb!bignum:%bignum-ref)
-
+(define-full-reffer+offset bignum--ref-with-offset * bignum-digits-offset
+  other-pointer-lowtag (unsigned-reg) unsigned-num
+  sb!bignum:%bignum-ref-with-offset)
 (define-full-setter bignum-set * bignum-digits-offset other-pointer-lowtag
   (unsigned-reg) unsigned-num sb!bignum:%bignum-set)