(:policy :fast-safe)
(:generator 4
(move result value)
- (inst xadd (make-ea :dword :base object
- :disp (- (* offset n-word-bytes) lowtag))
+ (inst xadd (make-ea-for-object-slot object offset lowtag)
value)))
;;; SLOT-REF and SLOT-SET are used to define VOPs like CLOSURE-REF,
(:variant-vars base lowtag)
(:info offset)
(:generator 4
- (if (sc-is value immediate)
- (let ((val (tn-value value)))
- (etypecase val
- (integer
- (inst mov
- (make-ea :dword :base object
- :disp (- (* (+ base offset) n-word-bytes) lowtag))
- (fixnumize val)))
- (symbol
- (inst mov
- (make-ea :dword :base object
- :disp (- (* (+ base offset) n-word-bytes) lowtag))
- (+ nil-value (static-symbol-offset val))))
- (character
- (inst mov
- (make-ea :dword :base object
- :disp (- (* (+ base offset) n-word-bytes) lowtag))
- (logior (ash (char-code val) n-widetag-bits)
- character-widetag)))))
- ;; Else, value not immediate.
- (storew value object (+ base offset) lowtag))))
+ (storew (encode-value-if-immediate value) object (+ base offset) lowtag)))
(define-vop (slot-set-conditional)
(:args (object :scs (descriptor-reg) :to :eval)
(:generator 4
(move eax old-value)
(move temp new-value)
- (inst cmpxchg (make-ea :dword :base object
- :disp (- (* (+ base offset) n-word-bytes) lowtag))
+ (inst cmpxchg (make-ea-for-object-slot object (+ base offset) lowtag)
temp)
(move result eax)))
(:info offset)
(:generator 4
(move result value)
- (inst xadd (make-ea :dword :base object
- :disp (- (* (+ base offset) n-word-bytes) lowtag))
+ (inst xadd (make-ea-for-object-slot object (+ base offset) lowtag)
value)))