0.8.3.54:
[sbcl.git] / tests / arith.pure.lisp
index de583e5..3452abe 100644 (file)
   (assert (= (gcd 0 x) (abs x))))
 ;;; LCM returns a non-negative number
 (assert (= (lcm 4 -10) 20))
+(assert (= (lcm 0 0) 0))
+
+;;; PPC bignum arithmetic bug:
+(multiple-value-bind (quo rem)
+    (truncate 291351647815394962053040658028983955 10000000000000000000000000)
+  (assert (= quo 29135164781))
+  (assert (= rem 5394962053040658028983955)))
+
+;;; x86 LEA bug:
+(assert (= (funcall
+           (compile nil '(lambda (x) (declare (bit x)) (+ x #xf0000000)))
+           1)
+          #xf0000001))
+
+;;; LOGBITP on bignums:
+(dolist (x '(((1+ most-positive-fixnum) 1 nil)
+            ((1+ most-positive-fixnum) -1 t)
+            ((1+ most-positive-fixnum) (1+ most-positive-fixnum) nil)
+            ((1+ most-positive-fixnum) (1- most-negative-fixnum) t)
+            (1 (ash most-negative-fixnum 1) nil)
+            (29 most-negative-fixnum t)
+            (30 (ash most-negative-fixnum 1) t)
+            (31 (ash most-negative-fixnum 1) t)
+            (64 (ash most-negative-fixnum 36) nil)
+            (65 (ash most-negative-fixnum 36) t)))
+  (destructuring-bind (index int result) x
+    (assert (eq (eval `(logbitp ,index ,int)) result))))
+
+;;; off-by-1 type inference error for %DPB and %DEPOSIT-FIELD:
+(let ((f (compile nil '(lambda (b)
+                        (integer-length (dpb b (byte 4 28) -1005))))))
+  (assert (= (funcall f 1230070) 32)))
+(let ((f (compile nil '(lambda (b)
+                        (integer-length (deposit-field b (byte 4 28) -1005))))))
+  (assert (= (funcall f 1230070) 32)))