0.8.3.56:
[sbcl.git] / tests / arith.pure.lisp
index 3fc39fc..841f6ef 100644 (file)
                   (= (funcall fn 3) x3))
        (error "bad results for ~D" x)))))
 
+;;; Bugs reported by Paul Dietz:
+
 ;;; (GCD 0 x) must return (abs x)
 (dolist (x (list -10 (* 3 most-negative-fixnum)))
   (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)))
+
+;;; type inference leading to an internal compiler error:
+(let ((f (compile nil '(lambda (x)
+                       (declare (type fixnum x))
+                       (ldb (byte 0 0) x)))))
+  (assert (= (funcall f 1) 0))
+  (assert (= (funcall f most-positive-fixnum) 0))
+  (assert (= (funcall f -1) 0)))