diff --git a/ansi-tests/logbitp.lsp b/ansi-tests/logbitp.lsp index fe6a973ad764fa626f0672b7a481c39171eac39a..85abdce21b458f7d7f8bcd443528603f3a3b7ee2 100644 --- a/ansi-tests/logbitp.lsp +++ b/ansi-tests/logbitp.lsp @@ -61,6 +61,22 @@ (notnot-mv (logbitp (1+ most-positive-fixnum) -1)) t) +(deftest logbitp.7 + (loop for len = (random 100) + for i = (random-from-interval (ash 1 len)) + for k = (random (1+ len)) + repeat 1000 + unless (if (ldb-test (byte 1 k) i) + (logbitp k i) + (not (logbitp k i))) + collect (list i k)) + nil) + +(deftest logbitp.8 + (loop for k from 1 to 1000 + always (logbitp k -1)) + t) + (deftest logbitp.order.1 (let ((i 0) a b) (values diff --git a/ansi-tests/numbers-aux.lsp b/ansi-tests/numbers-aux.lsp index 182ddd3d5ddeeeb95a1fd8472c80b6387add96ed..ead2e2bf688989c503a04c594a15bd1e1b6d8e23 100644 --- a/ansi-tests/numbers-aux.lsp +++ b/ansi-tests/numbers-aux.lsp @@ -249,3 +249,35 @@ ;;; Approximate equality function (defun approx= (x y &optional (eps (epsilon x))) (<= (abs (/ (- x y) (max (abs x) 1))) eps)) + +(defun test-log-op-with-decls (op xlo xhi ylo yhi niters + &optional + (decls '((optimize (speed 3) (safety 1) + (debug 1))))) + "Test that a compiled form of the LOG* function OP computes + the expected result on two random integers drawn from the + types `(integer ,xlo ,xhi) and `(integer ,ylo ,yhi). Try + niters choices. Return a list of pairs on which the test fails." + + (assert (symbolp op)) + (assert (integerp xlo)) + (assert (integerp xhi)) + (assert (integerp ylo)) + (assert (integerp yhi)) + (assert (integerp niters)) + (assert (<= xlo xhi)) + (assert (<= ylo yhi)) + + (let* ((source + `(lambda (x y) + (declare (type (integer ,xlo ,xhi) x) + (type (integer ,ylo ,yhi) y) + ,@ decls) + (,op x y))) + (fn (compile nil source))) + (loop for i below niters + for x = (random-from-interval xhi xlo) + for y = (random-from-interval yhi ylo) + unless (eql (funcall (the symbol op) x y) + (funcall fn x y)) + collect (list x y))))