(assert (<= exact-q q))
(assert (< q (1+ exact-q))))))
-;; CEILING had a corner case, spotted by Paul Dietz
+;;; CEILING had a corner case, spotted by Paul Dietz
(assert (= (ceiling most-negative-fixnum (1+ most-positive-fixnum)) -1))
+
+;;; give any optimizers of constant multiplication a light testing.
+;;; 100 may seem low, but (a) it caught CSR's initial errors, and (b)
+;;; before checking in, CSR tested with 10000. So one hundred
+;;; checkins later, we'll have doubled the coverage.
+(dotimes (i 100)
+ (let* ((x (random most-positive-fixnum))
+ (x2 (* x 2))
+ (x3 (* x 3)))
+ (let ((fn (handler-bind ((sb-ext:compiler-note #'error))
+ (compile nil
+ `(lambda (y)
+ (declare (optimize speed) (type (integer 0 3) y))
+ (* y ,x))))))
+ (unless (and (= (funcall fn 0) 0)
+ (= (funcall fn 1) x)
+ (= (funcall fn 2) x2)
+ (= (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)))