xref: /aosp_15_r20/art/runtime/interpreter/mterp/riscv64/array.S (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker// array-length vA, vB
2*795d594fSAndroid Build Coastguard Worker// Format 12x: B|A|21
3*795d594fSAndroid Build Coastguard Worker// Store in the given destination register the length of the indicated array, in entries
4*795d594fSAndroid Build Coastguard Worker%def op_array_length():
5*795d594fSAndroid Build Coastguard Worker   srliw t0, xINST, 12     // t0 := B
6*795d594fSAndroid Build Coastguard Worker   GET_VREG_OBJECT t0, t0  // t0 := refs[B]
7*795d594fSAndroid Build Coastguard Worker   beqz t0, 1f
8*795d594fSAndroid Build Coastguard Worker   srliw t1, xINST, 8      // t1 := B|A
9*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 1
10*795d594fSAndroid Build Coastguard Worker   andi t1, t1, 0xF        // t1 := A
11*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3
12*795d594fSAndroid Build Coastguard Worker   lw t2, MIRROR_ARRAY_LENGTH_OFFSET(t0)
13*795d594fSAndroid Build Coastguard Worker%  set_vreg("t2", "t1", z0="t0")
14*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3
15*795d594fSAndroid Build Coastguard Worker1:
16*795d594fSAndroid Build Coastguard Worker   tail common_errNullObject
17*795d594fSAndroid Build Coastguard Worker
18*795d594fSAndroid Build Coastguard Worker
19*795d594fSAndroid Build Coastguard Worker// new-array vA, vB, type@CCCC
20*795d594fSAndroid Build Coastguard Worker// Format 22c: B|A|23 CCCC
21*795d594fSAndroid Build Coastguard Worker// Construct a new array of the indicated type and size. The type must be an array type.
22*795d594fSAndroid Build Coastguard Worker%def op_new_array():
23*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
24*795d594fSAndroid Build Coastguard Worker   srliw s8, xINST, 8   // s8 := B|A
25*795d594fSAndroid Build Coastguard Worker   srliw s7, xINST, 12  // s7 := B
26*795d594fSAndroid Build Coastguard Worker   andi s8, s8, 0xF     // s8 := A
27*795d594fSAndroid Build Coastguard Worker   FETCH_FROM_THREAD_CACHE /*resolved klass*/a0, .L${opcode}_miss, t0, t1
28*795d594fSAndroid Build Coastguard Worker   TEST_IF_MARKING t0, .L${opcode}_mark
29*795d594fSAndroid Build Coastguard Worker.L${opcode}_resume:
30*795d594fSAndroid Build Coastguard Worker
31*795d594fSAndroid Build Coastguard Worker%  get_vreg("a1", "s7")  # a1 := fp[B] length
32*795d594fSAndroid Build Coastguard Worker   ld t0, THREAD_ALLOC_ARRAY_ENTRYPOINT_OFFSET(xSELF)
33*795d594fSAndroid Build Coastguard Worker   jalr t0     // args a0 (klass), a1 (length)
34*795d594fSAndroid Build Coastguard Worker               // return a0 := new-array
35*795d594fSAndroid Build Coastguard Worker   fence w, w  // constructor fence; main.S has details
36*795d594fSAndroid Build Coastguard Worker
37*795d594fSAndroid Build Coastguard Worker   SET_VREG_OBJECT a0, s8, z0=t0  // refs[A] := new-array
38*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2
39*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
40*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
41*795d594fSAndroid Build Coastguard Worker
42*795d594fSAndroid Build Coastguard Worker.L${opcode}_mark:
43*795d594fSAndroid Build Coastguard Worker   call art_quick_read_barrier_mark_reg10  // a0, klass
44*795d594fSAndroid Build Coastguard Worker   j .L${opcode}_resume
45*795d594fSAndroid Build Coastguard Worker
46*795d594fSAndroid Build Coastguard Worker.L${opcode}_miss:
47*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
48*795d594fSAndroid Build Coastguard Worker   mv a0, xSELF
49*795d594fSAndroid Build Coastguard Worker   ld a1, (sp)  // caller ArtMethod*
50*795d594fSAndroid Build Coastguard Worker   mv a2, xPC
51*795d594fSAndroid Build Coastguard Worker   call nterp_get_class
52*795d594fSAndroid Build Coastguard Worker   j .L${opcode}_resume
53*795d594fSAndroid Build Coastguard Worker
54*795d594fSAndroid Build Coastguard Worker
55*795d594fSAndroid Build Coastguard Worker
56*795d594fSAndroid Build Coastguard Worker
57*795d594fSAndroid Build Coastguard Worker// filled-new-array {vC, vD, vE, vF, vG}, type@BBBB
58*795d594fSAndroid Build Coastguard Worker// Format 35c: A|G|24 BBBB F|E|D|C
59*795d594fSAndroid Build Coastguard Worker// Construct an array of the given type and size, filling it with the supplied contents. The type
60*795d594fSAndroid Build Coastguard Worker// must be an array type. The array's contents must be single-word (that is, no arrays of long or
61*795d594fSAndroid Build Coastguard Worker// double, but reference types are acceptable). The constructed instance is stored as a "result" in
62*795d594fSAndroid Build Coastguard Worker// the same way that the method invocation instructions store their results, so the constructed
63*795d594fSAndroid Build Coastguard Worker// instance must be moved to a register with an immediately subsequent move-result-object
64*795d594fSAndroid Build Coastguard Worker// instruction (if it is to be used).
65*795d594fSAndroid Build Coastguard Worker%def op_filled_new_array(is_range=False):
66*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
67*795d594fSAndroid Build Coastguard Worker   mv a0, xSELF
68*795d594fSAndroid Build Coastguard Worker   ld a1, (sp)  // a1 := caller ArtMethod*
69*795d594fSAndroid Build Coastguard Worker   mv a2, xFP   // a2 := vreg array
70*795d594fSAndroid Build Coastguard Worker   mv a3, xPC
71*795d594fSAndroid Build Coastguard Worker%  if is_range:
72*795d594fSAndroid Build Coastguard Worker     call nterp_filled_new_array_range  // args a0, a1, a2, a3
73*795d594fSAndroid Build Coastguard Worker%  else:
74*795d594fSAndroid Build Coastguard Worker     call nterp_filled_new_array  // args a0, a1, a2, a3
75*795d594fSAndroid Build Coastguard Worker%#:
76*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 3
77*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
78*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
79*795d594fSAndroid Build Coastguard Worker
80*795d594fSAndroid Build Coastguard Worker
81*795d594fSAndroid Build Coastguard Worker// filled-new-array/range {vCCCC .. vNNNN}, type@BBBB
82*795d594fSAndroid Build Coastguard Worker// where NNNN = CCCC + AA - 1
83*795d594fSAndroid Build Coastguard Worker// Format 3rc: AA|25 BBBB CCCC
84*795d594fSAndroid Build Coastguard Worker// Construct an array of the given type and size, filling it with the supplied contents.
85*795d594fSAndroid Build Coastguard Worker// Clarifications and restrictions are the same as filled-new-array, described above.
86*795d594fSAndroid Build Coastguard Worker%def op_filled_new_array_range():
87*795d594fSAndroid Build Coastguard Worker%  op_filled_new_array(is_range=True)
88*795d594fSAndroid Build Coastguard Worker
89*795d594fSAndroid Build Coastguard Worker
90*795d594fSAndroid Build Coastguard Worker// fill-array-data vAA, +BBBBBBBB
91*795d594fSAndroid Build Coastguard Worker// Format 31t: AA|26 BBBB(lo) BBBB(hi)
92*795d594fSAndroid Build Coastguard Worker// Fill the given array with the indicated data. The reference must be to an array of primitives,
93*795d594fSAndroid Build Coastguard Worker// and the data table must match it in type and must contain no more elements than will fit in the
94*795d594fSAndroid Build Coastguard Worker// array. That is, the array may be larger than the table, and if so, only the initial elements of
95*795d594fSAndroid Build Coastguard Worker// the array are set, leaving the remainder alone.
96*795d594fSAndroid Build Coastguard Worker%def op_fill_array_data():
97*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
98*795d594fSAndroid Build Coastguard Worker   srliw t0, xINST, 8      // t0 := AA
99*795d594fSAndroid Build Coastguard Worker   FETCH t1, count=1, signed=1, width=32
100*795d594fSAndroid Build Coastguard Worker                           // t1 := ssssssssBBBBBBBB
101*795d594fSAndroid Build Coastguard Worker   GET_VREG_OBJECT a1, t0  // a1 := refs[AA] (array ref)
102*795d594fSAndroid Build Coastguard Worker   // +BBBBBBBB offset is in code units. Multiply by 2 for byte offset against dex PC.
103*795d594fSAndroid Build Coastguard Worker   sh1add a0, t1, xPC      // a0 := payload address
104*795d594fSAndroid Build Coastguard Worker   call art_quick_handle_fill_data  // args a0, a1
105*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 3
106*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
107*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
108*795d594fSAndroid Build Coastguard Worker
109*795d594fSAndroid Build Coastguard Worker
110*795d594fSAndroid Build Coastguard Worker// Common setup across APUT and AGET variants.
111*795d594fSAndroid Build Coastguard Worker// Sets \array, \index, and \length registers.
112*795d594fSAndroid Build Coastguard Worker// Branches to null handler and out-of-bounds handler.
113*795d594fSAndroid Build Coastguard Worker%def array_prelude(array, index, length, null_label, oob_label):
114*795d594fSAndroid Build Coastguard Worker   FETCH $index, count=1           // index := CC|BB
115*795d594fSAndroid Build Coastguard Worker   andi $array, $index, 0xFF       // array := BB
116*795d594fSAndroid Build Coastguard Worker   GET_VREG_OBJECT $array, $array  // array := refs[BB], array obj
117*795d594fSAndroid Build Coastguard Worker   beqz $array, $null_label
118*795d594fSAndroid Build Coastguard Worker
119*795d594fSAndroid Build Coastguard Worker   srliw $index, $index, 8         // index := CC
120*795d594fSAndroid Build Coastguard Worker%  get_vreg(index, index)          # index := fp[CC]
121*795d594fSAndroid Build Coastguard Worker   lw $length, MIRROR_ARRAY_LENGTH_OFFSET($array)  // length (signed 32b)
122*795d594fSAndroid Build Coastguard Worker   bgeu $index, $length, $oob_label  // Unsigned comparison also catches negative index.
123*795d594fSAndroid Build Coastguard Worker
124*795d594fSAndroid Build Coastguard Worker
125*795d594fSAndroid Build Coastguard Worker// aget vAA, vBB, vCC
126*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|44 CC|BB
127*795d594fSAndroid Build Coastguard Worker// vAA := vBB[vCC]
128*795d594fSAndroid Build Coastguard Worker%def op_aget(width=32, zext=False):
129*795d594fSAndroid Build Coastguard Worker%  array_prelude(array="t0", index="a0", length="a1", null_label=f".L{opcode}_null", oob_label=f".L{opcode}_oob")
130*795d594fSAndroid Build Coastguard Worker       // t0 := vBB array object, a0 := vCC index, a1 := array length
131*795d594fSAndroid Build Coastguard Worker
132*795d594fSAndroid Build Coastguard Worker%  if width == 8 and zext:
133*795d594fSAndroid Build Coastguard Worker     add t0, a0, t0
134*795d594fSAndroid Build Coastguard Worker     lbu t0, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(t0)
135*795d594fSAndroid Build Coastguard Worker%  elif width == 8:
136*795d594fSAndroid Build Coastguard Worker     add t0, a0, t0
137*795d594fSAndroid Build Coastguard Worker     lb t0, MIRROR_BYTE_ARRAY_DATA_OFFSET(t0)
138*795d594fSAndroid Build Coastguard Worker%  elif width == 16 and zext:
139*795d594fSAndroid Build Coastguard Worker     sh1add t0, a0, t0
140*795d594fSAndroid Build Coastguard Worker     lhu t0, MIRROR_CHAR_ARRAY_DATA_OFFSET(t0)
141*795d594fSAndroid Build Coastguard Worker%  elif width == 16:
142*795d594fSAndroid Build Coastguard Worker     sh1add t0, a0, t0
143*795d594fSAndroid Build Coastguard Worker     lh t0, MIRROR_SHORT_ARRAY_DATA_OFFSET(t0)
144*795d594fSAndroid Build Coastguard Worker%  elif width == 32:
145*795d594fSAndroid Build Coastguard Worker     sh2add t0, a0, t0
146*795d594fSAndroid Build Coastguard Worker     lw t0, MIRROR_INT_ARRAY_DATA_OFFSET(t0)
147*795d594fSAndroid Build Coastguard Worker%  elif width == 64:
148*795d594fSAndroid Build Coastguard Worker     sh3add t0, a0, t0
149*795d594fSAndroid Build Coastguard Worker     ld t0, MIRROR_WIDE_ARRAY_DATA_OFFSET(t0)
150*795d594fSAndroid Build Coastguard Worker%  else:
151*795d594fSAndroid Build Coastguard Worker%    assert False, width
152*795d594fSAndroid Build Coastguard Worker%#:
153*795d594fSAndroid Build Coastguard Worker                       // t0 := *(array obj + data offset + idx * elem_size)
154*795d594fSAndroid Build Coastguard Worker   srliw t1, xINST, 8  // t1 := AA
155*795d594fSAndroid Build Coastguard Worker%  set_vreg("t0", "t1", z0="t2", width=width)
156*795d594fSAndroid Build Coastguard Worker
157*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2
158*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
159*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
160*795d594fSAndroid Build Coastguard Worker
161*795d594fSAndroid Build Coastguard Worker.L${opcode}_null:
162*795d594fSAndroid Build Coastguard Worker   tail common_errNullObject
163*795d594fSAndroid Build Coastguard Worker.L${opcode}_oob:
164*795d594fSAndroid Build Coastguard Worker   tail common_errArrayIndex  // args a0 (index), a1 (length)
165*795d594fSAndroid Build Coastguard Worker
166*795d594fSAndroid Build Coastguard Worker
167*795d594fSAndroid Build Coastguard Worker// aget-wide vAA, vBB, vCC
168*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|45 CC|BB
169*795d594fSAndroid Build Coastguard Worker%def op_aget_wide():
170*795d594fSAndroid Build Coastguard Worker%  op_aget(width=64)
171*795d594fSAndroid Build Coastguard Worker
172*795d594fSAndroid Build Coastguard Worker
173*795d594fSAndroid Build Coastguard Worker// aget-object vAA, vBB, vCC
174*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|46 CC|BB
175*795d594fSAndroid Build Coastguard Worker%def op_aget_object():
176*795d594fSAndroid Build Coastguard Worker%  array_prelude(array="t0", index="a0", length="a1", null_label=f".L{opcode}_null", oob_label=f".L{opcode}_oob")
177*795d594fSAndroid Build Coastguard Worker       // t0 := vBB array object, a0 := vCC index, a1 := array length
178*795d594fSAndroid Build Coastguard Worker
179*795d594fSAndroid Build Coastguard Worker   sh2add t0, a0, t0
180*795d594fSAndroid Build Coastguard Worker   lwu a0, MIRROR_OBJECT_ARRAY_DATA_OFFSET(t0)
181*795d594fSAndroid Build Coastguard Worker       // a0 := *(array obj + data offset + idx * elem_size)
182*795d594fSAndroid Build Coastguard Worker   UNPOISON_HEAP_REF a0
183*795d594fSAndroid Build Coastguard Worker   TEST_IF_MARKING t1, .L${opcode}_mark
184*795d594fSAndroid Build Coastguard Worker.L${opcode}_mark_resume:
185*795d594fSAndroid Build Coastguard Worker   srliw t1, xINST, 8  // t1 := AA
186*795d594fSAndroid Build Coastguard Worker   SET_VREG_OBJECT a0, t1, z0=t2
187*795d594fSAndroid Build Coastguard Worker
188*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2
189*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
190*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
191*795d594fSAndroid Build Coastguard Worker
192*795d594fSAndroid Build Coastguard Worker.L${opcode}_mark:
193*795d594fSAndroid Build Coastguard Worker   call art_quick_read_barrier_mark_reg10  // a0, object elem
194*795d594fSAndroid Build Coastguard Worker   j .L${opcode}_mark_resume
195*795d594fSAndroid Build Coastguard Worker.L${opcode}_null:
196*795d594fSAndroid Build Coastguard Worker   tail common_errNullObject
197*795d594fSAndroid Build Coastguard Worker.L${opcode}_oob:
198*795d594fSAndroid Build Coastguard Worker   tail common_errArrayIndex  // args a0 (index), a1 (length)
199*795d594fSAndroid Build Coastguard Worker
200*795d594fSAndroid Build Coastguard Worker
201*795d594fSAndroid Build Coastguard Worker// aget-boolean vAA, vBB, vCC
202*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|47 CC|BB
203*795d594fSAndroid Build Coastguard Worker%def op_aget_boolean():
204*795d594fSAndroid Build Coastguard Worker%  op_aget(width=8, zext=True)
205*795d594fSAndroid Build Coastguard Worker
206*795d594fSAndroid Build Coastguard Worker
207*795d594fSAndroid Build Coastguard Worker// aget-byte vAA, vBB, vCC
208*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|48 CC|BB
209*795d594fSAndroid Build Coastguard Worker%def op_aget_byte():
210*795d594fSAndroid Build Coastguard Worker%  op_aget(width=8)
211*795d594fSAndroid Build Coastguard Worker
212*795d594fSAndroid Build Coastguard Worker
213*795d594fSAndroid Build Coastguard Worker// aget_char vAA, vBB, vCC
214*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|49 CC|BB
215*795d594fSAndroid Build Coastguard Worker%def op_aget_char():
216*795d594fSAndroid Build Coastguard Worker%  op_aget(width=16, zext=True)
217*795d594fSAndroid Build Coastguard Worker
218*795d594fSAndroid Build Coastguard Worker
219*795d594fSAndroid Build Coastguard Worker// aget-short vAA, vBB, vCC
220*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4a CC|BB
221*795d594fSAndroid Build Coastguard Worker%def op_aget_short():
222*795d594fSAndroid Build Coastguard Worker%  op_aget(width=16)
223*795d594fSAndroid Build Coastguard Worker
224*795d594fSAndroid Build Coastguard Worker
225*795d594fSAndroid Build Coastguard Worker// aput vAA, vBB, vCC
226*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4b CC|BB
227*795d594fSAndroid Build Coastguard Worker// vBB[vCC] := vAA
228*795d594fSAndroid Build Coastguard Worker%def op_aput(width=32, zext=False):
229*795d594fSAndroid Build Coastguard Worker%  array_prelude(array="t0", index="t1", length="t2", null_label=f".L{opcode}_null", oob_label=f".L{opcode}_oob")
230*795d594fSAndroid Build Coastguard Worker       // t0 := vBB array object, t1 := vCC zext index, t2 := array length
231*795d594fSAndroid Build Coastguard Worker
232*795d594fSAndroid Build Coastguard Worker   srliw t2, xINST, 8      // t2 := AA
233*795d594fSAndroid Build Coastguard Worker%  get_vreg("t2", "t2", width=width)  # t2 := fp[AA]
234*795d594fSAndroid Build Coastguard Worker%  if width == 8 and zext:
235*795d594fSAndroid Build Coastguard Worker     add t0, t1, t0
236*795d594fSAndroid Build Coastguard Worker     sb t2, MIRROR_BOOLEAN_ARRAY_DATA_OFFSET(t0)
237*795d594fSAndroid Build Coastguard Worker%  elif width == 8:
238*795d594fSAndroid Build Coastguard Worker     add t0, t1, t0
239*795d594fSAndroid Build Coastguard Worker     sb t2, MIRROR_BYTE_ARRAY_DATA_OFFSET(t0)
240*795d594fSAndroid Build Coastguard Worker%  elif width == 16 and zext:
241*795d594fSAndroid Build Coastguard Worker     sh1add t0, t1, t0
242*795d594fSAndroid Build Coastguard Worker     sh t2, MIRROR_CHAR_ARRAY_DATA_OFFSET(t0)
243*795d594fSAndroid Build Coastguard Worker%  elif width == 16:
244*795d594fSAndroid Build Coastguard Worker     sh1add t0, t1, t0
245*795d594fSAndroid Build Coastguard Worker     sh t2, MIRROR_SHORT_ARRAY_DATA_OFFSET(t0)
246*795d594fSAndroid Build Coastguard Worker%  elif width == 32:
247*795d594fSAndroid Build Coastguard Worker     sh2add t0, t1, t0
248*795d594fSAndroid Build Coastguard Worker     sw t2, MIRROR_INT_ARRAY_DATA_OFFSET(t0)
249*795d594fSAndroid Build Coastguard Worker%  elif width == 64:
250*795d594fSAndroid Build Coastguard Worker     sh3add t0, t1, t0
251*795d594fSAndroid Build Coastguard Worker     sd t2, MIRROR_WIDE_ARRAY_DATA_OFFSET(t0)
252*795d594fSAndroid Build Coastguard Worker%  else:
253*795d594fSAndroid Build Coastguard Worker%    assert False, width
254*795d594fSAndroid Build Coastguard Worker%#:
255*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2
256*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
257*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
258*795d594fSAndroid Build Coastguard Worker
259*795d594fSAndroid Build Coastguard Worker.L${opcode}_null:
260*795d594fSAndroid Build Coastguard Worker   tail common_errNullObject
261*795d594fSAndroid Build Coastguard Worker.L${opcode}_oob:
262*795d594fSAndroid Build Coastguard Worker   sext.w a0, t1
263*795d594fSAndroid Build Coastguard Worker   mv a1, t2
264*795d594fSAndroid Build Coastguard Worker   tail common_errArrayIndex  // args a0 (index), a1 (length)
265*795d594fSAndroid Build Coastguard Worker
266*795d594fSAndroid Build Coastguard Worker
267*795d594fSAndroid Build Coastguard Worker// aput-wide vAA, vBB, vCC
268*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4c CC|BB
269*795d594fSAndroid Build Coastguard Worker%def op_aput_wide():
270*795d594fSAndroid Build Coastguard Worker%  op_aput(width=64)
271*795d594fSAndroid Build Coastguard Worker
272*795d594fSAndroid Build Coastguard Worker
273*795d594fSAndroid Build Coastguard Worker// aput-object vAA, vBB, vCC
274*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4d CC|BB
275*795d594fSAndroid Build Coastguard Worker%def op_aput_object():
276*795d594fSAndroid Build Coastguard Worker%  array_prelude(array="a0", index="a1", length="a2", null_label=f".L{opcode}_null", oob_label=f".L{opcode}_oob")
277*795d594fSAndroid Build Coastguard Worker       // a0 := vBB array object, a1 := vCC zext index, a2 := array length
278*795d594fSAndroid Build Coastguard Worker
279*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
280*795d594fSAndroid Build Coastguard Worker   srliw a2, xINST, 8       // a2 := AA
281*795d594fSAndroid Build Coastguard Worker   GET_VREG_OBJECT a2, a2   // a2 := fp[AA]
282*795d594fSAndroid Build Coastguard Worker   sext.w a1, a1            // a1 := sext index
283*795d594fSAndroid Build Coastguard Worker   call art_quick_aput_obj  // args a0 (array obj), a1 (index), a2 (obj)
284*795d594fSAndroid Build Coastguard Worker
285*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2
286*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
287*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
288*795d594fSAndroid Build Coastguard Worker
289*795d594fSAndroid Build Coastguard Worker.L${opcode}_null:
290*795d594fSAndroid Build Coastguard Worker   tail common_errNullObject
291*795d594fSAndroid Build Coastguard Worker.L${opcode}_oob:
292*795d594fSAndroid Build Coastguard Worker   sext.w a0, a1
293*795d594fSAndroid Build Coastguard Worker   mv a1, a2
294*795d594fSAndroid Build Coastguard Worker   tail common_errArrayIndex  // args a0 (index), a1 (length)
295*795d594fSAndroid Build Coastguard Worker
296*795d594fSAndroid Build Coastguard Worker// aput-boolean vAA, vBB, vCC
297*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4e CC|BB
298*795d594fSAndroid Build Coastguard Worker%def op_aput_boolean():
299*795d594fSAndroid Build Coastguard Worker%  op_aput(width=8, zext=True)
300*795d594fSAndroid Build Coastguard Worker
301*795d594fSAndroid Build Coastguard Worker
302*795d594fSAndroid Build Coastguard Worker// aput-byte vAA, vBB, vCC
303*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|4f CC|BB
304*795d594fSAndroid Build Coastguard Worker%def op_aput_byte():
305*795d594fSAndroid Build Coastguard Worker%  op_aput(width=8)
306*795d594fSAndroid Build Coastguard Worker
307*795d594fSAndroid Build Coastguard Worker
308*795d594fSAndroid Build Coastguard Worker// aput-char vAA, vBB, vCC
309*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|50 CC|BB
310*795d594fSAndroid Build Coastguard Worker%def op_aput_char():
311*795d594fSAndroid Build Coastguard Worker%  op_aput(width=16, zext=True)
312*795d594fSAndroid Build Coastguard Worker
313*795d594fSAndroid Build Coastguard Worker
314*795d594fSAndroid Build Coastguard Worker// aput-short vAA, vBB, vCC
315*795d594fSAndroid Build Coastguard Worker// Format 23x: AA|51 CC|BB
316*795d594fSAndroid Build Coastguard Worker%def op_aput_short():
317*795d594fSAndroid Build Coastguard Worker%  op_aput(width=16)
318