From: Christophe R. <cr...@us...> - 2004-08-16 22:54:55
|
Update of /cvsroot/sbcl/sbcl/src/compiler/sparc In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20999/src/compiler/sparc Modified Files: arith.lisp Log Message: 0.8.13.67: Implement modular ASH for non-constant positive shifts ... make sure that we only apply the transform when we know the shift count won't be misinterpreted... ... and also that we don't do the more expensive non-constant shift for constant counts; ... punt on some of the cleverness for hppa; all other platforms should be optimal. ... one test for something which went wrong in an earlier version. Index: arith.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/sparc/arith.lisp,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- arith.lisp 7 Aug 2004 02:24:48 -0000 1.18 +++ arith.lisp 16 Aug 2004 22:52:01 -0000 1.19 @@ -482,7 +482,7 @@ ;; Some special cases where we know we want a left shift. Just do the ;; shift, instead of checking for the sign of the shift. (macrolet - ((frob (name sc-type type result-type cost) + ((def (name sc-type type result-type cost) `(define-vop (,name) (:note "inline ASH") (:translate ash) @@ -503,9 +503,9 @@ (let ((amount (tn-value amount))) (aver (>= amount 0)) (inst sll result number amount)))))))) - (frob fast-ash-left/signed=>signed signed-reg signed-num signed-reg 3) - (frob fast-ash-left/fixnum=>fixnum any-reg tagged-num any-reg 2) - (frob fast-ash-left/unsigned=>unsigned unsigned-reg unsigned-num unsigned-reg 3)) + (def fast-ash-left/signed=>signed signed-reg signed-num signed-reg 3) + (def fast-ash-left/fixnum=>fixnum any-reg tagged-num any-reg 2) + (def fast-ash-left/unsigned=>unsigned unsigned-reg unsigned-num unsigned-reg 3)) (define-vop (signed-byte-32-len) @@ -689,6 +689,14 @@ (define-vop (fast-ash-left-mod32-c/unsigned=>unsigned fast-ash-c/unsigned=>unsigned) (:translate ash-left-mod32)) + +(define-vop (fast-ash-left-mod32/unsigned=>unsigned + fast-ash-left/unsigned=>unsigned)) +(deftransform ash-left-mod32 ((integer count) + ((unsigned-byte 32) (unsigned-byte 5))) + (when (sb!c::constant-lvar-p count) + (sb!c::give-up-ir1-transform)) + '(%primitive fast-ash-left-mod32/unsigned=>unsigned integer count)) ;;;; Binary conditional VOPs: |