From 0de1a79b30396609e8a92fabfc2ea4f3e51a9c54 Mon Sep 17 00:00:00 2001 From: wlott <wlott> Date: Fri, 30 Nov 1990 16:45:44 +0000 Subject: [PATCH] Rewrote sxhash-simple-substring so that is it much faster (and works). --- assembly/sparc/array.lisp | 103 ++++++++------------------------------ 1 file changed, 22 insertions(+), 81 deletions(-) diff --git a/assembly/sparc/array.lisp b/assembly/sparc/array.lisp index 24ed08180..c7e972aa7 100644 --- a/assembly/sparc/array.lisp +++ b/assembly/sparc/array.lisp @@ -7,7 +7,7 @@ ;;; Scott Fahlman (FAHLMAN@CMUC). ;;; ********************************************************************** ;;; -;;; $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/assembly/sparc/array.lisp,v 1.1 1990/11/22 11:50:40 wlott Exp $ +;;; $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/assembly/sparc/array.lisp,v 1.2 1990/11/30 16:45:44 wlott Exp $ ;;; ;;; This file contains the support routines for arrays and vectors. ;;; @@ -54,18 +54,16 @@ ((:arg string descriptor-reg a0-offset) (:res result any-reg a0-offset) - (:temp lip interior-reg lip-offset) (:temp length any-reg a1-offset) (:temp accum non-descriptor-reg nl0-offset) (:temp data non-descriptor-reg nl1-offset) - (:temp byte non-descriptor-reg nl2-offset) - (:temp retaddr non-descriptor-reg nl3-offset)) + (:temp temp non-descriptor-reg nl2-offset) + (:temp offset non-descriptor-reg nl3-offset)) - (declare (ignore result lip accum data byte retaddr)) + (declare (ignore result accum data temp offset)) - (loadw length string vm:vector-length-slot vm:other-pointer-type) (inst b sxhash-simple-substring-entry) - (inst nop)) + (loadw length string vm:vector-length-slot vm:other-pointer-type)) (define-assembly-routine (sxhash-simple-substring @@ -77,95 +75,38 @@ (:arg length any-reg a1-offset) (:res result any-reg a0-offset) - (:temp lip interior-reg lip-offset) (:temp accum non-descriptor-reg nl0-offset) (:temp data non-descriptor-reg nl1-offset) - (:temp byte non-descriptor-reg nl2-offset) - (:temp retaddr non-descriptor-reg nl3-offset)) + (:temp temp non-descriptor-reg nl2-offset) + (:temp offset non-descriptor-reg nl3-offset)) (emit-label sxhash-simple-substring-entry) - ;; Save the return address. - (inst sub retaddr lip code-tn) - - (inst add lip string - (- (* vm:vector-data-offset vm:word-bytes) vm:other-pointer-type)) + (inst li offset (- (* vector-data-offset word-bytes) other-pointer-type)) (inst b test) (move accum zero-tn) LOOP - (inst and byte data #xff) - (inst xor accum accum byte) - (inst sll byte accum 5) - (inst srl accum accum 27) - (inst or accum accum byte) - - (inst srl byte data 8) - (inst and byte byte #xff) - (inst xor accum accum byte) - (inst sll byte accum 5) - (inst srl accum accum 27) - (inst or accum accum byte) - - (inst srl byte data 16) - (inst and byte byte #xff) - (inst xor accum accum byte) - (inst sll byte accum 5) - (inst srl accum accum 27) - (inst or accum accum byte) - - (inst srl byte data 24) - (inst xor accum accum byte) - (inst sll byte accum 5) - (inst srl accum accum 27) - (inst or accum accum byte) - - (inst add lip lip 4) + (inst xor accum data) + (inst sll temp accum 27) + (inst srl accum 5) + (inst or accum temp) + (inst add offset 4) TEST (inst subcc length (fixnum 4)) (inst b :ge loop) - (inst ld data lip 0) - - (inst addcc length (fixnum 3)) - (inst b :eq one-more) - (inst subcc length (fixnum 1)) - (inst b :eq two-more) - (inst subcc length (fixnum 1)) - (inst b :ne done) - (inst nop) - - (inst srl byte data 16) - (inst and byte byte #xff) - (inst xor accum accum byte) - (inst sll byte accum 5) - (inst srl accum accum 27) - (inst or accum accum byte) - - TWO-MORE - - (inst srl byte data 8) - (inst and byte byte #xff) - (inst xor accum accum byte) - (inst sll byte accum 5) - (inst srl accum accum 27) - (inst or accum accum byte) - - ONE-MORE - - (inst and byte data #xff) - (inst xor accum accum byte) - (inst sll byte accum 5) - (inst srl accum accum 27) - (inst or accum accum byte) + (inst ld data string offset) + + (inst addcc length (fixnum 4)) + (inst b :eq done) + (inst neg length) + (inst sll length 1) + (inst srl data length) + (inst xor accum data) DONE (inst sll result accum 5) - (inst srl result result 3) - - ;; Restore the return address. - (inst add lip retaddr code-tn)) - - + (inst srl result result 3)) -- GitLab