Fix make-array transforms.
[sbcl.git] / src / code / sxhash.lisp
index dde2e15..6b09f00 100644 (file)
 ;;; 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.
         ((= 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
                                (: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))