0.8.10.46:
authorAlexey Dejneka <adejneka@comail.ru>
Sat, 22 May 2004 14:50:03 +0000 (14:50 +0000)
committerAlexey Dejneka <adejneka@comail.ru>
Sat, 22 May 2004 14:50:03 +0000 (14:50 +0000)
        * 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.

src/code/sxhash.lisp
src/code/target-sxhash.lisp
version.lisp-expr

index 3ad33ca..c2b7027 100644 (file)
@@ -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))
        ;; (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...
index 99e0830..55d23c5 100644 (file)
 ;;;   * 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))
 \f
 ;;;; 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
index 6f83b1c..a91d167 100644 (file)
@@ -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"