(:ignore name)
(:results)
(:generator 1
- (if (sc-is value immediate)
- (let ((val (tn-value value)))
- (etypecase val
- (integer
- (inst mov
- (make-ea :dword :base object
- :disp (- (* offset n-word-bytes) lowtag))
- (fixnumize val)))
- (symbol
- (inst mov
- (make-ea :dword :base object
- :disp (- (* offset n-word-bytes) lowtag))
- (+ nil-value (static-symbol-offset val))))
- (character
- (inst mov
- (make-ea :dword :base object
- :disp (- (* offset n-word-bytes) lowtag))
- (logior (ash (char-code val) n-widetag-bits)
- character-widetag)))))
- ;; Else, value not immediate.
- (storew value object offset lowtag))))
+ (storew (encode-value-if-immediate value) object offset lowtag)))
\f
(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
(:generator 4
(move result value)
(inst lock)
- (inst add (make-ea :dword :base object
- :disp (- (* symbol-value-slot n-word-bytes)
- other-pointer-lowtag))
+ (inst add (make-ea-for-object-slot object symbol-value-slot
+ other-pointer-lowtag)
value)))
#!+sb-thread
(: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)))
(:generator 38
(load-type type function (- fun-pointer-lowtag))
(inst lea raw
- (make-ea :byte :base function
- :disp (- (* simple-fun-code-offset n-word-bytes)
- fun-pointer-lowtag)))
+ (make-ea-for-object-slot function simple-fun-code-offset
+ fun-pointer-lowtag))
(inst cmp type simple-fun-header-widetag)
(inst jmp :e normal-fn)
(inst lea raw (make-fixup "closure_tramp" :foreign))
(inst fs-segment-prefix)
(inst mov (make-ea :dword :base 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)))
(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*)))
tls-index symbol symbol-tls-index-slot other-pointer-lowtag)
#!+sb-thread (inst fs-segment-prefix)
#!+sb-thread (inst mov (make-ea :dword :base 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)
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))
(loadw res struct 0 instance-pointer-lowtag)
(inst shr res n-widetag-bits)))
-(define-full-reffer instance-index-ref * instance-slots-offset
- instance-pointer-lowtag (any-reg descriptor-reg) * %instance-ref)
-
-(define-full-setter instance-index-set * instance-slots-offset
- instance-pointer-lowtag (any-reg descriptor-reg) * %instance-set)
-
-
-(defknown %instance-set-conditional (instance index t t) t
- (unsafe))
-
-(define-vop (instance-set-conditional)
- (:translate %instance-set-conditional)
- (:args (object :scs (descriptor-reg) :to :eval)
- (slot :scs (any-reg) :to :result)
- (old-value :scs (descriptor-reg any-reg) :target eax)
- (new-value :scs (descriptor-reg any-reg)))
- (:arg-types instance positive-fixnum * *)
- (:temporary (:sc descriptor-reg :offset eax-offset
- :from (:argument 2) :to :result :target result) eax)
- (:results (result :scs (descriptor-reg any-reg)))
- ;(:guard (backend-featurep :i486))
- (:policy :fast-safe)
- (:generator 5
- (move eax old-value)
- (inst lock)
- (inst cmpxchg (make-ea :dword :base object :index slot :scale 1
- :disp (- (* instance-slots-offset n-word-bytes)
- instance-pointer-lowtag))
- new-value)
- (move result eax)))
+(define-full-reffer instance-index-ref *
+ instance-slots-offset instance-pointer-lowtag
+ (any-reg descriptor-reg) *
+ %instance-ref)
+(define-full-setter instance-index-set *
+ instance-slots-offset instance-pointer-lowtag
+ (any-reg descriptor-reg) *
+ %instance-set)
+(define-full-compare-and-swap instance-compare-and-swap instance
+ instance-slots-offset instance-pointer-lowtag
+ (any-reg descriptor-reg) *
+ %instance-compare-and-swap)
\f
;;;; code object frobbing
(define-full-setter code-header-set * 0 other-pointer-lowtag
(any-reg descriptor-reg) * code-header-set)
-
-
\f
;;;; raw instance slot accessors
+(defun make-ea-for-raw-slot (object index instance-length n-words)
+ (sc-case index
+ (any-reg (make-ea :dword
+ :base object
+ :index instance-length
+ :disp (- (* (- instance-slots-offset n-words)
+ n-word-bytes)
+ instance-pointer-lowtag)))
+ (immediate (make-ea :dword :base object
+ :index instance-length
+ :scale 4
+ :disp (- (* (- instance-slots-offset n-words)
+ n-word-bytes)
+ instance-pointer-lowtag
+ (fixnumize (tn-value index)))))))
+
(define-vop (raw-instance-ref/word)
(:translate %raw-instance-ref/word)
(:policy :fast-safe)
- (:args (object :scs (descriptor-reg)) (index :scs (any-reg)))
+ (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate)))
(:arg-types * tagged-num)
(:temporary (:sc unsigned-reg) tmp)
(:results (value :scs (unsigned-reg)))
(:generator 5
(loadw tmp object 0 instance-pointer-lowtag)
(inst shr tmp n-widetag-bits)
- (inst shl tmp 2)
- (inst sub tmp index)
- (inst mov
- value
- (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (1- instance-slots-offset) n-word-bytes)
- instance-pointer-lowtag)))))
+ (when (sc-is index any-reg)
+ (inst shl tmp 2)
+ (inst sub tmp index))
+ (inst mov value (make-ea-for-raw-slot object index tmp 1))))
(define-vop (raw-instance-set/word)
(:translate %raw-instance-set/word)
(:policy :fast-safe)
(:args (object :scs (descriptor-reg))
- (index :scs (any-reg))
+ (index :scs (any-reg immediate))
(value :scs (unsigned-reg) :target result))
(:arg-types * tagged-num unsigned-num)
(:temporary (:sc unsigned-reg) tmp)
(:generator 5
(loadw tmp object 0 instance-pointer-lowtag)
(inst shr tmp n-widetag-bits)
- (inst shl tmp 2)
- (inst sub tmp index)
- (inst mov
- (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (1- instance-slots-offset) n-word-bytes)
- instance-pointer-lowtag))
- value)
+ (when (sc-is index any-reg)
+ (inst shl tmp 2)
+ (inst sub tmp index))
+ (inst mov (make-ea-for-raw-slot object index tmp 1) value)
(move result value)))
(define-vop (raw-instance-ref/single)
(:translate %raw-instance-ref/single)
(:policy :fast-safe)
- (:args (object :scs (descriptor-reg)) (index :scs (any-reg)))
+ (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate)))
(:arg-types * tagged-num)
(:temporary (:sc unsigned-reg) tmp)
(:results (value :scs (single-reg)))
(:generator 5
(loadw tmp object 0 instance-pointer-lowtag)
(inst shr tmp n-widetag-bits)
- (inst shl tmp 2)
- (inst sub tmp index)
+ (when (sc-is index any-reg)
+ (inst shl tmp 2)
+ (inst sub tmp index))
(with-empty-tn@fp-top(value)
- (inst fld
- (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (1- instance-slots-offset) n-word-bytes)
- instance-pointer-lowtag))))))
+ (inst fld (make-ea-for-raw-slot object index tmp 1)))))
(define-vop (raw-instance-set/single)
(:translate %raw-instance-set/single)
(:policy :fast-safe)
(:args (object :scs (descriptor-reg))
- (index :scs (any-reg))
+ (index :scs (any-reg immediate))
(value :scs (single-reg) :target result))
(:arg-types * tagged-num single-float)
(:temporary (:sc unsigned-reg) tmp)
(:generator 5
(loadw tmp object 0 instance-pointer-lowtag)
(inst shr tmp n-widetag-bits)
- (inst shl tmp 2)
- (inst sub tmp index)
+ (when (sc-is index any-reg)
+ (inst shl tmp 2)
+ (inst sub tmp index))
(unless (zerop (tn-offset value))
(inst fxch value))
- (inst fst
- (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (1- instance-slots-offset) n-word-bytes)
- instance-pointer-lowtag)))
+ (inst fst (make-ea-for-raw-slot object index tmp 1))
(cond
((zerop (tn-offset value))
(unless (zerop (tn-offset result))
(define-vop (raw-instance-ref/double)
(:translate %raw-instance-ref/double)
(:policy :fast-safe)
- (:args (object :scs (descriptor-reg)) (index :scs (any-reg)))
+ (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate)))
(:arg-types * tagged-num)
(:temporary (:sc unsigned-reg) tmp)
(:results (value :scs (double-reg)))
(:generator 5
(loadw tmp object 0 instance-pointer-lowtag)
(inst shr tmp n-widetag-bits)
- (inst shl tmp 2)
- (inst sub tmp index)
+ (when (sc-is index any-reg)
+ (inst shl tmp 2)
+ (inst sub tmp index))
(with-empty-tn@fp-top(value)
- (inst fldd
- (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (- instance-slots-offset 2) n-word-bytes)
- instance-pointer-lowtag))))))
+ (inst fldd (make-ea-for-raw-slot object index tmp 2)))))
(define-vop (raw-instance-set/double)
(:translate %raw-instance-set/double)
(:policy :fast-safe)
(:args (object :scs (descriptor-reg))
- (index :scs (any-reg))
+ (index :scs (any-reg immediate))
(value :scs (double-reg) :target result))
(:arg-types * tagged-num double-float)
(:temporary (:sc unsigned-reg) tmp)
(:generator 5
(loadw tmp object 0 instance-pointer-lowtag)
(inst shr tmp n-widetag-bits)
- (inst shl tmp 2)
- (inst sub tmp index)
+ (when (sc-is index any-reg)
+ (inst shl tmp 2)
+ (inst sub tmp index))
(unless (zerop (tn-offset value))
(inst fxch value))
- (inst fstd
- (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (- instance-slots-offset 2) n-word-bytes)
- instance-pointer-lowtag)))
+ (inst fstd (make-ea-for-raw-slot object index tmp 2))
(cond
((zerop (tn-offset value))
(unless (zerop (tn-offset result))
(:translate %raw-instance-ref/complex-single)
(:policy :fast-safe)
(:args (object :scs (descriptor-reg))
- (index :scs (any-reg)))
+ (index :scs (any-reg immediate)))
(:arg-types * positive-fixnum)
(:temporary (:sc unsigned-reg) tmp)
(:results (value :scs (complex-single-reg)))
(:generator 5
(loadw tmp object 0 instance-pointer-lowtag)
(inst shr tmp n-widetag-bits)
- (inst shl tmp 2)
- (inst sub tmp index)
+ (when (sc-is index any-reg)
+ (inst shl tmp 2)
+ (inst sub tmp index))
(let ((real-tn (complex-single-reg-real-tn value)))
(with-empty-tn@fp-top (real-tn)
- (inst fld (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (- instance-slots-offset 2)
- n-word-bytes)
- instance-pointer-lowtag)))))
+ (inst fld (make-ea-for-raw-slot object index tmp 2))))
(let ((imag-tn (complex-single-reg-imag-tn value)))
(with-empty-tn@fp-top (imag-tn)
- (inst fld (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (1- instance-slots-offset)
- n-word-bytes)
- instance-pointer-lowtag)))))))
+ (inst fld (make-ea-for-raw-slot object index tmp 1))))))
(define-vop (raw-instance-set/complex-single)
(:translate %raw-instance-set/complex-single)
(:policy :fast-safe)
(:args (object :scs (descriptor-reg))
- (index :scs (any-reg))
+ (index :scs (any-reg immediate))
(value :scs (complex-single-reg) :target result))
(:arg-types * positive-fixnum complex-single-float)
(:temporary (:sc unsigned-reg) tmp)
(:generator 5
(loadw tmp object 0 instance-pointer-lowtag)
(inst shr tmp n-widetag-bits)
- (inst shl tmp 2)
- (inst sub tmp index)
+ (when (sc-is index any-reg)
+ (inst shl tmp 2)
+ (inst sub tmp index))
(let ((value-real (complex-single-reg-real-tn value))
(result-real (complex-single-reg-real-tn result)))
(cond ((zerop (tn-offset value-real))
;; Value is in ST0.
- (inst fst (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (- instance-slots-offset 2)
- n-word-bytes)
- instance-pointer-lowtag)))
+ (inst fst (make-ea-for-raw-slot object index tmp 2))
(unless (zerop (tn-offset result-real))
;; Value is in ST0 but not result.
(inst fst result-real)))
(t
;; Value is not in ST0.
(inst fxch value-real)
- (inst fst (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (- instance-slots-offset 2)
- n-word-bytes)
- instance-pointer-lowtag)))
+ (inst fst (make-ea-for-raw-slot object index tmp 2))
(cond ((zerop (tn-offset result-real))
;; The result is in ST0.
(inst fst value-real))
(let ((value-imag (complex-single-reg-imag-tn value))
(result-imag (complex-single-reg-imag-tn result)))
(inst fxch value-imag)
- (inst fst (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (1- instance-slots-offset)
- n-word-bytes)
- instance-pointer-lowtag)))
+ (inst fst (make-ea-for-raw-slot object index tmp 1))
(unless (location= value-imag result-imag)
(inst fst result-imag))
(inst fxch value-imag))))
(:translate %raw-instance-ref/complex-double)
(:policy :fast-safe)
(:args (object :scs (descriptor-reg))
- (index :scs (any-reg)))
+ (index :scs (any-reg immediate)))
(:arg-types * positive-fixnum)
(:temporary (:sc unsigned-reg) tmp)
(:results (value :scs (complex-double-reg)))
(:generator 7
(loadw tmp object 0 instance-pointer-lowtag)
(inst shr tmp n-widetag-bits)
- (inst shl tmp 2)
- (inst sub tmp index)
+ (when (sc-is index any-reg)
+ (inst shl tmp 2)
+ (inst sub tmp index))
(let ((real-tn (complex-double-reg-real-tn value)))
(with-empty-tn@fp-top (real-tn)
- (inst fldd (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (- instance-slots-offset 4)
- n-word-bytes)
- instance-pointer-lowtag)))))
+ (inst fldd (make-ea-for-raw-slot object index tmp 4))))
(let ((imag-tn (complex-double-reg-imag-tn value)))
(with-empty-tn@fp-top (imag-tn)
- (inst fldd (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (- instance-slots-offset 2)
- n-word-bytes)
- instance-pointer-lowtag)))))))
+ (inst fldd (make-ea-for-raw-slot object index tmp 2))))))
(define-vop (raw-instance-set/complex-double)
(:translate %raw-instance-set/complex-double)
(:policy :fast-safe)
(:args (object :scs (descriptor-reg))
- (index :scs (any-reg))
+ (index :scs (any-reg immediate))
(value :scs (complex-double-reg) :target result))
(:arg-types * positive-fixnum complex-double-float)
(:temporary (:sc unsigned-reg) tmp)
(:generator 20
(loadw tmp object 0 instance-pointer-lowtag)
(inst shr tmp n-widetag-bits)
- (inst shl tmp 2)
- (inst sub tmp index)
+ (when (sc-is index any-reg)
+ (inst shl tmp 2)
+ (inst sub tmp index))
(let ((value-real (complex-double-reg-real-tn value))
(result-real (complex-double-reg-real-tn result)))
(cond ((zerop (tn-offset value-real))
;; Value is in ST0.
- (inst fstd (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (- instance-slots-offset 4)
- n-word-bytes)
- instance-pointer-lowtag)))
+ (inst fstd (make-ea-for-raw-slot object index tmp 4))
(unless (zerop (tn-offset result-real))
;; Value is in ST0 but not result.
(inst fstd result-real)))
(t
;; Value is not in ST0.
(inst fxch value-real)
- (inst fstd (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (- instance-slots-offset 4)
- n-word-bytes)
- instance-pointer-lowtag)))
+ (inst fstd (make-ea-for-raw-slot object index tmp 4))
(cond ((zerop (tn-offset result-real))
;; The result is in ST0.
(inst fstd value-real))
(let ((value-imag (complex-double-reg-imag-tn value))
(result-imag (complex-double-reg-imag-tn result)))
(inst fxch value-imag)
- (inst fstd (make-ea :dword
- :base object
- :index tmp
- :disp (- (* (- instance-slots-offset 2)
- n-word-bytes)
- instance-pointer-lowtag)))
+ (inst fstd (make-ea-for-raw-slot object index tmp 2))
(unless (location= value-imag result-imag)
(inst fstd result-imag))
(inst fxch value-imag))))