X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fmips%2Farith.lisp;h=8be4e93dcbf1b58384b5a4ae7ce71031dd75cba1;hb=1907ad030ca773162bcd9ff90fdc485a035591f4;hp=89f14b57eea04fef93b4f6dd1a67b9742fec5ac6;hpb=481348f2f96f364374f669786f9fc61348decabc;p=sbcl.git diff --git a/src/compiler/mips/arith.lisp b/src/compiler/mips/arith.lisp index 89f14b5..8be4e93 100644 --- a/src/compiler/mips/arith.lisp +++ b/src/compiler/mips/arith.lisp @@ -13,21 +13,24 @@ ;;;; Unary operations. -(define-vop (fixnum-unop) +(define-vop (fast-safe-arith-op) + (:policy :fast-safe) + (:effects) + (:affected)) + +(define-vop (fixnum-unop fast-safe-arith-op) (:args (x :scs (any-reg))) (:results (res :scs (any-reg))) (:note "inline fixnum arithmetic") (:arg-types tagged-num) - (:result-types tagged-num) - (:policy :fast-safe)) + (:result-types tagged-num)) -(define-vop (signed-unop) +(define-vop (signed-unop fast-safe-arith-op) (:args (x :scs (signed-reg))) (:results (res :scs (signed-reg))) (:note "inline (signed-byte 32) arithmetic") (:arg-types signed-num) - (:result-types signed-num) - (:policy :fast-safe)) + (:result-types signed-num)) (define-vop (fast-negate/fixnum fixnum-unop) (:translate %negate) @@ -43,53 +46,42 @@ (:temporary (:scs (any-reg) :type fixnum :to (:result 0)) temp) (:translate lognot) - (:generator 2 + (:generator 1 (inst li temp (fixnumize -1)) (inst xor res x temp))) (define-vop (fast-lognot/signed signed-unop) (:translate lognot) - (:generator 1 + (:generator 2 (inst nor res x zero-tn))) - - ;;;; Binary fixnum operations. ;;; Assume that any constant operand is the second arg... -(define-vop (fast-fixnum-binop) - (:args (x :target r :scs (any-reg)) - (y :target r :scs (any-reg))) +(define-vop (fast-fixnum-binop fast-safe-arith-op) + (:args (x :target r :scs (any-reg zero)) + (y :target r :scs (any-reg zero))) (:arg-types tagged-num tagged-num) (:results (r :scs (any-reg))) (:result-types tagged-num) - (:note "inline fixnum arithmetic") - (:effects) - (:affected) - (:policy :fast-safe)) + (:note "inline fixnum arithmetic")) -(define-vop (fast-unsigned-binop) - (:args (x :target r :scs (unsigned-reg)) - (y :target r :scs (unsigned-reg))) +(define-vop (fast-unsigned-binop fast-safe-arith-op) + (:args (x :target r :scs (unsigned-reg zero)) + (y :target r :scs (unsigned-reg zero))) (:arg-types unsigned-num unsigned-num) (:results (r :scs (unsigned-reg))) (:result-types unsigned-num) - (:note "inline (unsigned-byte 32) arithmetic") - (:effects) - (:affected) - (:policy :fast-safe)) + (:note "inline (unsigned-byte 32) arithmetic")) -(define-vop (fast-signed-binop) - (:args (x :target r :scs (signed-reg)) - (y :target r :scs (signed-reg))) +(define-vop (fast-signed-binop fast-safe-arith-op) + (:args (x :target r :scs (signed-reg zero)) + (y :target r :scs (signed-reg zero))) (:arg-types signed-num signed-num) (:results (r :scs (signed-reg))) (:result-types signed-num) - (:note "inline (signed-byte 32) arithmetic") - (:effects) - (:affected) - (:policy :fast-safe)) + (:note "inline (signed-byte 32) arithmetic")) (define-vop (fast-fixnum-c-binop fast-fixnum-binop) (:args (x :target r :scs (any-reg))) @@ -154,8 +146,8 @@ (define-binop + 1 5 addu (signed-byte 14) (signed-byte 16)) (define-binop - 1 5 subu - (integer #.(- (1- (ash 1 14))) #.(ash 1 14)) - (integer #.(- (1- (ash 1 16))) #.(ash 1 16))) + (integer #.(- 1 (ash 1 13)) #.(ash 1 13)) + (integer #.(- 1 (ash 1 15)) #.(ash 1 15))) (define-binop logior 1 3 or (unsigned-byte 14) (unsigned-byte 16)) (define-binop logand 1 3 and (unsigned-byte 14) (unsigned-byte 16)) (define-binop logxor 1 3 xor (unsigned-byte 14) (unsigned-byte 16)) @@ -396,7 +388,7 @@ (:temporary (:scs (non-descriptor-reg)) temp) (:translate *) (:generator 4 - (inst sra temp y 2) + (inst sra temp y n-fixnum-tag-bits) (inst mult x temp) (inst mflo r))) @@ -428,7 +420,7 @@ (inst nop) (inst div x y) (inst mflo temp) - (inst sll q temp 2) + (inst sll q temp n-fixnum-tag-bits) (inst mfhi r))) (define-vop (fast-truncate/unsigned fast-unsigned-binop) @@ -676,12 +668,12 @@ (inst sll r num amount))))) ;;;; Modular arithmetic -(define-modular-fun +-mod32 (x y) + :unsigned 32) +(define-modular-fun +-mod32 (x y) + :untagged nil 32) (define-vop (fast-+-mod32/unsigned=>unsigned fast-+/unsigned=>unsigned) (:translate +-mod32)) (define-vop (fast-+-mod32-c/unsigned=>unsigned fast-+-c/unsigned=>unsigned) (:translate +-mod32)) -(define-modular-fun --mod32 (x y) - :unsigned 32) +(define-modular-fun --mod32 (x y) - :untagged nil 32) (define-vop (fast---mod32/unsigned=>unsigned fast--/unsigned=>unsigned) (:translate --mod32)) (define-vop (fast---mod32-c/unsigned=>unsigned fast---c/unsigned=>unsigned) @@ -700,7 +692,7 @@ '(%primitive fast-ash-left-mod32/unsigned=>unsigned integer count)) ;;; logical operations -(define-modular-fun lognot-mod32 (x) lognot :unsigned 32) +(define-modular-fun lognot-mod32 (x) lognot :untagged nil 32) (define-vop (lognot-mod32/unsigned=>unsigned) (:translate lognot-mod32) (:args (x :scs (unsigned-reg))) @@ -711,15 +703,7 @@ (:generator 1 (inst nor r x zero-tn))) -(define-modular-fun logxor-mod32 (x y) logxor :unsigned 32) -(define-vop (fast-logxor-mod32/unsigned=>unsigned - fast-logxor/unsigned=>unsigned) - (:translate logxor-mod32)) -(define-vop (fast-logxor-mod32-c/unsigned=>unsigned - fast-logxor-c/unsigned=>unsigned) - (:translate logxor-mod32)) - -(define-modular-fun lognor-mod32 (x y) lognor :unsigned 32) +(define-modular-fun lognor-mod32 (x y) lognor :untagged nil 32) (define-vop (fast-lognor-mod32/unsigned=>unsigned fast-lognor/unsigned=>unsigned) (:translate lognor-mod32)) @@ -893,7 +877,7 @@ (:results (digit :scs (unsigned-reg))) (:result-types unsigned-num) (:generator 1 - (inst sra digit fixnum 2))) + (inst sra digit fixnum n-fixnum-tag-bits))) (define-vop (bignum-floor) (:translate sb!bignum:%floor)