X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fsparc%2Fmemory.lisp;h=e5d8de4280b34d78e904fd246d69027787c3643a;hb=4cb16425e2ffce3f70ad6ca10f0cde4f1545fa9d;hp=8971960dd71f7c98f0ae4af7157d403fcf1257fe;hpb=68fd2d2dd6f265669a8957accd8a33e62786a97e;p=sbcl.git diff --git a/src/compiler/sparc/memory.lisp b/src/compiler/sparc/memory.lisp index 8971960..e5d8de4 100644 --- a/src/compiler/sparc/memory.lisp +++ b/src/compiler/sparc/memory.lisp @@ -43,7 +43,7 @@ (define-vop (slot-set) (:args (object :scs (descriptor-reg)) - (value :scs (descriptor-reg any-reg))) + (value :scs (descriptor-reg any-reg))) (:variant-vars base lowtag) (:info offset) (:generator 4 @@ -53,41 +53,41 @@ ;;; Define some VOPs for indexed memory reference. (macrolet ((define-indexer (name write-p op shift) - `(define-vop (,name) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg zero immediate)) - ,@(when write-p - '((value :scs (any-reg descriptor-reg) :target result)))) - (:arg-types * tagged-num ,@(when write-p '(*))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:results (,(if write-p 'result 'value) - :scs (any-reg descriptor-reg))) - (:result-types *) - (:variant-vars offset lowtag) - (:policy :fast-safe) - (:generator 5 - (sc-case index - ((immediate zero) - (let ((offset (- (+ (if (sc-is index zero) - 0 - (ash (tn-value index) - (- word-shift ,shift))) - (ash offset word-shift)) - lowtag))) - (etypecase offset - ((signed-byte 13) - (inst ,op value object offset)) - ((or (unsigned-byte 32) (signed-byte 32)) - (inst li temp offset) - (inst ,op value object temp))))) - (t - ,@(unless (zerop shift) - `((inst srl temp index ,shift))) - (inst add temp ,(if (zerop shift) 'index 'temp) - (- (ash offset word-shift) lowtag)) - (inst ,op value object temp))) - ,@(when write-p - '((move result value))))))) + `(define-vop (,name) + (:args (object :scs (descriptor-reg)) + (index :scs (any-reg zero immediate)) + ,@(when write-p + '((value :scs (any-reg descriptor-reg) :target result)))) + (:arg-types * tagged-num ,@(when write-p '(*))) + (:temporary (:scs (non-descriptor-reg)) temp) + (:results (,(if write-p 'result 'value) + :scs (any-reg descriptor-reg))) + (:result-types *) + (:variant-vars offset lowtag) + (:policy :fast-safe) + (:generator 5 + (sc-case index + ((immediate zero) + (let ((offset (- (+ (if (sc-is index zero) + 0 + (ash (tn-value index) + (- word-shift ,shift))) + (ash offset word-shift)) + lowtag))) + (etypecase offset + ((signed-byte 13) + (inst ,op value object offset)) + ((or (unsigned-byte 32) (signed-byte 32)) + (inst li temp offset) + (inst ,op value object temp))))) + (t + ,@(unless (zerop shift) + `((inst srl temp index ,shift))) + (inst add temp ,(if (zerop shift) 'index 'temp) + (- (ash offset word-shift) lowtag)) + (inst ,op value object temp))) + ,@(when write-p + '((move result value))))))) (define-indexer word-index-ref nil ld 0) (define-indexer word-index-set t st 0) (define-indexer halfword-index-ref nil lduh 1)