X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fmips%2Farith.lisp;h=f5ed4cc371ea383dc60e214d066e862697764855;hb=f2b65035e35f3f7ae5f645cea6338538235ca899;hp=89f14b57eea04fef93b4f6dd1a67b9742fec5ac6;hpb=481348f2f96f364374f669786f9fc61348decabc;p=sbcl.git diff --git a/src/compiler/mips/arith.lisp b/src/compiler/mips/arith.lisp index 89f14b5..f5ed4cc 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) @@ -51,45 +54,34 @@ (:translate lognot) (:generator 1 (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) @@ -893,7 +885,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)