X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fcell.lisp;h=a27dc198966379caeacbab4a8ecce53e44372e45;hb=bd0c2b854688663c40a50a4453d668a7abfc96db;hp=f282900b3dd97efd1c590d863f9483472fcbf252;hpb=955ce74879cc8220d4c97bb1c0f3becd26ad68fc;p=sbcl.git diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index f282900..a27dc19 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -47,6 +47,8 @@ ;; Else, value not immediate. (storew value object offset lowtag)))) +(define-vop (init-slot set-slot)) + (define-vop (compare-and-swap-slot) (:args (object :scs (descriptor-reg) :to :eval) (old :scs (descriptor-reg any-reg) :target rax) @@ -237,7 +239,7 @@ ;; it is a fixnum. The lowtag selection magic that is required to ;; ensure this is explained in the comment in objdef.lisp (loadw res symbol symbol-hash-slot other-pointer-lowtag) - (inst and res (lognot #b111)))) + (inst and res (lognot fixnum-tag-mask)))) ;;;; fdefinition (FDEFN) objects @@ -452,6 +454,12 @@ (define-vop (closure-init slot-set) (:variant closure-info-offset fun-pointer-lowtag)) + +(define-vop (closure-init-from-fp) + (:args (object :scs (descriptor-reg))) + (:info offset) + (:generator 4 + (storew rbp-tn object (+ closure-info-offset offset) fun-pointer-lowtag))) ;;;; value cell hackery @@ -494,8 +502,8 @@ ;;;; raw instance slot accessors -(defun make-ea-for-raw-slot (object index instance-length - &optional (adjustment 0)) +(defun make-ea-for-raw-slot (object instance-length + &key (index nil) (adjustment 0) (scale 1)) (if (integerp instance-length) ;; For RAW-INSTANCE-INIT/* VOPs, which know the exact instance length ;; at compile time. @@ -506,8 +514,8 @@ (- instance-pointer-lowtag) adjustment)) (etypecase index - (tn - (make-ea :qword :base object :index instance-length + (null + (make-ea :qword :base object :index instance-length :scale scale :disp (+ (* (1- instance-slots-offset) n-word-bytes) (- instance-pointer-lowtag) adjustment))) @@ -532,7 +540,7 @@ (inst shr tmp n-widetag-bits) (inst shl tmp n-fixnum-tag-bits) (inst sub tmp index) - (inst mov value (make-ea-for-raw-slot object index tmp)))) + (inst mov value (make-ea-for-raw-slot object tmp :scale (ash 1 (- word-shift n-fixnum-tag-bits)))))) (define-vop (raw-instance-ref-c/word) (:translate %raw-instance-ref/word) @@ -548,7 +556,7 @@ (: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)))) + (inst mov value (make-ea-for-raw-slot object tmp :index index)))) (define-vop (raw-instance-set/word) (:translate %raw-instance-set/word) @@ -565,7 +573,7 @@ (inst shr tmp n-widetag-bits) (inst shl tmp n-fixnum-tag-bits) (inst sub tmp index) - (inst mov (make-ea-for-raw-slot object index tmp) value) + (inst mov (make-ea-for-raw-slot object tmp :scale (ash 1 (- word-shift n-fixnum-tag-bits))) value) (move result value))) (define-vop (raw-instance-set-c/word) @@ -584,7 +592,7 @@ (: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) + (inst mov (make-ea-for-raw-slot object tmp :index index) value) (move result value))) (define-vop (raw-instance-init/word) @@ -593,7 +601,7 @@ (:arg-types * unsigned-num) (:info instance-length index) (:generator 4 - (inst mov (make-ea-for-raw-slot object index instance-length) value))) + (inst mov (make-ea-for-raw-slot object instance-length :index index) value))) (define-vop (raw-instance-atomic-incf-c/word) (:translate %raw-instance-atomic-incf/word) @@ -611,7 +619,7 @@ (:generator 4 (loadw tmp object 0 instance-pointer-lowtag) (inst shr tmp n-widetag-bits) - (inst xadd (make-ea-for-raw-slot object index tmp) diff :lock) + (inst xadd (make-ea-for-raw-slot object tmp :index index) diff :lock) (move result diff))) (define-vop (raw-instance-ref/single) @@ -628,7 +636,7 @@ (inst shr tmp n-widetag-bits) (inst shl tmp n-fixnum-tag-bits) (inst sub tmp index) - (inst movss value (make-ea-for-raw-slot object index tmp)))) + (inst movss value (make-ea-for-raw-slot object tmp :scale (ash 1 (- word-shift n-fixnum-tag-bits)))))) (define-vop (raw-instance-ref-c/single) (:translate %raw-instance-ref/single) @@ -644,7 +652,7 @@ (: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)))) + (inst movss value (make-ea-for-raw-slot object tmp :index index)))) (define-vop (raw-instance-set/single) (:translate %raw-instance-set/single) @@ -661,7 +669,7 @@ (inst shr tmp n-widetag-bits) (inst shl tmp n-fixnum-tag-bits) (inst sub tmp index) - (inst movss (make-ea-for-raw-slot object index tmp) value) + (inst movss (make-ea-for-raw-slot object tmp :scale (ash 1 (- word-shift n-fixnum-tag-bits))) value) (move result value))) (define-vop (raw-instance-set-c/single) @@ -680,7 +688,7 @@ (: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) + (inst movss (make-ea-for-raw-slot object tmp :index index) value) (move result value))) (define-vop (raw-instance-init/single) @@ -689,7 +697,7 @@ (:arg-types * single-float) (:info instance-length index) (:generator 4 - (inst movss (make-ea-for-raw-slot object index instance-length) value))) + (inst movss (make-ea-for-raw-slot object instance-length :index index) value))) (define-vop (raw-instance-ref/double) (:translate %raw-instance-ref/double) @@ -705,7 +713,7 @@ (inst shr tmp n-widetag-bits) (inst shl tmp n-fixnum-tag-bits) (inst sub tmp index) - (inst movsd value (make-ea-for-raw-slot object index tmp)))) + (inst movsd value (make-ea-for-raw-slot object tmp :scale (ash 1 (- word-shift n-fixnum-tag-bits)))))) (define-vop (raw-instance-ref-c/double) (:translate %raw-instance-ref/double) @@ -721,7 +729,7 @@ (: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)))) + (inst movsd value (make-ea-for-raw-slot object tmp :index index)))) (define-vop (raw-instance-set/double) (:translate %raw-instance-set/double) @@ -738,7 +746,7 @@ (inst shr tmp n-widetag-bits) (inst shl tmp n-fixnum-tag-bits) (inst sub tmp index) - (inst movsd (make-ea-for-raw-slot object index tmp) value) + (inst movsd (make-ea-for-raw-slot object tmp :scale (ash 1 (- word-shift n-fixnum-tag-bits))) value) (move result value))) (define-vop (raw-instance-set-c/double) @@ -757,7 +765,7 @@ (: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) + (inst movsd (make-ea-for-raw-slot object tmp :index index) value) (move result value))) (define-vop (raw-instance-init/double) @@ -766,7 +774,7 @@ (:arg-types * double-float) (:info instance-length index) (:generator 4 - (inst movsd (make-ea-for-raw-slot object index instance-length) value))) + (inst movsd (make-ea-for-raw-slot object instance-length :index index) value))) (define-vop (raw-instance-ref/complex-single) (:translate %raw-instance-ref/complex-single) @@ -782,7 +790,7 @@ (inst shr tmp n-widetag-bits) (inst shl tmp n-fixnum-tag-bits) (inst sub tmp index) - (inst movq value (make-ea-for-raw-slot object index tmp)))) + (inst movq value (make-ea-for-raw-slot object tmp :scale (ash 1 (- word-shift n-fixnum-tag-bits)))))) (define-vop (raw-instance-ref-c/complex-single) (:translate %raw-instance-ref/complex-single) @@ -798,7 +806,7 @@ (:generator 4 (loadw tmp object 0 instance-pointer-lowtag) (inst shr tmp n-widetag-bits) - (inst movq value (make-ea-for-raw-slot object index tmp)))) + (inst movq value (make-ea-for-raw-slot object tmp :index index)))) (define-vop (raw-instance-set/complex-single) (:translate %raw-instance-set/complex-single) @@ -816,7 +824,7 @@ (inst shl tmp n-fixnum-tag-bits) (inst sub tmp index) (move result value) - (inst movq (make-ea-for-raw-slot object index tmp) value))) + (inst movq (make-ea-for-raw-slot object tmp :scale (ash 1 (- word-shift n-fixnum-tag-bits))) value))) (define-vop (raw-instance-set-c/complex-single) (:translate %raw-instance-set/complex-single) @@ -835,7 +843,7 @@ (loadw tmp object 0 instance-pointer-lowtag) (inst shr tmp n-widetag-bits) (move result value) - (inst movq (make-ea-for-raw-slot object index tmp) value))) + (inst movq (make-ea-for-raw-slot object tmp :index index) value))) (define-vop (raw-instance-init/complex-single) (:args (object :scs (descriptor-reg)) @@ -843,7 +851,7 @@ (:arg-types * complex-single-float) (:info instance-length index) (:generator 4 - (inst movq (make-ea-for-raw-slot object index instance-length) value))) + (inst movq (make-ea-for-raw-slot object instance-length :index index) value))) (define-vop (raw-instance-ref/complex-double) (:translate %raw-instance-ref/complex-double) @@ -859,7 +867,7 @@ (inst shr tmp n-widetag-bits) (inst shl tmp n-fixnum-tag-bits) (inst sub tmp index) - (inst movdqu value (make-ea-for-raw-slot object index tmp -8)))) + (inst movdqu value (make-ea-for-raw-slot object tmp :scale (ash 1 (- word-shift n-fixnum-tag-bits)) :adjustment -8)))) (define-vop (raw-instance-ref-c/complex-double) (:translate %raw-instance-ref/complex-double) @@ -875,7 +883,7 @@ (:generator 4 (loadw tmp object 0 instance-pointer-lowtag) (inst shr tmp n-widetag-bits) - (inst movdqu value (make-ea-for-raw-slot object index tmp -8)))) + (inst movdqu value (make-ea-for-raw-slot object tmp :index index :adjustment -8)))) (define-vop (raw-instance-set/complex-double) (:translate %raw-instance-set/complex-double) @@ -893,7 +901,7 @@ (inst shl tmp n-fixnum-tag-bits) (inst sub tmp index) (move result value) - (inst movdqu (make-ea-for-raw-slot object index tmp -8) value))) + (inst movdqu (make-ea-for-raw-slot object tmp :scale (ash 1 (- word-shift n-fixnum-tag-bits)) :adjustment -8) value))) (define-vop (raw-instance-set-c/complex-double) (:translate %raw-instance-set/complex-double) @@ -912,7 +920,7 @@ (loadw tmp object 0 instance-pointer-lowtag) (inst shr tmp n-widetag-bits) (move result value) - (inst movdqu (make-ea-for-raw-slot object index tmp -8) value))) + (inst movdqu (make-ea-for-raw-slot object tmp :index index :adjustment -8) value))) (define-vop (raw-instance-init/complex-double) (:args (object :scs (descriptor-reg)) @@ -920,4 +928,4 @@ (:arg-types * complex-double-float) (:info instance-length index) (:generator 4 - (inst movdqu (make-ea-for-raw-slot object index instance-length -8) value))) + (inst movdqu (make-ea-for-raw-slot object instance-length :index index :adjustment -8) value)))