diff --git a/compiler/old-rt/arith.lisp b/compiler/old-rt/arith.lisp index 5a453fb90c10b377e8be77eedfbcab170463dc13..d3b855d0a78c721c062db072961502c7265bace9 100644 --- a/compiler/old-rt/arith.lisp +++ b/compiler/old-rt/arith.lisp @@ -102,7 +102,7 @@ :scs (any-reg descriptor-reg)) (y :target r :scs (any-reg descriptor-reg short-immediate unsigned-immediate))) - (:result-types t)) + (:result-types *)) (define-fixnum-binop fast-logior/fixnum fast-logic-binop/fixnum logior o :immed-op oil :unsigned t :commute-op o) @@ -113,13 +113,26 @@ (define-fixnum-binop fast-logxor/fixnum fast-logic-binop/fixnum logxor x :immed-op xil :unsigned t :commute-op x) -#| + (define-vop (fast-ash/fixnum fast-binop/fixnum) + (:args (i :scs (any-reg descriptor-reg) + :target r)) + (:arg-types fixnum (:constant (integer -31 31))) + (:info n) + (:translate ash) (:generator 1 - (sc-case y - ((any-reg descriptor-reg) - )))) -|# + (cond ((plusp n) + (if (> n 15) + (inst sli16 r (- n 16)) + (inst sli r n))) + ((minusp n) + (if (> n 15) + (inst sari16 r (- n 16)) + (inst sari r n)))) + + (unless (location= i r) + (inst lr r i)))) + (define-miscop-variants effectless-unaffected-two-arg-miscop logand logior logxor)