;; 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)
;; 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))))
\f
;;;; fdefinition (FDEFN) objects
(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)))
\f
;;;; value cell hackery
\f
;;;; 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.
(- 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)))
(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)
(: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)
(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)
(: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)
(: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)
(: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)
(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)
(: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)
(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)
(: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)
(: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)
(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)
(: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)
(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)
(: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)
(: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)
(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)
(: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)
(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)
(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))
(: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)
(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)
(: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)
(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)
(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))
(: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)))