X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fsxhash.lisp;h=6b09f004a8e8cf8ab3db021da263b7cfc7be1912;hb=HEAD;hp=dde2e15f1b1cfb2d4edea8b7600ea8d877e5f458;hpb=9109df608080457c2fb2437c7eb5b9af23fe6cf2;p=sbcl.git diff --git a/src/code/sxhash.lisp b/src/code/sxhash.lisp index dde2e15..6b09f00 100644 --- a/src/code/sxhash.lisp +++ b/src/code/sxhash.lisp @@ -38,10 +38,9 @@ ;;; SXHASH of FIXNUM values is defined as a DEFTRANSFORM because it's so ;;; simple. (deftransform sxhash ((x) (fixnum)) - '(logand most-positive-fixnum - (logxor (ash (logand x (ash most-positive-fixnum -4)) 4) - (logand (ash x -1) most-positive-fixnum) ; to get sign bit into hash - 361475658))) + (let ((c (logand 1193941380939624010 sb!xc:most-positive-fixnum))) + ;; shift by -1 to get sign bit into hash + `(logand (logxor (ash x 4) (ash x -1) ,c) sb!xc:most-positive-fixnum))) ;;; SXHASH of SIMPLE-BIT-VECTOR values is defined as a DEFTRANSFORM ;;; because it is endian-dependent. @@ -53,11 +52,10 @@ ((= length 0) (mix result (sxhash 0))) (t (mixf result (sxhash (length x))) - (do* ((i sb!vm:vector-data-offset (+ i 1)) + (do* ((i 0 (+ i 1)) ;; FIXME: should we respect DEPTHOID? SXHASH on ;; strings doesn't seem to... - (end-1 (+ sb!vm:vector-data-offset - (floor (1- length) sb!vm:n-word-bits)))) + (end-1 (floor (1- length) sb!vm:n-word-bits))) ((= i end-1) (let ((num (logand @@ -67,14 +65,14 @@ (:big-endian '(- sb!vm:n-word-bits (mod length sb!vm:n-word-bits))))) - (%raw-bits x i)))) + (%vector-raw-bits x i)))) (mix result ,(ecase sb!c:*backend-byte-order* (:little-endian '(logand num most-positive-fixnum)) (:big-endian '(ash num (- sb!vm:n-lowtag-bits))))))) (declare (type index i end-1)) - (let ((num (%raw-bits x i))) + (let ((num (%vector-raw-bits x i))) (mixf result ,(ecase sb!c:*backend-byte-order* (:little-endian '(logand num most-positive-fixnum))