Commit aa15be08 authored by Christophe Rhodes's avatar Christophe Rhodes
Browse files

0.8.8.23:

	Better %SXHASH-SUBSTRING (patch Juho Snellman sbcl-devel 2004-03-09)
	... frob comments a little
	... make the same FLET workaround in %SXHASH-SIMPLE-SUBSTRING
	... probably fasl-incompatible with 0.8.8.22, but I've already
		changed the fasl version number once this cycle.  Let's
		see if anyone complains :)
	... 20% faster at compiling mk-defsystem on DB's iMac
		(MORE SPEED!)
parent 398c7bf8
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -2327,6 +2327,9 @@ changes in sbcl-0.8.9 relative to sbcl-0.8.8:
    WARNINGs, not just STYLE-WARNINGs, on the assumption that this is
    WARNINGs, not just STYLE-WARNINGs, on the assumption that this is
    more often programmer error than deliberate exploitation of undefined
    more often programmer error than deliberate exploitation of undefined
    behaviour.
    behaviour.
  * optimization: the hash algorithm for strings has changed to one
    that is less vulnerable to spurious collisions.  (thanks to Juho
    Snellman)
  * optimization: implemented multiplication as a modular
  * optimization: implemented multiplication as a modular
    (UNSIGNED-BYTE 32) operation on the PPC backend.
    (UNSIGNED-BYTE 32) operation on the PPC backend.
  * fixed some bugs revealed by Paul Dietz' test suite:
  * fixed some bugs revealed by Paul Dietz' test suite:
+42 −11
Original line number Original line Diff line number Diff line
@@ -70,25 +70,46 @@


;;;; hashing strings
;;;; hashing strings
;;;;
;;;;
;;;; Note that this operation is used in compiler symbol table lookups, so we'd
;;;; Note that this operation is used in compiler symbol table
;;;; like it to be fast.
;;;; lookups, so we'd like it to be fast.
;;;;
;;;; As of 2004-03-10, we implement the one-at-a-time algorithm
;;;; designed by Bob Jenkins (see
;;;; <http://burtleburtle.net/bob/hash/doobs.html> for some more
;;;; information).


#!-sb-fluid (declaim (inline %sxhash-substring))
#!-sb-fluid (declaim (inline %sxhash-substring))
(defun %sxhash-substring (string &optional (count (length string)))
(defun %sxhash-substring (string &optional (count (length string)))
  ;; FIXME: As in MIX above, we wouldn't need (SAFETY 0) here if the
  ;; FIXME: As in MIX above, we wouldn't need (SAFETY 0) here if the
  ;; cross-compiler were smarter about ASH, but we need it for sbcl-0.5.0m.
  ;; cross-compiler were smarter about ASH, but we need it for
  ;; sbcl-0.5.0m.  (probably no longer true?  We might need SAFETY 0
  ;; to elide some type checks, but then again if this is inlined in
  ;; all the critical places, we might not -- CSR, 2004-03-10)
  (declare (optimize (speed 3) (safety 0)))
  (declare (optimize (speed 3) (safety 0)))
  (declare (type string string))
  (declare (type string string))
  (declare (type index count))
  (declare (type index count))
  (let ((result 408967240))
  (let ((result 0))
    (declare (type fixnum result))
    (declare (type (unsigned-byte 32) result))    
    (unless (typep string '(vector nil))
    (unless (typep string '(vector nil))
      (dotimes (i count)
      (dotimes (i count)
	(declare (type index i))
	(declare (type index i))
	(mixf result
	(setf result
	      (the fixnum
	      (ldb (byte 32 0)
		(ash (char-code (aref string i)) 5)))))
		   (+ result (char-code (aref string i)))))
    result))
	(setf result
	      (ldb (byte 32 0)
		   (+ result (ash result 10))))
	(setf result
	      (logxor result (ash result -6)))))
    (setf result
	  (ldb (byte 32 0)
	       (+ result (ash result 3))))
    (setf result
	  (logxor result (ash result -11)))
    (setf result
	  (ldb (byte 32 0)
	       (logxor result (ash result 15))))
    (logand result most-positive-fixnum)))
;;; test:
;;; test:
;;;   (let ((ht (make-hash-table :test 'equal)))
;;;   (let ((ht (make-hash-table :test 'equal)))
;;;     (do-all-symbols (symbol)
;;;     (do-all-symbols (symbol)
@@ -103,13 +124,23 @@
(defun %sxhash-simple-string (x)
(defun %sxhash-simple-string (x)
  (declare (optimize speed))
  (declare (optimize speed))
  (declare (type simple-string x))
  (declare (type simple-string x))
  (%sxhash-substring x))
  ;; KLUDGE: this FLET is a workaround (suggested by APD) for presence
  ;; of let conversion in the cross compiler, which otherwise causes
  ;; strongly suboptimal register allocation.
  (flet ((trick (x)
           (%sxhash-substring x)))
    (declare (notinline trick))
    (trick x)))


(defun %sxhash-simple-substring (x count)
(defun %sxhash-simple-substring (x count)
  (declare (optimize speed))
  (declare (optimize speed))
  (declare (type simple-string x))
  (declare (type simple-string x))
  (declare (type index count))
  (declare (type index count))
  (%sxhash-substring x count))
  ;; see comment in %SXHASH-SIMPLE-STRING
  (flet ((trick (x count)
	   (%sxhash-substring x count)))
    (declare (notinline trick))
    (trick x count)))


;;;; the SXHASH function
;;;; the SXHASH function


+1 −1
Original line number Original line Diff line number Diff line
@@ -17,4 +17,4 @@
;;; checkins which aren't released. (And occasionally for internal
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
"0.8.8.22"
"0.8.8.23"