(:generator 1
(storew value object offset lowtag)))
+(define-vop (init-slot set-slot))
+
#!+compare-and-swap-vops
(define-vop (compare-and-swap-slot)
(:args (object :scs (descriptor-reg))
;;; BIND -- Establish VAL as a binding for SYMBOL. Save the old value and
;;; the symbol on the binding stack and stuff the new value into the
;;; symbol.
-
+;;; See the "Chapter 9: Specials" of the SBCL Internals Manual.
#!+sb-thread
(define-vop (bind)
(:args (val :scs (any-reg descriptor-reg))
TLS-VALID
(inst lwzx temp thread-base-tn tls-index)
- (inst addi bsp-tn bsp-tn (* 2 n-word-bytes))
+ (inst addi bsp-tn bsp-tn (* binding-size n-word-bytes))
(storew temp bsp-tn (- binding-value-slot binding-size))
- (storew symbol bsp-tn (- binding-symbol-slot binding-size))
+ (storew tls-index bsp-tn (- binding-symbol-slot binding-size))
(inst stwx val thread-base-tn tls-index)))
#!-sb-thread
(:temporary (:scs (descriptor-reg)) temp)
(:generator 5
(loadw temp symbol symbol-value-slot other-pointer-lowtag)
- (inst addi bsp-tn bsp-tn (* 2 n-word-bytes))
+ (inst addi bsp-tn bsp-tn (* binding-size n-word-bytes))
(storew temp bsp-tn (- binding-value-slot binding-size))
(storew symbol bsp-tn (- binding-symbol-slot binding-size))
(storew val symbol symbol-value-slot other-pointer-lowtag)))
(:temporary (:scs (descriptor-reg)) tls-index value)
(:generator 0
(loadw tls-index bsp-tn (- binding-symbol-slot binding-size))
- (loadw tls-index tls-index symbol-tls-index-slot other-pointer-lowtag)
(loadw value bsp-tn (- binding-value-slot binding-size))
(inst stwx value thread-base-tn tls-index)
(storew zero-tn bsp-tn (- binding-symbol-slot binding-size))
(storew zero-tn bsp-tn (- binding-value-slot binding-size))
- (inst subi bsp-tn bsp-tn (* 2 n-word-bytes))))
+ (inst subi bsp-tn bsp-tn (* binding-size n-word-bytes))))
#!-sb-thread
(define-vop (unbind)
(storew value symbol symbol-value-slot other-pointer-lowtag)
(storew zero-tn bsp-tn (- binding-symbol-slot binding-size))
(storew zero-tn bsp-tn (- binding-value-slot binding-size))
- (inst subi bsp-tn bsp-tn (* 2 n-word-bytes))))
+ (inst subi bsp-tn bsp-tn (* binding-size n-word-bytes))))
(define-vop (unbind-to-here)
(inst beq skip)
(loadw value bsp-tn (- binding-value-slot binding-size))
#!+sb-thread
- (loadw symbol symbol symbol-tls-index-slot other-pointer-lowtag)
- #!+sb-thread
(inst stwx value thread-base-tn symbol)
#!-sb-thread
(storew value symbol symbol-value-slot other-pointer-lowtag)
(emit-label skip)
(storew zero-tn bsp-tn (- binding-value-slot binding-size))
- (inst subi bsp-tn bsp-tn (* 2 n-word-bytes))
+ (inst subi bsp-tn bsp-tn (* binding-size n-word-bytes))
(inst cmpw where bsp-tn)
(inst bne loop)
(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 cfp-tn object (+ closure-info-offset offset) fun-pointer-lowtag)))
\f
;;;; Value Cell hackery.
(:generator 4
(inst stw value object (offset-for-raw-slot instance-length index 1))))
+(define-vop (raw-instance-atomic-incf/word)
+ (:translate %raw-instance-atomic-incf/word)
+ (:policy :fast-safe)
+ (:args (object :scs (descriptor-reg))
+ (index :scs (any-reg))
+ (diff :scs (unsigned-reg)))
+ (:arg-types * positive-fixnum unsigned-num)
+ (:temporary (:sc unsigned-reg) offset)
+ (:temporary (:sc non-descriptor-reg) sum)
+ (:results (result :scs (unsigned-reg) :from :load))
+ (:result-types unsigned-num)
+ (:generator 4
+ (loadw offset object 0 instance-pointer-lowtag)
+ ;; offset = (offset >> n-widetag-bits) << 2
+ (inst rlwinm offset offset (- 32 (- n-widetag-bits 2)) (- n-widetag-bits 2) 29)
+ (inst subf offset index offset)
+ (inst addi
+ offset
+ offset
+ (- (* (1- instance-slots-offset) n-word-bytes)
+ instance-pointer-lowtag))
+ ;; load the slot value, add DIFF, write the sum back, and return
+ ;; the original slot value, atomically, and include a memory
+ ;; barrier.
+ (inst sync)
+ LOOP
+ (inst lwarx result offset object)
+ (inst add sum result diff)
+ (inst stwcx. sum offset object)
+ (inst bne LOOP)
+ (inst isync)))
+
(define-vop (raw-instance-ref/word)
(:translate %raw-instance-ref/word)
(:policy :fast-safe)