X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fcell.lisp;h=ba0a27e5ad339796d88dcb8c4874747aa7fed594;hb=b28aadc5bd34a0d9fa0ff15c52b2b4164d955831;hp=8eac0c0f3768ce954980fecd72e6742491eaca5f;hpb=af4d83b57531e98d455f31980ef6359465d3d5a7;p=sbcl.git diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 8eac0c0..ba0a27e 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -83,16 +83,6 @@ (define-vop (set cell-set) (:variant symbol-value-slot other-pointer-lowtag)) -;;; Do a cell ref with an error check for being unbound. -;;; XXX stil used? I can't see where -dan -(define-vop (checked-cell-ref) - (:args (object :scs (descriptor-reg) :target obj-temp)) - (:results (value :scs (descriptor-reg any-reg))) - (:policy :fast-safe) - (:vop-var vop) - (:save-p :compute-only) - (:temporary (:sc descriptor-reg :from (:argument 0)) obj-temp)) - ;;; With Symbol-Value, we check that the value isn't the trap object. So ;;; Symbol-Value of NIL is NIL. #!+sb-thread @@ -203,10 +193,10 @@ (:args (object :scs (descriptor-reg))) (:conditional) (:info target not-p) - (:temporary (:sc descriptor-reg :from (:argument 0)) value) (:generator 9 - (loadw value object symbol-value-slot other-pointer-lowtag) - (inst cmp value unbound-marker-widetag) + (inst cmp (make-ea-for-object-slot object symbol-value-slot + other-pointer-lowtag) + unbound-marker-widetag) (inst jmp (if not-p :e :ne) target))) @@ -299,7 +289,7 @@ (pseudo-atomic (emit-label get-tls-index-lock) (inst mov temp 1) - (inst xor rax rax) + (zeroize rax) (inst lock) (inst cmpxchg (make-ea-for-symbol-value *tls-index-lock*) temp) (inst jmp :ne get-tls-index-lock) @@ -353,8 +343,8 @@ (inst mov (make-ea :qword :base thread-base-tn :scale 1 :index tls-index) value) - (storew 0 bsp (- binding-value-slot binding-size)) (storew 0 bsp (- binding-symbol-slot binding-size)) + (storew 0 bsp (- binding-value-slot binding-size)) (inst sub bsp (* binding-size n-word-bytes)) (store-binding-stack-pointer bsp))) @@ -366,8 +356,8 @@ (loadw symbol bsp (- binding-symbol-slot binding-size)) (loadw value bsp (- binding-value-slot binding-size)) (storew value symbol symbol-value-slot other-pointer-lowtag) - (storew 0 bsp (- binding-value-slot binding-size)) (storew 0 bsp (- binding-symbol-slot binding-size)) + (storew 0 bsp (- binding-value-slot binding-size)) (inst sub bsp (* binding-size n-word-bytes)) (store-symbol-value bsp *binding-stack-pointer*))) @@ -392,10 +382,10 @@ #!+sb-thread (inst mov (make-ea :qword :base thread-base-tn :scale 1 :index tls-index) value) - (storew 0 bsp (- binding-value-slot binding-size)) (storew 0 bsp (- binding-symbol-slot binding-size)) SKIP + (storew 0 bsp (- binding-value-slot binding-size)) (inst sub bsp (* binding-size n-word-bytes)) (inst cmp where bsp) (inst jmp :ne LOOP) @@ -419,9 +409,6 @@ funcallable-instance-info-offset fun-pointer-lowtag (descriptor-reg any-reg) * %funcallable-instance-info) -(define-vop (funcallable-instance-lexenv cell-ref) - (:variant funcallable-instance-lexenv-slot fun-pointer-lowtag)) - (define-vop (closure-ref slot-ref) (:variant closure-info-offset fun-pointer-lowtag)) @@ -448,18 +435,6 @@ (loadw res struct 0 instance-pointer-lowtag) (inst shr res n-widetag-bits))) -(define-vop (instance-ref slot-ref) - (:variant instance-slots-offset instance-pointer-lowtag) - (:policy :fast-safe) - (:translate %instance-ref) - (:arg-types instance (:constant index))) - -(define-vop (instance-set slot-set) - (:policy :fast-safe) - (:translate %instance-set) - (:variant instance-slots-offset instance-pointer-lowtag) - (:arg-types instance (:constant index) *)) - (define-full-reffer instance-index-ref * instance-slots-offset instance-pointer-lowtag (any-reg descriptor-reg) * %instance-ref) @@ -505,6 +480,22 @@ ;;;; raw instance slot accessors +(defun make-ea-for-raw-slot (object index instance-length + &optional (adjustment 0)) + (etypecase index + (tn + (make-ea :qword :base object :index instance-length + :disp (+ (* (1- instance-slots-offset) n-word-bytes) + (- instance-pointer-lowtag) + adjustment))) + (integer + (make-ea :qword :base object :index instance-length + :scale 8 + :disp (+ (* (1- instance-slots-offset) n-word-bytes) + (- instance-pointer-lowtag) + adjustment + (- (fixnumize index))))))) + (define-vop (raw-instance-ref/word) (:translate %raw-instance-ref/word) (:policy :fast-safe) @@ -518,13 +509,23 @@ (inst shr tmp n-widetag-bits) (inst shl tmp 3) (inst sub tmp index) - (inst mov - value - (make-ea :qword - :base object - :index tmp - :disp (- (* (1- instance-slots-offset) n-word-bytes) - instance-pointer-lowtag))))) + (inst mov value (make-ea-for-raw-slot object index tmp)))) + +(define-vop (raw-instance-ref-c/word) + (:translate %raw-instance-ref/word) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg))) + (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset))) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (value :scs (unsigned-reg))) + (:result-types unsigned-num) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + (inst mov value (make-ea-for-raw-slot object index tmp)))) (define-vop (raw-instance-set/word) (:translate %raw-instance-set/word) @@ -541,13 +542,26 @@ (inst shr tmp n-widetag-bits) (inst shl tmp 3) (inst sub tmp index) - (inst mov - (make-ea :qword - :base object - :index tmp - :disp (- (* (1- instance-slots-offset) n-word-bytes) - instance-pointer-lowtag)) - value) + (inst mov (make-ea-for-raw-slot object index tmp) value) + (move result value))) + +(define-vop (raw-instance-set-c/word) + (:translate %raw-instance-set/word) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg)) + (value :scs (unsigned-reg) :target result)) + (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset)) + unsigned-num) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (result :scs (unsigned-reg))) + (:result-types unsigned-num) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + (inst mov (make-ea-for-raw-slot object index tmp) value) (move result value))) (define-vop (raw-instance-ref/single) @@ -564,13 +578,23 @@ (inst shr tmp n-widetag-bits) (inst shl tmp 3) (inst sub tmp index) - (inst movss - value - (make-ea :dword - :base object - :index tmp - :disp (- (* (1- instance-slots-offset) n-word-bytes) - instance-pointer-lowtag))))) + (inst movss value (make-ea-for-raw-slot object index tmp)))) + +(define-vop (raw-instance-ref-c/single) + (:translate %raw-instance-ref/single) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg))) + (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset))) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (value :scs (single-reg))) + (:result-types single-float) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + (inst movss value (make-ea-for-raw-slot object index tmp)))) (define-vop (raw-instance-set/single) (:translate %raw-instance-set/single) @@ -587,13 +611,27 @@ (inst shr tmp n-widetag-bits) (inst shl tmp 3) (inst sub tmp index) - (inst movss - (make-ea :dword - :base object - :index tmp - :disp (- (* (1- instance-slots-offset) n-word-bytes) - instance-pointer-lowtag)) - value) + (inst movss (make-ea-for-raw-slot object index tmp) value) + (unless (location= result value) + (inst movss result value)))) + +(define-vop (raw-instance-set-c/single) + (:translate %raw-instance-set/single) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg)) + (value :scs (single-reg) :target result)) + (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset)) + single-float) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (result :scs (single-reg))) + (:result-types single-float) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + (inst movss (make-ea-for-raw-slot object index tmp) value) (unless (location= result value) (inst movss result value)))) @@ -611,13 +649,23 @@ (inst shr tmp n-widetag-bits) (inst shl tmp 3) (inst sub tmp index) - (inst movsd - value - (make-ea :dword - :base object - :index tmp - :disp (- (* (1- instance-slots-offset) n-word-bytes) - instance-pointer-lowtag))))) + (inst movsd value (make-ea-for-raw-slot object index tmp)))) + +(define-vop (raw-instance-ref-c/double) + (:translate %raw-instance-ref/double) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg))) + (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset))) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (value :scs (double-reg))) + (:result-types double-float) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + (inst movsd value (make-ea-for-raw-slot object index tmp)))) (define-vop (raw-instance-set/double) (:translate %raw-instance-set/double) @@ -634,13 +682,27 @@ (inst shr tmp n-widetag-bits) (inst shl tmp 3) (inst sub tmp index) - (inst movsd - (make-ea :dword - :base object - :index tmp - :disp (- (* (1- instance-slots-offset) n-word-bytes) - instance-pointer-lowtag)) - value) + (inst movsd (make-ea-for-raw-slot object index tmp) value) + (unless (location= result value) + (inst movsd result value)))) + +(define-vop (raw-instance-set-c/double) + (:translate %raw-instance-set/double) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg)) + (value :scs (double-reg) :target result)) + (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset)) + double-float) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (result :scs (double-reg))) + (:result-types double-float) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + (inst movsd (make-ea-for-raw-slot object index tmp) value) (unless (location= result value) (inst movsd result value)))) @@ -659,22 +721,28 @@ (inst shl tmp 3) (inst sub tmp index) (let ((real-tn (complex-single-reg-real-tn value))) - (inst movss - real-tn - (make-ea :dword - :base object - :index tmp - :disp (- (* (1- instance-slots-offset) n-word-bytes) - instance-pointer-lowtag)))) + (inst movss real-tn (make-ea-for-raw-slot object index tmp))) + (let ((imag-tn (complex-single-reg-imag-tn value))) + (inst movss imag-tn (make-ea-for-raw-slot object index tmp 4))))) + +(define-vop (raw-instance-ref-c/complex-single) + (:translate %raw-instance-ref/complex-single) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg))) + (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset))) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (value :scs (complex-single-reg))) + (:result-types complex-single-float) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + (let ((real-tn (complex-single-reg-real-tn value))) + (inst movss real-tn (make-ea-for-raw-slot object index tmp))) (let ((imag-tn (complex-single-reg-imag-tn value))) - (inst movss - imag-tn - (make-ea :dword - :base object - :index tmp - :disp (+ (* (1- instance-slots-offset) n-word-bytes) - 4 - (- instance-pointer-lowtag))))))) + (inst movss imag-tn (make-ea-for-raw-slot object index tmp 4))))) (define-vop (raw-instance-set/complex-single) (:translate %raw-instance-set/complex-single) @@ -693,23 +761,39 @@ (inst sub tmp index) (let ((value-real (complex-single-reg-real-tn value)) (result-real (complex-single-reg-real-tn result))) - (inst movss (make-ea :dword - :base object - :index tmp - :disp (- (* (1- instance-slots-offset) n-word-bytes) - instance-pointer-lowtag)) - value-real) + (inst movss (make-ea-for-raw-slot object index tmp) value-real) + (unless (location= value-real result-real) + (inst movss result-real value-real))) + (let ((value-imag (complex-single-reg-imag-tn value)) + (result-imag (complex-single-reg-imag-tn result))) + (inst movss (make-ea-for-raw-slot object index tmp 4) value-imag) + (unless (location= value-imag result-imag) + (inst movss result-imag value-imag))))) + +(define-vop (raw-instance-set-c/complex-single) + (:translate %raw-instance-set/complex-single) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg)) + (value :scs (complex-single-reg) :target result)) + (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset)) + complex-single-float) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (result :scs (complex-single-reg))) + (:result-types complex-single-float) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + (let ((value-real (complex-single-reg-real-tn value)) + (result-real (complex-single-reg-real-tn result))) + (inst movss (make-ea-for-raw-slot object index tmp) value-real) (unless (location= value-real result-real) (inst movss result-real value-real))) (let ((value-imag (complex-single-reg-imag-tn value)) (result-imag (complex-single-reg-imag-tn result))) - (inst movss (make-ea :dword - :base object - :index tmp - :disp (+ (* (1- instance-slots-offset) n-word-bytes) - 4 - (- instance-pointer-lowtag))) - value-imag) + (inst movss (make-ea-for-raw-slot object index tmp 4) value-imag) (unless (location= value-imag result-imag) (inst movss result-imag value-imag))))) @@ -728,21 +812,28 @@ (inst shl tmp 3) (inst sub tmp index) (let ((real-tn (complex-double-reg-real-tn value))) - (inst movsd - real-tn - (make-ea :dword - :base object - :index tmp - :disp (- (* (- instance-slots-offset 2) n-word-bytes) - instance-pointer-lowtag)))) + (inst movsd real-tn (make-ea-for-raw-slot object index tmp -8))) (let ((imag-tn (complex-double-reg-imag-tn value))) - (inst movsd - imag-tn - (make-ea :dword - :base object - :index tmp - :disp (- (* (1- instance-slots-offset) n-word-bytes) - instance-pointer-lowtag)))))) + (inst movsd imag-tn (make-ea-for-raw-slot object index tmp))))) + +(define-vop (raw-instance-ref-c/complex-double) + (:translate %raw-instance-ref/complex-double) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg))) + (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset))) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (value :scs (complex-double-reg))) + (:result-types complex-double-float) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + (let ((real-tn (complex-double-reg-real-tn value))) + (inst movsd real-tn (make-ea-for-raw-slot object index tmp -8))) + (let ((imag-tn (complex-double-reg-imag-tn value))) + (inst movsd imag-tn (make-ea-for-raw-slot object index tmp))))) (define-vop (raw-instance-set/complex-double) (:translate %raw-instance-set/complex-double) @@ -761,21 +852,38 @@ (inst sub tmp index) (let ((value-real (complex-double-reg-real-tn value)) (result-real (complex-double-reg-real-tn result))) - (inst movsd (make-ea :dword - :base object - :index tmp - :disp (- (* (- instance-slots-offset 2) n-word-bytes) - instance-pointer-lowtag)) - value-real) + (inst movsd (make-ea-for-raw-slot object index tmp -8) value-real) (unless (location= value-real result-real) (inst movsd result-real value-real))) (let ((value-imag (complex-double-reg-imag-tn value)) (result-imag (complex-double-reg-imag-tn result))) - (inst movsd (make-ea :dword - :base object - :index tmp - :disp (- (* (1- instance-slots-offset) n-word-bytes) - instance-pointer-lowtag)) - value-imag) + (inst movsd (make-ea-for-raw-slot object index tmp) value-imag) + (unless (location= value-imag result-imag) + (inst movsd result-imag value-imag))))) + +(define-vop (raw-instance-set-c/complex-double) + (:translate %raw-instance-set/complex-double) + (:policy :fast-safe) + (:args (object :scs (descriptor-reg)) + (value :scs (complex-double-reg) :target result)) + (:arg-types * (:constant (load/store-index #.sb!vm:n-word-bytes + #.instance-pointer-lowtag + #.instance-slots-offset)) + complex-double-float) + (:info index) + (:temporary (:sc unsigned-reg) tmp) + (:results (result :scs (complex-double-reg))) + (:result-types complex-double-float) + (:generator 4 + (loadw tmp object 0 instance-pointer-lowtag) + (inst shr tmp n-widetag-bits) + (let ((value-real (complex-double-reg-real-tn value)) + (result-real (complex-double-reg-real-tn result))) + (inst movsd (make-ea-for-raw-slot object index tmp -8) value-real) + (unless (location= value-real result-real) + (inst movsd result-real value-real))) + (let ((value-imag (complex-double-reg-imag-tn value)) + (result-imag (complex-double-reg-imag-tn result))) + (inst movsd (make-ea-for-raw-slot object index tmp) value-imag) (unless (location= value-imag result-imag) (inst movsd result-imag value-imag)))))