From: Alexey Dejneka Date: Sat, 22 May 2004 14:50:03 +0000 (+0000) Subject: 0.8.10.46: X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=43bcf8d9123731a616de9332d247fa6070506054;p=sbcl.git 0.8.10.46: * On X86 remove compiler notes for SXHASH: ... add type declarations for SXHASH-{BIGNUM,INSTANCE}; ... for {SINGLE,DOUBLE}-FLOAT and FIXNUM transforms of SXHASH, coerce signed words to unsigned, so that the compiler can use unsigned modular arithmetic. --- diff --git a/src/code/sxhash.lisp b/src/code/sxhash.lisp index 3ad33ca..c2b7027 100644 --- a/src/code/sxhash.lisp +++ b/src/code/sxhash.lisp @@ -18,7 +18,7 @@ ;;; order to avoid boxing. (deftransform sxhash ((x) (single-float)) '(let* ((val (+ 0.0f0 x)) - (bits (single-float-bits val))) + (bits (logand (single-float-bits val) #.(1- (ash 1 32))))) (logxor 66194023 (sxhash (the fixnum (logand most-positive-fixnum @@ -26,7 +26,7 @@ (ash bits -7)))))))) (deftransform sxhash ((x) (double-float)) '(let* ((val (+ 0.0d0 x)) - (hi (double-float-high-bits val)) + (hi (logand (double-float-high-bits val) #.(1- (ash 1 32)))) (lo (double-float-low-bits val)) (hilo (logxor hi lo))) (logxor 475038542 @@ -39,8 +39,8 @@ ;;; simple. (deftransform sxhash ((x) (fixnum)) '(logand most-positive-fixnum - (logxor (ash (logand x (ash most-positive-fixnum -4)) 4) - (ash x -1) ; to get sign bit into hash + (logxor (ash (logand x (ash most-positive-fixnum -4)) 4) + (logand (ash x -1) most-positive-fixnum) ; to get sign bit into hash 361475658))) ;;; SXHASH of SIMPLE-BIT-VECTOR values is defined as a DEFTRANSFORM @@ -68,7 +68,6 @@ '(- sb!vm:n-word-bits (mod length sb!vm:n-word-bits))))) (%raw-bits x i)))) - (declare (type (unsigned-byte 32) num)) (mix result ,(ecase sb!c:*backend-byte-order* (:little-endian '(logand num most-positive-fixnum)) @@ -76,7 +75,6 @@ '(ash num (- sb!vm:n-lowtag-bits))))))) (declare (type index i end-1)) (let ((num (%raw-bits x i))) - (declare (type (unsigned-byte 32) num)) (mixf result ,(ecase sb!c:*backend-byte-order* (:little-endian '(logand num most-positive-fixnum)) @@ -113,7 +111,7 @@ ;; (which contains NIL itself) is a negative fixnum. (if (= 0 result) (let ((sxhash (%sxhash-simple-string (symbol-name x)))) - ;; We could do a (logor sxhash #x10000000) to ensure + ;; We could do a (logior sxhash #x10000000) to ensure ;; that we never store a 0 in the slot. However, it's ;; such an unlikely event (1/5e8?) that it makes more ;; sense to optimize for the common case... diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 99e0830..55d23c5 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -36,9 +36,10 @@ ;;; * We'd like this to be simple and fast, too. ;;; ;;; FIXME: Should this be INLINE? -(declaim (ftype (function ((and fixnum unsigned-byte) - (and fixnum unsigned-byte)) - (and fixnum unsigned-byte)) mix)) +(declaim (ftype (sfunction ((and fixnum unsigned-byte) + (and fixnum unsigned-byte)) + (and fixnum unsigned-byte)) + mix)) (defun mix (x y) ;; FIXME: We wouldn't need the nasty (SAFETY 0) here if the compiler ;; were smarter about optimizing ASH. (Without the THE FIXNUM below, @@ -89,7 +90,7 @@ (declare (type string string)) (declare (type index count)) (let ((result 0)) - (declare (type (unsigned-byte 32) result)) + (declare (type (unsigned-byte 32) result)) (unless (typep string '(vector nil)) (dotimes (i count) (declare (type index i)) @@ -144,6 +145,12 @@ ;;;; the SXHASH function +;; simple cases +(declaim (ftype (sfunction (integer) (integer 0 #.sb!xc:most-positive-fixnum)) + sxhash-bignum)) +(declaim (ftype (sfunction (t) (integer 0 #.sb!xc:most-positive-fixnum)) + sxhash-instance)) + (defun sxhash (x) ;; profiling SXHASH is hard, but we might as well try to make it go ;; fast, in case it is the bottleneck somwhere. -- CSR, 2003-03-14 diff --git a/version.lisp-expr b/version.lisp-expr index 6f83b1c..a91d167 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.8.10.45" +"0.8.10.46"