1 ;;; reference VOPs inherited by basic memory reference operations.
3 ;;; Written by Rob MacLachlan
5 ;;; Converted by William Lott.
10 ;;; Cell-Ref and Cell-Set are used to define VOPs like CAR, where the offset to
11 ;;; be read or written is a property of the VOP used.
13 (define-vop (cell-ref)
14 (:args (object :scs (descriptor-reg)))
15 (:results (value :scs (descriptor-reg any-reg)))
16 (:variant-vars offset lowtag)
19 (loadw value object offset lowtag)))
21 (define-vop (cell-set)
22 (:args (object :scs (descriptor-reg))
23 (value :scs (descriptor-reg any-reg)))
24 (:variant-vars offset lowtag)
27 (storew value object offset lowtag)))
29 ;;; Slot-Ref and Slot-Set are used to define VOPs like Closure-Ref, where the
30 ;;; offset is constant at compile time, but varies for different uses. We add
31 ;;; in the standard g-vector overhead.
33 (define-vop (slot-ref)
34 (:args (object :scs (descriptor-reg)))
35 (:results (value :scs (descriptor-reg any-reg)))
36 (:variant-vars base lowtag)
39 (loadw value object (+ base offset) lowtag)))
41 (define-vop (slot-set)
42 (:args (object :scs (descriptor-reg))
43 (value :scs (descriptor-reg any-reg)))
44 (:variant-vars base lowtag)
47 (storew value object (+ base offset) lowtag)))
51 ;;;; Indexed references:
53 ;;; Define some VOPs for indexed memory reference.
54 (defmacro define-indexer (name write-p ri-op rr-op shift &optional sign-extend-byte)
56 (:args (object :scs (descriptor-reg))
57 (index :scs (any-reg zero immediate))
59 '((value :scs (any-reg descriptor-reg) :target result))))
60 (:arg-types * tagged-num ,@(when write-p '(*)))
61 (:temporary (:scs (non-descriptor-reg)) temp)
62 (:results (,(if write-p 'result 'value)
63 :scs (any-reg descriptor-reg)))
65 (:variant-vars offset lowtag)
70 (let ((offset (- (+ (if (sc-is index zero)
73 (- sb!vm:word-shift ,shift)))
74 (ash offset sb!vm:word-shift))
78 (inst ,ri-op value object offset))
79 ((or (unsigned-byte 32) (signed-byte 32))
81 (inst ,rr-op value object temp)))))
83 ,@(unless (zerop shift)
84 `((inst srwi temp index ,shift)))
85 (inst addi temp ,(if (zerop shift) 'index 'temp)
86 (- (ash offset sb!vm:word-shift) lowtag))
87 (inst ,rr-op value object temp)))
88 ,@(when sign-extend-byte
89 `((inst extsb value value)))
91 '((move result value))))))
93 (define-indexer word-index-ref nil lwz lwzx 0)
94 (define-indexer word-index-set t stw stwx 0)
95 (define-indexer halfword-index-ref nil lhz lhzx 1)
96 (define-indexer signed-halfword-index-ref nil lha lhax 1)
97 (define-indexer halfword-index-set t sth sthx 1)
98 (define-indexer byte-index-ref nil lbz lbzx 2)
99 (define-indexer signed-byte-index-ref nil lbz lbzx 2 t)
100 (define-indexer byte-index-set t stb stbx 2)