-
-\f
-;;;; Hash primitives
-#|
-#+sb-assembling
-(defparameter sxhash-simple-substring-entry (gen-label))
-
-(define-assembly-routine (sxhash-simple-string
- (:translate %sxhash-simple-string)
- (:policy :fast-safe)
- (:result-types positive-fixnum))
- ((:arg string descriptor-reg a0-offset)
- (:res result any-reg a0-offset)
-
- (:temp length any-reg a1-offset)
- (:temp accum non-descriptor-reg nl0-offset)
- (:temp data non-descriptor-reg nl1-offset)
- (:temp temp non-descriptor-reg nl2-offset)
- (:temp offset non-descriptor-reg nl3-offset))
-
- (declare (ignore result accum data temp offset))
-
- (loadw length string sb!vm:vector-length-slot sb!vm:other-pointer-lowtag)
- (inst b sxhash-simple-substring-entry))
-
-
-(define-assembly-routine (sxhash-simple-substring
- (:translate %sxhash-simple-substring)
- (:policy :fast-safe)
- (:arg-types * positive-fixnum)
- (:result-types positive-fixnum))
- ((:arg string descriptor-reg a0-offset)
- (:arg length any-reg a1-offset)
- (:res result any-reg a0-offset)
-
- (:temp accum non-descriptor-reg nl0-offset)
- (:temp data non-descriptor-reg nl1-offset)
- (:temp temp non-descriptor-reg nl2-offset)
- (:temp offset non-descriptor-reg nl3-offset))
- (emit-label sxhash-simple-substring-entry)
-
- (inst li offset (- (* vector-data-offset n-word-bytes) other-pointer-lowtag))
- (move accum zero-tn)
- (inst b test)
-
- LOOP
-
- (inst xor accum accum data)
- (inst slwi temp accum 27)
- (inst srwi accum accum 5)
- (inst or accum accum temp)
- (inst addi offset offset 4)
-
- TEST
-
- (inst subic. length length (fixnumize 4))
- (inst lwzx data string offset)
- (inst bge loop)
-
- (inst addic. length length (fixnumize 4))
- (inst neg length length)
- (inst beq done)
- (inst slwi length length 1)
- (inst srw data data length)
- (inst xor accum accum data)
-
- DONE
-
- (inst slwi result accum 5)
- (inst srwi result result 3))
-|#
\ No newline at end of file