X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Falpha%2Farith.lisp;h=4c3d9317e31d488fd06ade537d73c5a17db0e84a;hb=b63c4fb9b98fa8188e17ba926e150ba417a74635;hp=d054afc8a8563896f55703beb633634a63194278;hpb=ace140856e6b3f92bb06597092a59753f1e59142;p=sbcl.git diff --git a/src/compiler/alpha/arith.lisp b/src/compiler/alpha/arith.lisp index d054afc..4c3d931 100644 --- a/src/compiler/alpha/arith.lisp +++ b/src/compiler/alpha/arith.lisp @@ -271,6 +271,28 @@ ((> count 0) (inst sll number (min 63 count) result)) (t (bug "identity ASH not transformed away"))))) +(macrolet ((def (name sc-type type result-type cost) + `(define-vop (,name) + (:note "inline ASH") + (:translate ash) + (:args (number :scs (,sc-type)) + (amount :scs (signed-reg unsigned-reg immediate))) + (:arg-types ,type positive-fixnum) + (:results (result :scs (,result-type))) + (:result-types ,type) + (:policy :fast-safe) + (:generator ,cost + (sc-case amount + ((signed-reg unsigned-reg) + (inst sll number amount result)) + (immediate + (let ((amount (tn-value amount))) + (aver (> amount 0)) + (inst sll number amount result)))))))) + (def fast-ash-left/fixnum=>fixnum any-reg tagged-num any-reg 2) + (def fast-ash-left/signed=>signed signed-reg signed-num signed-reg 3) + (def fast-ash-left/unsigned=>unsigned unsigned-reg unsigned-num unsigned-reg 3)) + (define-vop (signed-byte-64-len) (:translate integer-length) (:note "inline (signed-byte 64) integer-length") @@ -367,7 +389,7 @@ (inst mulq x y r))) ;;;; Modular functions: -(define-modular-fun lognot-mod64 (x) lognot 64) +(define-modular-fun lognot-mod64 (x) lognot :unsigned 64) (define-vop (lognot-mod64/unsigned=>unsigned) (:translate lognot-mod64) (:args (x :scs (unsigned-reg))) @@ -381,6 +403,13 @@ (define-vop (fast-ash-left-mod64-c/unsigned=>unsigned fast-ash-c/unsigned=>unsigned) (:translate ash-left-mod64)) +(define-vop (fast-ash-left-mod64/unsigned=>unsigned + fast-ash-left/unsigned=>unsigned)) +(deftransform ash-left-mod64 ((integer count) + ((unsigned-byte 64) (unsigned-byte 6))) + (when (sb!c::constant-lvar-p count) + (sb!c::give-up-ir1-transform)) + '(%primitive fast-ash-left-mod64/unsigned=>unsigned integer count)) (macrolet ((define-modular-backend (fun &optional constantp) @@ -390,7 +419,7 @@ (vop (symbolicate 'fast- fun '/unsigned=>unsigned)) (cvop (symbolicate 'fast- fun '-c/unsigned=>unsigned))) `(progn - (define-modular-fun ,mfun-name (x y) ,fun 64) + (define-modular-fun ,mfun-name (x y) ,fun :unsigned 64) (define-vop (,modvop ,vop) (:translate ,mfun-name)) ,@(when constantp @@ -595,43 +624,6 @@ (emit-label done) (move res result)))) -(define-source-transform word-logical-not (x) - `(logand (lognot (the (unsigned-byte 32) ,x)) #.(1- (ash 1 32)))) - -(deftransform word-logical-and ((x y)) - '(logand x y)) - -(define-source-transform word-logical-nand (x y) - `(word-logical-not (word-logical-and ,x ,y))) - -(deftransform word-logical-or ((x y)) - '(logior x y)) - -(define-source-transform word-logical-nor (x y) - `(logand (lognor (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y)) - #.(1- (ash 1 32)))) - -(deftransform word-logical-xor ((x y)) - '(logxor x y)) - -(define-source-transform word-logical-eqv (x y) - `(logand (logeqv (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y)) - #.(1- (ash 1 32)))) - -(define-source-transform word-logical-orc1 (x y) - `(logand (logorc1 (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y)) - #.(1- (ash 1 32)))) - -(define-source-transform word-logical-orc2 (x y) - `(logand (logorc2 (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y)) - #.(1- (ash 1 32)))) - -(define-source-transform word-logical-andc1 (x y) - `(logandc1 (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y))) - -(define-source-transform word-logical-andc2 (x y) - `(logandc2 (the (unsigned-byte 32) ,x) (the (unsigned-byte 32) ,y))) - (define-vop (shift-towards-someplace) (:policy :fast-safe) (:args (num :scs (unsigned-reg))