X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Falpha%2Fmove.lisp;h=bfdb4fe2998ff7796a77deddb35a8d2330064086;hb=4898ef32c639b1c7f4ee13a5ba566ce6debd03e6;hp=0b76ace1cc6520c87a45f501d3adf15c21023dc5;hpb=d40a76606c86722b0aef8179155f9f2840739b72;p=sbcl.git diff --git a/src/compiler/alpha/move.lisp b/src/compiler/alpha/move.lisp index 0b76ace..bfdb4fe 100644 --- a/src/compiler/alpha/move.lisp +++ b/src/compiler/alpha/move.lisp @@ -23,16 +23,16 @@ (symbol (load-symbol y val)) (character - (inst li (logior (ash (char-code val) n-widetag-bits) base-char-widetag) - y))))) + (inst li (logior (ash (char-code val) n-widetag-bits) character-widetag) + y))))) (define-move-fun (load-number 1) (vop x y) ((zero immediate) (signed-reg unsigned-reg)) (inst li (tn-value x) y)) -(define-move-fun (load-base-char 1) (vop x y) - ((immediate) (base-char-reg)) +(define-move-fun (load-character 1) (vop x y) + ((immediate) (character-reg)) (inst li (char-code (tn-value x)) y)) (define-move-fun (load-system-area-pointer 1) (vop x y) @@ -48,7 +48,7 @@ (load-stack-tn y x)) (define-move-fun (load-number-stack 5) (vop x y) - ((base-char-stack) (base-char-reg)) + ((character-stack) (character-reg)) (let ((nfp (current-nfp-tn vop))) (loadw y nfp (tn-offset x)))) @@ -64,7 +64,7 @@ (store-stack-tn y x)) (define-move-fun (store-number-stack 5) (vop x y) - ((base-char-reg) (base-char-stack)) + ((character-reg) (character-stack)) (let ((nfp (current-nfp-tn vop))) (storew x nfp (tn-offset y)))) @@ -79,36 +79,36 @@ (define-vop (move) (:args (x :target y - :scs (any-reg descriptor-reg zero null) - :load-if (not (location= x y)))) + :scs (any-reg descriptor-reg zero null) + :load-if (not (location= x y)))) (:results (y :scs (any-reg descriptor-reg control-stack) - :load-if (not (location= x y)))) + :load-if (not (location= x y)))) (:effects) (:affected) (:generator 0 (unless (location= x y) (sc-case y - ((any-reg descriptor-reg) - (inst move x y)) - (control-stack - (store-stack-tn y x)))))) + ((any-reg descriptor-reg) + (inst move x y)) + (control-stack + (store-stack-tn y x)))))) (define-move-vop move :move (any-reg descriptor-reg zero null) (any-reg descriptor-reg)) -;;; Make Move the check VOP for T so that type check generation +;;; Make MOVE the check VOP for T so that type check generation ;;; doesn't think it is a hairy type. This also allows checking of a ;;; few of the values in a continuation to fall out. (primitive-type-vop move (:check) t) -;;; The Move-Argument VOP is used for moving descriptor values into +;;; The MOVE-ARG VOP is used for moving descriptor values into ;;; another frame for argument or known value passing. -(define-vop (move-argument) +(define-vop (move-arg) (:args (x :target y - :scs (any-reg descriptor-reg null zero)) - (fp :scs (any-reg) - :load-if (not (sc-is y any-reg descriptor-reg)))) + :scs (any-reg descriptor-reg null zero)) + (fp :scs (any-reg) + :load-if (not (sc-is y any-reg descriptor-reg)))) (:results (y)) (:generator 0 (sc-case y @@ -117,7 +117,7 @@ (control-stack (storew x fp (tn-offset y)))))) ;;; -(define-move-vop move-argument :move-argument +(define-move-vop move-arg :move-arg (any-reg descriptor-reg null zero) (any-reg descriptor-reg)) @@ -142,7 +142,7 @@ ;;;; representation. Similarly, the MOVE-FROM-WORD VOPs converts a raw ;;;; integer to a tagged bignum or fixnum. -;;; Arg is a fixnum, so just shift it. We need a type restriction +;;; ARG is a fixnum, so just shift it. We need a type restriction ;;; because some possible arg SCs (control-stack) overlap with ;;; possible bignum arg SCs. (define-vop (move-to-word/fixnum) @@ -151,23 +151,21 @@ (:arg-types tagged-num) (:note "fixnum untagging") (:generator 1 - (inst sra x 2 y))) -;;; + (inst sra x n-fixnum-tag-bits y))) (define-move-vop move-to-word/fixnum :move (any-reg descriptor-reg) (signed-reg unsigned-reg)) -;;; Arg is a non-immediate constant, load it. +;;; ARG is a non-immediate constant, load it. (define-vop (move-to-word-c) (:args (x :scs (constant))) (:results (y :scs (signed-reg unsigned-reg))) (:note "constant load") (:generator 1 (inst li (tn-value x) y))) -;;; (define-move-vop move-to-word-c :move (constant) (signed-reg unsigned-reg)) -;;; Arg is a fixnum or bignum, figure out which and load if necessary. +;;; ARG is a fixnum or bignum, figure out which and load if necessary. (define-vop (move-to-word/integer) (:args (x :scs (descriptor-reg))) (:results (y :scs (signed-reg unsigned-reg))) @@ -175,8 +173,8 @@ (:temporary (:sc non-descriptor-reg) header) (:temporary (:scs (non-descriptor-reg)) temp) (:generator 3 - (inst and x 3 temp) - (inst sra x 2 y) + (inst and x fixnum-tag-mask temp) + (inst sra x n-fixnum-tag-bits y) (inst beq temp done) (loadw header x 0 other-pointer-lowtag) @@ -193,12 +191,10 @@ (when (sc-is y unsigned-reg) (inst mskll y 4 y)) DONE)) -;;; (define-move-vop move-to-word/integer :move (descriptor-reg) (signed-reg unsigned-reg)) - -;;; Result is a fixnum, so we can just shift. We need the result type +;;; RESULT is a fixnum, so we can just shift. We need the result type ;;; restriction because of the control-stack ambiguity noted above. (define-vop (move-from-word/fixnum) (:args (x :scs (signed-reg unsigned-reg))) @@ -206,12 +202,11 @@ (:result-types tagged-num) (:note "fixnum tagging") (:generator 1 - (inst sll x 2 y))) -;;; + (inst sll x n-fixnum-tag-bits y))) (define-move-vop move-from-word/fixnum :move (signed-reg unsigned-reg) (any-reg descriptor-reg)) -;;; Result may be a bignum, so we have to check. Use a worst-case cost +;;; RESULT may be a bignum, so we have to check. Use a worst-case cost ;;; to make sure people know they may be number consing. (define-vop (move-from-signed) (:args (arg :scs (signed-reg unsigned-reg) :target x)) @@ -221,8 +216,8 @@ (:note "signed word to integer coercion") (:generator 18 (move arg x) - (inst sra x 29 temp) - (inst sll x 2 y) + (inst sra x n-positive-fixnum-bits temp) + (inst sll x n-fixnum-tag-bits y) (inst beq temp done) (inst not temp temp) (inst beq temp done) @@ -234,7 +229,7 @@ (inst cmoveq temp 1 header) (inst sll header n-widetag-bits header) (inst bis header bignum-widetag header) - + (pseudo-atomic (:extra (pad-data-block (+ bignum-digits-offset 3))) (inst bis alloc-tn other-pointer-lowtag y) (storew header y 0 other-pointer-lowtag) @@ -242,8 +237,6 @@ (inst srl x 32 temp) (storew temp y (1+ bignum-digits-offset) other-pointer-lowtag)) DONE)) - -;;; (define-move-vop move-from-signed :move (signed-reg) (descriptor-reg)) @@ -258,10 +251,10 @@ (:note "unsigned word to integer coercion") (:generator 20 (move arg x) - (inst srl x 29 temp) - (inst sll x 2 y) + (inst srl x n-positive-fixnum-bits temp) + (inst sll x n-fixnum-tag-bits y) (inst beq temp done) - + (inst li 3 temp) (inst cmovge x 2 temp) (inst srl x 31 temp1) @@ -276,33 +269,30 @@ (inst srl x 32 temp) (storew temp y (1+ bignum-digits-offset) other-pointer-lowtag)) DONE)) - -;;; (define-move-vop move-from-unsigned :move (unsigned-reg) (descriptor-reg)) ;;; Move untagged numbers. (define-vop (word-move) (:args (x :target y - :scs (signed-reg unsigned-reg) - :load-if (not (location= x y)))) + :scs (signed-reg unsigned-reg) + :load-if (not (location= x y)))) (:results (y :scs (signed-reg unsigned-reg) - :load-if (not (location= x y)))) + :load-if (not (location= x y)))) (:effects) (:affected) (:note "word integer move") (:generator 0 (move x y))) -;;; (define-move-vop word-move :move (signed-reg unsigned-reg) (signed-reg unsigned-reg)) ;;; Move untagged number arguments/return-values. -(define-vop (move-word-argument) +(define-vop (move-word-arg) (:args (x :target y - :scs (signed-reg unsigned-reg)) - (fp :scs (any-reg) - :load-if (not (sc-is y sap-reg)))) + :scs (signed-reg unsigned-reg)) + (fp :scs (any-reg) + :load-if (not (sc-is y sap-reg)))) (:results (y)) (:note "word integer argument move") (:generator 0 @@ -311,12 +301,11 @@ (move x y)) ((signed-stack unsigned-stack) (storeq x fp (tn-offset y)))))) -;;; -(define-move-vop move-word-argument :move-argument +(define-move-vop move-word-arg :move-arg (descriptor-reg any-reg signed-reg unsigned-reg) (signed-reg unsigned-reg)) -;;; Use standard MOVE-ARGUMENT + coercion to move an untagged number +;;; Use standard MOVE-ARG + coercion to move an untagged number ;;; to a descriptor passing location. -(define-move-vop move-argument :move-argument +(define-move-vop move-arg :move-arg (signed-reg unsigned-reg) (any-reg descriptor-reg))