X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Farith.impure.lisp;h=00479d45249232df71f4f46d2aa9ea69fdaa2380;hb=6dac5c9af52b4538b412b2e7c22b78863d85557a;hp=668ba38416765c7b15274d86094f66c0667d2bd8;hpb=93ba859423ec6e035a7b22a76a2ac70038691d65;p=sbcl.git diff --git a/tests/arith.impure.lisp b/tests/arith.impure.lisp index 668ba38..00479d4 100644 --- a/tests/arith.impure.lisp +++ b/tests/arith.impure.lisp @@ -6,12 +6,13 @@ ;;;; While most of SBCL is derived from the CMU CL system, the test ;;;; files (like this one) were written from scratch after the fork ;;;; from CMU CL. -;;;; +;;;; ;;;; This software is in the public domain and is provided with ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. (load "assertoid.lisp") +(use-package "ASSERTOID") (defmacro define-compiled-fun (fun name) `(progn @@ -66,5 +67,88 @@ (assert (= (compiled-logxor -6) -6)) (assert (raises-error? (coerce (expt 10 1000) 'single-float) type-error)) + +(defun are-we-getting-ash-right (x y) + (declare (optimize speed) + (type (unsigned-byte 32) x) + (type (integer -40 0) y)) + (ash x y)) +(defun what-about-with-constants (x) + (declare (optimize speed) (type (unsigned-byte 32) x)) + (ash x -32)) + +(dotimes (i 41) + (assert (= (are-we-getting-ash-right (1- (ash 1 32)) (- i)) + (if (< i 32) + (1- (ash 1 (- 32 i))) + 0)))) +(assert (= (what-about-with-constants (1- (ash 1 32))) 0)) + +(defun one-more-test-case-to-catch-sparc (x y) + (declare (optimize speed (safety 0)) + (type (unsigned-byte 32) x) (type (integer -40 2) y)) + (the (unsigned-byte 32) (ash x y))) +(assert (= (one-more-test-case-to-catch-sparc (1- (ash 1 32)) -40) 0)) + + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defvar *n-fixnum-bits* (- sb-vm::n-word-bits sb-vm::n-fixnum-tag-bits)) + (defvar *shifts* (let ((list (list 0 + 1 + (1- sb-vm::n-word-bits) + sb-vm::n-word-bits + (1+ sb-vm::n-word-bits)))) + (append list (mapcar #'- list))))) + +(macrolet ((nc-list () + `(list ,@(loop for i from 0 below (length *shifts*) + collect `(frob (nth ,i *shifts*))))) + (c-list () + `(list ,@(loop for i from 0 below (length *shifts*) + collect `(frob ,(nth i *shifts*)))))) + (defun nc-ash (x) + (macrolet ((frob (y) + `(list x ,y (ash x ,y)))) + (nc-list))) + (defun c-ash (x) + (macrolet ((frob (y) + `(list x ,y (ash x ,y)))) + (c-list))) + (defun nc-modular-ash-ub (x) + (macrolet ((frob (y) + `(list x ,y (logand most-positive-fixnum (ash x ,y))))) + (nc-list))) + (defun c-modular-ash-ub (x) + (declare (type (and fixnum unsigned-byte) x) + (optimize speed)) + (macrolet ((frob (y) + `(list x ,y (logand most-positive-fixnum (ash x ,y))))) + (c-list)))) + +(let* ((values (list 0 1 most-positive-fixnum)) + (neg-values (cons most-negative-fixnum + (mapcar #'- values)))) + (labels ((test (value fun1 fun2) + (let ((res1 (funcall fun1 value)) + (res2 (funcall fun2 value))) + (mapcar (lambda (a b) + (unless (equalp a b) + (error "ash failure for ~A vs ~A: ~A not EQUALP ~A" + fun1 fun2 + a b))) + res1 res2)))) + (loop for x in values do + (test x 'nc-ash 'c-ash) + (test x 'nc-modular-ash-ub 'c-modular-ash-ub)) + (loop for x in neg-values do + (test x 'nc-ash 'c-ash)))) + -(sb-ext:quit :unix-status 104) \ No newline at end of file +(defun 64-bit-logcount (x) + (declare (optimize speed) (type (unsigned-byte 54) x)) + (logcount x)) +(assert (= (64-bit-logcount (1- (ash 1 24))) 24)) +(assert (= (64-bit-logcount (1- (ash 1 32))) 32)) +(assert (= (64-bit-logcount (1- (ash 1 48))) 48)) +(assert (= (64-bit-logcount (1- (ash 1 54))) 54)) +