(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
(: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)))
(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))
\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))))