(:note "inline array store")
(:translate data-vector-set)
(:policy :fast-safe)
- (:args (object :scs (descriptor-reg))
+ (:args (object :scs (descriptor-reg) :to (:argument 2))
(index :scs (unsigned-reg) :target ecx)
(value :scs (unsigned-reg immediate) :target result))
(:arg-types ,type positive-fixnum positive-fixnum)
(:result-types positive-fixnum)
(:temporary (:sc unsigned-reg) word-index)
(:temporary (:sc unsigned-reg) old)
- (:temporary (:sc unsigned-reg :offset ecx-offset) ecx)
+ (:temporary (:sc unsigned-reg :offset ecx-offset :from (:argument 1)) ecx)
(:generator 25
(move word-index index)
(inst shr word-index ,bit-shift)
(inst ,ref-inst value
(make-ea :word :base object
:disp (- (+ (* vector-data-offset n-word-bytes)
- (* 2 (+ offset (tn-value index)))
- other-pointer-lowtag)))))
+ (* 2 (+ offset (tn-value index))))
+ other-pointer-lowtag))))
(t
(inst ,ref-inst value
(make-ea :word :base object :index index :scale 2
\f
;;; These vops are useful for accessing the bits of a vector
;;; irrespective of what type of vector it is.
-(define-full-reffer raw-bits * 0 other-pointer-lowtag (unsigned-reg)
- unsigned-num %raw-bits)
-(define-full-setter set-raw-bits * 0 other-pointer-lowtag (unsigned-reg)
- unsigned-num %set-raw-bits)
-(define-full-reffer vector-raw-bits * vector-data-offset other-pointer-lowtag
- (unsigned-reg) unsigned-num %vector-raw-bits)
-(define-full-setter set-vector-raw-bits * vector-data-offset other-pointer-lowtag
- (unsigned-reg) unsigned-num %set-vector-raw-bits)
+(define-full-reffer+offset raw-bits-with-offset * 0 other-pointer-lowtag (unsigned-reg)
+ unsigned-num %raw-bits-with-offset)
+(define-full-setter+offset set-raw-bits-with-offset * 0 other-pointer-lowtag (unsigned-reg)
+ unsigned-num %set-raw-bits-with-offset)
+
\f
;;;; miscellaneous array VOPs