From: Juho S. <js...@us...> - 2005-08-26 22:19:20
|
Update of /cvsroot/sbcl/sbcl/contrib/sb-rotate-byte In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4473/contrib/sb-rotate-byte Modified Files: compiler.lisp Log Message: 0.9.4.8: Add a fallback implementation of SB-ROTATE-BYTE:%UNSIGNED-32-ROTATE-BYTE for platforms without the optimized VOPs, that isn't as pessimal as the generic %ROTATE-BYTE. About 70x speedup for SB-MD5 on x86-64. Index: compiler.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/contrib/sb-rotate-byte/compiler.lisp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- compiler.lisp 14 Jul 2005 16:30:09 -0000 1.4 +++ compiler.lisp 26 Aug 2005 22:19:12 -0000 1.5 @@ -56,3 +56,15 @@ ;; FIXME: What happens when, as here, the two type specifiers for ;; COUNT overlap? Which gets to run first? '(%unsigned-32-rotate-byte count integer)) + +;; Generic implementation for platforms that don't supply VOPs for 32-bit +;; rotate. +#-(or x86 ppc) +(deftransform %unsigned-32-rotate-byte ((.count. .integer.) + ((integer -31 31) + (unsigned-byte 32)) *) + '(if (< .count. 0) + (logior (ldb (byte 32 0) (ash .integer. (+ .count. 32))) + (ash .integer. .count.)) + (logior (ldb (byte 32 0) (ash .integer. .count.)) + (ash .integer. (- .count. 32))))) |