xref: /aosp_15_r20/art/runtime/interpreter/mterp/riscv64/other.S (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker%def unused():
2*795d594fSAndroid Build Coastguard Worker   ebreak
3*795d594fSAndroid Build Coastguard Worker
4*795d594fSAndroid Build Coastguard Worker// nop
5*795d594fSAndroid Build Coastguard Worker// Format 10x: 00|00
6*795d594fSAndroid Build Coastguard Worker%def op_nop():
7*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 1  // advance xPC, load xINST
8*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0    // t0 holds next opcode
9*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0        // continue to next
10*795d594fSAndroid Build Coastguard Worker
11*795d594fSAndroid Build Coastguard Worker// move vA, vB
12*795d594fSAndroid Build Coastguard Worker// Format 12x: B|A|01
13*795d594fSAndroid Build Coastguard Worker%def op_move(is_object=False, is_wide=False):
14*795d594fSAndroid Build Coastguard Worker   srliw t1, xINST, 12   // t1 := B
15*795d594fSAndroid Build Coastguard Worker   srliw t2, xINST, 8    // t2 := B|A
16*795d594fSAndroid Build Coastguard Worker%  if is_object:
17*795d594fSAndroid Build Coastguard Worker     // Note: leaves a useful breadcrumb if the reference is corrupted, unlike GET_VREG_OBJECT.
18*795d594fSAndroid Build Coastguard Worker%    get_vreg("t1", "t1", is_unsigned=True)  # t1 = fp[B], zext
19*795d594fSAndroid Build Coastguard Worker%  else:
20*795d594fSAndroid Build Coastguard Worker%    get_vreg("t1", "t1", is_wide=is_wide)  # t1 := fp[B]
21*795d594fSAndroid Build Coastguard Worker%#:
22*795d594fSAndroid Build Coastguard Worker   and t2, t2, 0xF       // t2 := A
23*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 1  // advance xPC, load xINST
24*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3    // t3 holds next opcode
25*795d594fSAndroid Build Coastguard Worker%  if is_object:
26*795d594fSAndroid Build Coastguard Worker     SET_VREG_OBJECT t1, t2, z0=t0  // refs[A] := fp[B]
27*795d594fSAndroid Build Coastguard Worker%  else:
28*795d594fSAndroid Build Coastguard Worker%    set_vreg("t1", "t2", z0="t0", is_wide=is_wide)  # fp[A] := fp[B]
29*795d594fSAndroid Build Coastguard Worker%#:
30*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3       // continue to next
31*795d594fSAndroid Build Coastguard Worker
32*795d594fSAndroid Build Coastguard Worker// move/from16 vAA, vBBBB
33*795d594fSAndroid Build Coastguard Worker// Format 22x: AA|16 BBBB
34*795d594fSAndroid Build Coastguard Worker%def op_move_from16(is_object=False, is_wide=False):
35*795d594fSAndroid Build Coastguard Worker   FETCH t1, count=1     // t1 := BBBB
36*795d594fSAndroid Build Coastguard Worker   srliw t2, xINST, 8    // t2 := AA
37*795d594fSAndroid Build Coastguard Worker%  if is_object:
38*795d594fSAndroid Build Coastguard Worker     // Note: leaves a useful breadcrumb if the reference is corrupted, unlike GET_VREG_OBJECT.
39*795d594fSAndroid Build Coastguard Worker%    get_vreg("t1", "t1", is_unsigned=True)  # t1 = fp[BBBB], zext
40*795d594fSAndroid Build Coastguard Worker%  else:
41*795d594fSAndroid Build Coastguard Worker%    get_vreg("t1", "t1", is_wide=is_wide)  # t1 := fp[BBBB]
42*795d594fSAndroid Build Coastguard Worker%#:
43*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2  // advance xPC, load xINST
44*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3    // t3 := next opcode
45*795d594fSAndroid Build Coastguard Worker%  if is_object:
46*795d594fSAndroid Build Coastguard Worker     SET_VREG_OBJECT t1, t2, z0=t0  // refs[AA] := fp[BBBB]
47*795d594fSAndroid Build Coastguard Worker%  else:
48*795d594fSAndroid Build Coastguard Worker%    set_vreg("t1", "t2", z0="t0", is_wide=is_wide)  # fp[AA] := fp[BBBB]
49*795d594fSAndroid Build Coastguard Worker%#:
50*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3        // continue to next
51*795d594fSAndroid Build Coastguard Worker
52*795d594fSAndroid Build Coastguard Worker// move/16 vAAAA, vBBBB
53*795d594fSAndroid Build Coastguard Worker// Format 32x: 00|03 AAAA BBBB
54*795d594fSAndroid Build Coastguard Worker%def op_move_16(is_object=False, is_wide=False):
55*795d594fSAndroid Build Coastguard Worker   FETCH t1, count=2     // t1 := BBBB
56*795d594fSAndroid Build Coastguard Worker   FETCH t2, count=1     // t2 := AAAA
57*795d594fSAndroid Build Coastguard Worker%  if is_object:
58*795d594fSAndroid Build Coastguard Worker     // Note: leaves a useful breadcrumb if the reference is corrupted, unlike GET_VREG_OBJECT.
59*795d594fSAndroid Build Coastguard Worker%    get_vreg("t1", "t1", is_unsigned=True)  # t1 = fp[BBBB], zext
60*795d594fSAndroid Build Coastguard Worker%  else:
61*795d594fSAndroid Build Coastguard Worker%    get_vreg("t1", "t1", is_wide=is_wide)  # t1 := fp[BBBB]
62*795d594fSAndroid Build Coastguard Worker%#:
63*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 3  // advance xPC, load xINST
64*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3    // t3 := next opcode
65*795d594fSAndroid Build Coastguard Worker%  if is_object:
66*795d594fSAndroid Build Coastguard Worker     SET_VREG_OBJECT t1, t2, z0=t0  // refs[AAAA] := fp[BBBB]
67*795d594fSAndroid Build Coastguard Worker%  else:
68*795d594fSAndroid Build Coastguard Worker%    set_vreg("t1", "t2", z0="t0", is_wide=is_wide)  # fp[AAAA] := fp[BBBB]
69*795d594fSAndroid Build Coastguard Worker%#:
70*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3        // continue to next
71*795d594fSAndroid Build Coastguard Worker
72*795d594fSAndroid Build Coastguard Worker// move-wide vA, vB
73*795d594fSAndroid Build Coastguard Worker// Format 12x: B|A|04
74*795d594fSAndroid Build Coastguard Worker// NOTE: vregs can overlap, e.g. "move-wide v6,v7" or "move-wide v7,v6"
75*795d594fSAndroid Build Coastguard Worker%def op_move_wide():
76*795d594fSAndroid Build Coastguard Worker%  op_move(is_wide=True)
77*795d594fSAndroid Build Coastguard Worker
78*795d594fSAndroid Build Coastguard Worker// move-wide/from16 vAA, vBBBB
79*795d594fSAndroid Build Coastguard Worker// Format 22x: AA|05 BBBB
80*795d594fSAndroid Build Coastguard Worker// NOTE: vregs can overlap, e.g. "move-wide v6,v7" or "move-wide v7,v6"
81*795d594fSAndroid Build Coastguard Worker%def op_move_wide_from16():
82*795d594fSAndroid Build Coastguard Worker%  op_move_from16(is_wide=True)
83*795d594fSAndroid Build Coastguard Worker
84*795d594fSAndroid Build Coastguard Worker// move-wide/16, vAAAA, vBBBB
85*795d594fSAndroid Build Coastguard Worker// Format 32x: 00|06 AAAA BBBB
86*795d594fSAndroid Build Coastguard Worker// NOTE: vregs can overlap, e.g. "move-wide v6,v7" or "move-wide v7,v6"
87*795d594fSAndroid Build Coastguard Worker%def op_move_wide_16():
88*795d594fSAndroid Build Coastguard Worker%  op_move_16(is_wide=True)
89*795d594fSAndroid Build Coastguard Worker
90*795d594fSAndroid Build Coastguard Worker// move-object vA, vB
91*795d594fSAndroid Build Coastguard Worker// Format 12x: B|A|07
92*795d594fSAndroid Build Coastguard Worker%def op_move_object():
93*795d594fSAndroid Build Coastguard Worker%  op_move(is_object=True)
94*795d594fSAndroid Build Coastguard Worker
95*795d594fSAndroid Build Coastguard Worker// move-object/from16 vAA, vBBBB
96*795d594fSAndroid Build Coastguard Worker// Format 22x: AA|08 BBBB
97*795d594fSAndroid Build Coastguard Worker%def op_move_object_from16():
98*795d594fSAndroid Build Coastguard Worker%  op_move_from16(is_object=True)
99*795d594fSAndroid Build Coastguard Worker
100*795d594fSAndroid Build Coastguard Worker// move-object/16 vAAAA, vBBBB
101*795d594fSAndroid Build Coastguard Worker// Format 32x: 00|09 AAAA BBBB
102*795d594fSAndroid Build Coastguard Worker%def op_move_object_16():
103*795d594fSAndroid Build Coastguard Worker%  op_move_16(is_object=True)
104*795d594fSAndroid Build Coastguard Worker
105*795d594fSAndroid Build Coastguard Worker// move-result vAA
106*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|0a
107*795d594fSAndroid Build Coastguard Worker%def op_move_result(is_object=False, is_wide=False):
108*795d594fSAndroid Build Coastguard Worker   srliw t1, xINST, 8    // t1 := AA
109*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 1  // advance xPC, load xINST
110*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t2    // t2 := next opcode
111*795d594fSAndroid Build Coastguard Worker%  if is_object:
112*795d594fSAndroid Build Coastguard Worker     SET_VREG_OBJECT a0, t1, z0=t0  // refs[AA] := a0
113*795d594fSAndroid Build Coastguard Worker%  else:
114*795d594fSAndroid Build Coastguard Worker%    set_vreg("a0", "t1", z0="t0", is_wide=is_wide)  # fp[AA] := a0
115*795d594fSAndroid Build Coastguard Worker%#:
116*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t2        // continue to next
117*795d594fSAndroid Build Coastguard Worker
118*795d594fSAndroid Build Coastguard Worker// move-result-wide vAA
119*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|0b
120*795d594fSAndroid Build Coastguard Worker%def op_move_result_wide():
121*795d594fSAndroid Build Coastguard Worker%  op_move_result(is_wide=True)
122*795d594fSAndroid Build Coastguard Worker
123*795d594fSAndroid Build Coastguard Worker// move-result-object vAA
124*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|0c
125*795d594fSAndroid Build Coastguard Worker%def op_move_result_object():
126*795d594fSAndroid Build Coastguard Worker%  op_move_result(is_object=True)
127*795d594fSAndroid Build Coastguard Worker
128*795d594fSAndroid Build Coastguard Worker// move-exception vAA
129*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|0d
130*795d594fSAndroid Build Coastguard Worker%def op_move_exception():
131*795d594fSAndroid Build Coastguard Worker   ld t1, THREAD_EXCEPTION_OFFSET(xSELF)    // t1 := exception object
132*795d594fSAndroid Build Coastguard Worker   srliw t2, xINST, 8                       // t2 := AA
133*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 1                     // advance xPC, load xINST
134*795d594fSAndroid Build Coastguard Worker   SET_VREG_OBJECT t1, t2, z0=t0            // refs[AA] := exception object
135*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3                       // t3 := next opcode
136*795d594fSAndroid Build Coastguard Worker   sd zero, THREAD_EXCEPTION_OFFSET(xSELF)  // clear exception
137*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3                           // continue to next
138*795d594fSAndroid Build Coastguard Worker
139*795d594fSAndroid Build Coastguard Worker// const/4 vA, #+B
140*795d594fSAndroid Build Coastguard Worker// Format 11n: B|A|12
141*795d594fSAndroid Build Coastguard Worker// Clobbers: t0, t1, t2, t3
142*795d594fSAndroid Build Coastguard Worker%def op_const_4():
143*795d594fSAndroid Build Coastguard Worker   slliw t1, xINST, 16     // B as MSB of word
144*795d594fSAndroid Build Coastguard Worker   sraiw t1, t1, 28        // t1 := sssssssB
145*795d594fSAndroid Build Coastguard Worker   slliw t2, xINST, 20     // A as MSB of word
146*795d594fSAndroid Build Coastguard Worker   srliw t2, t2, 28        // t2 := A
147*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 1    // advance xPC, load xINST
148*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3      // t3 holds next opcode
149*795d594fSAndroid Build Coastguard Worker%  set_vreg("t1", "t2", z0="t0")  # fp[A] := sssssssB
150*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3          // continue to next
151*795d594fSAndroid Build Coastguard Worker
152*795d594fSAndroid Build Coastguard Worker// const/16 vAA, #+BBBB
153*795d594fSAndroid Build Coastguard Worker// Format 21s: AA|13 BBBB
154*795d594fSAndroid Build Coastguard Worker// Clobbers: t0, t1, t2, t3
155*795d594fSAndroid Build Coastguard Worker%def op_const_16(is_wide=False):
156*795d594fSAndroid Build Coastguard Worker   FETCH t1, count=1, signed=1
157*795d594fSAndroid Build Coastguard Worker                         // t1 := ssssssssssssBBBB
158*795d594fSAndroid Build Coastguard Worker   srliw t2, xINST, 8    // t2 := AA
159*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2  // advance xPC, load xINST
160*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3    // t3 := next opcode
161*795d594fSAndroid Build Coastguard Worker%  set_vreg("t1", "t2", z0="t0", is_wide=is_wide)
162*795d594fSAndroid Build Coastguard Worker                         // fp[AA] := +BBBB
163*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3        // continue to next
164*795d594fSAndroid Build Coastguard Worker
165*795d594fSAndroid Build Coastguard Worker// const vAA, #+BBBBBBBB
166*795d594fSAndroid Build Coastguard Worker// Format 31i: AA|14 BBBB(lo) BBBB(hi)
167*795d594fSAndroid Build Coastguard Worker// Clobbers: t0, t1, t2, t3
168*795d594fSAndroid Build Coastguard Worker%def op_const(is_wide=False):
169*795d594fSAndroid Build Coastguard Worker   FETCH t1, count=1, signed=1, width=32
170*795d594fSAndroid Build Coastguard Worker                         // t1 := ssssssssBBBBBBBB
171*795d594fSAndroid Build Coastguard Worker   srliw t2, xINST, 8    // t2 := AA
172*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 3  // advance xPC, load xINST
173*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3    // t3 := next opcode
174*795d594fSAndroid Build Coastguard Worker%  set_vreg("t1", "t2", z0="t0", is_wide=is_wide)
175*795d594fSAndroid Build Coastguard Worker                         // fp[AA] := +BBBBBBBB
176*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3        // continue to next
177*795d594fSAndroid Build Coastguard Worker
178*795d594fSAndroid Build Coastguard Worker// const/high16 vAA, #+BBBB0000
179*795d594fSAndroid Build Coastguard Worker// Format 21h: AA|15 BBBB
180*795d594fSAndroid Build Coastguard Worker// Clobbers: t0, t1, t2, t3
181*795d594fSAndroid Build Coastguard Worker%def op_const_high16():
182*795d594fSAndroid Build Coastguard Worker   FETCH t1, count=1       // t1 := BBBB
183*795d594fSAndroid Build Coastguard Worker   srliw t2, xINST, 8      // t2 := AA
184*795d594fSAndroid Build Coastguard Worker   slliw t1, t1, 16        // t1 := BBBB0000
185*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2    // advance xPC, load xINST
186*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3      // t3 := next opcode
187*795d594fSAndroid Build Coastguard Worker%  set_vreg("t1", "t2", z0="t0")  # fp[AA] := BBBB0000
188*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3          // continue to next
189*795d594fSAndroid Build Coastguard Worker
190*795d594fSAndroid Build Coastguard Worker// const-wide/16 vAA, #+BBBB
191*795d594fSAndroid Build Coastguard Worker// Format 21s: AA|16 BBBB
192*795d594fSAndroid Build Coastguard Worker%def op_const_wide_16():
193*795d594fSAndroid Build Coastguard Worker%   op_const_16(is_wide=True)
194*795d594fSAndroid Build Coastguard Worker
195*795d594fSAndroid Build Coastguard Worker// const-wide/32 vAA, #+BBBBBBBB
196*795d594fSAndroid Build Coastguard Worker// Format 31i: AA|17 BBBB(lo) BBBB(hi)
197*795d594fSAndroid Build Coastguard Worker%def op_const_wide_32():
198*795d594fSAndroid Build Coastguard Worker%   op_const(is_wide=True)
199*795d594fSAndroid Build Coastguard Worker
200*795d594fSAndroid Build Coastguard Worker// const-wide vAA, #+BBBBBBBBBBBBBBBB
201*795d594fSAndroid Build Coastguard Worker// Format 51l: AA|18 BBBB(lo) BBBB BBBB BBBB(hi)
202*795d594fSAndroid Build Coastguard Worker%def op_const_wide():
203*795d594fSAndroid Build Coastguard Worker   FETCH t1, count=1, width=64
204*795d594fSAndroid Build Coastguard Worker                         // t1 := BBBBBBBBBBBBBBBB
205*795d594fSAndroid Build Coastguard Worker   srliw t2, xINST, 8    // t2 := AA
206*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 5  // advance xPC, load xINST
207*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3    // t3 := next opcode
208*795d594fSAndroid Build Coastguard Worker   SET_VREG_WIDE t1, t2, z0=t0
209*795d594fSAndroid Build Coastguard Worker                         // fp[AA] := BBBBBBBBBBBBBBBB
210*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3        // continue to next
211*795d594fSAndroid Build Coastguard Worker
212*795d594fSAndroid Build Coastguard Worker// const-wide/high16 vAA, #+BBBB000000000000
213*795d594fSAndroid Build Coastguard Worker// Format 21h: AA|19 BBBB
214*795d594fSAndroid Build Coastguard Worker%def op_const_wide_high16():
215*795d594fSAndroid Build Coastguard Worker   FETCH t1, count=1     // t1 := BBBB
216*795d594fSAndroid Build Coastguard Worker   srliw t2, xINST, 8    // t2 := AA
217*795d594fSAndroid Build Coastguard Worker   slli t1, t1, 48       // t1 := BBBB000000000000
218*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2  // advance xPC, load xINST
219*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t3    // t3 := next opcode
220*795d594fSAndroid Build Coastguard Worker   SET_VREG_WIDE t1, t2, z0=t0
221*795d594fSAndroid Build Coastguard Worker                         // fp[AA] := BBBB000000000000
222*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t3        // continue to next
223*795d594fSAndroid Build Coastguard Worker
224*795d594fSAndroid Build Coastguard Worker
225*795d594fSAndroid Build Coastguard Worker// const-string vAA, string@BBBB
226*795d594fSAndroid Build Coastguard Worker// Format 21c: AA|1a BBBB
227*795d594fSAndroid Build Coastguard Worker%def op_const_string(jumbo=False):
228*795d594fSAndroid Build Coastguard Worker   // Fast path: string from thread-local cache.
229*795d594fSAndroid Build Coastguard Worker   FETCH_FROM_THREAD_CACHE /*object*/a0, .L${opcode}_slow, t0, t1
230*795d594fSAndroid Build Coastguard Worker   TEST_IF_MARKING t2, .L${opcode}_mark
231*795d594fSAndroid Build Coastguard Worker
232*795d594fSAndroid Build Coastguard Worker.L${opcode}_resume:
233*795d594fSAndroid Build Coastguard Worker   srliw t0, xINST, 8  // t0 := AA
234*795d594fSAndroid Build Coastguard Worker%  code_units = "3" if jumbo else "2"
235*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST $code_units
236*795d594fSAndroid Build Coastguard Worker   SET_VREG_OBJECT a0, t0, z0=t1
237*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
238*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
239*795d594fSAndroid Build Coastguard Worker
240*795d594fSAndroid Build Coastguard Worker.L${opcode}_mark:
241*795d594fSAndroid Build Coastguard Worker   call art_quick_read_barrier_mark_reg10  // a0, string
242*795d594fSAndroid Build Coastguard Worker   j .L${opcode}_resume
243*795d594fSAndroid Build Coastguard Worker.L${opcode}_slow:
244*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
245*795d594fSAndroid Build Coastguard Worker   mv a0, xSELF
246*795d594fSAndroid Build Coastguard Worker   ld a1, (sp)  // caller ArtMethod*
247*795d594fSAndroid Build Coastguard Worker   mv a2, xPC
248*795d594fSAndroid Build Coastguard Worker   call nterp_load_object  // return a0 := string
249*795d594fSAndroid Build Coastguard Worker   j .L${opcode}_resume
250*795d594fSAndroid Build Coastguard Worker
251*795d594fSAndroid Build Coastguard Worker
252*795d594fSAndroid Build Coastguard Worker// const-string/jumbo vAA, string@BBBBBBBB
253*795d594fSAndroid Build Coastguard Worker// Format 31c: AA|1b BBBB(lo) BBBB(hi)
254*795d594fSAndroid Build Coastguard Worker%def op_const_string_jumbo():
255*795d594fSAndroid Build Coastguard Worker%  op_const_string(jumbo=True)
256*795d594fSAndroid Build Coastguard Worker
257*795d594fSAndroid Build Coastguard Worker// const-class vAA, type@BBBB
258*795d594fSAndroid Build Coastguard Worker// Format 21c: AA|1c BBBB
259*795d594fSAndroid Build Coastguard Worker%def op_const_class():
260*795d594fSAndroid Build Coastguard Worker   // Fast path: klass reference from thread-local cache.
261*795d594fSAndroid Build Coastguard Worker   FETCH_FROM_THREAD_CACHE /*object*/a0, .L${opcode}_slow, t0, t1
262*795d594fSAndroid Build Coastguard Worker   TEST_IF_MARKING t2, .L${opcode}_mark
263*795d594fSAndroid Build Coastguard Worker
264*795d594fSAndroid Build Coastguard Worker.L${opcode}_resume:
265*795d594fSAndroid Build Coastguard Worker   srliw t0, xINST, 8  // t0 := AA
266*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2
267*795d594fSAndroid Build Coastguard Worker   SET_VREG_OBJECT a0, t0, z0=t1
268*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
269*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
270*795d594fSAndroid Build Coastguard Worker
271*795d594fSAndroid Build Coastguard Worker.L${opcode}_mark:
272*795d594fSAndroid Build Coastguard Worker   call art_quick_read_barrier_mark_reg10  // a0, klass
273*795d594fSAndroid Build Coastguard Worker   j .L${opcode}_resume
274*795d594fSAndroid Build Coastguard Worker.L${opcode}_slow:
275*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
276*795d594fSAndroid Build Coastguard Worker   mv a0, xSELF
277*795d594fSAndroid Build Coastguard Worker   ld a1, (sp)  // caller ArtMethod*
278*795d594fSAndroid Build Coastguard Worker   mv a2, xPC
279*795d594fSAndroid Build Coastguard Worker   call nterp_get_class  // return a0 := klass
280*795d594fSAndroid Build Coastguard Worker   j .L${opcode}_resume
281*795d594fSAndroid Build Coastguard Worker
282*795d594fSAndroid Build Coastguard Worker
283*795d594fSAndroid Build Coastguard Worker// const-method-handle vAA, method_handle@BBBB
284*795d594fSAndroid Build Coastguard Worker// Format 21c: AA|fe BBBB
285*795d594fSAndroid Build Coastguard Worker%def op_const_method_handle():
286*795d594fSAndroid Build Coastguard Worker   // Method handle and method type are not cached, just call helper directly.
287*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
288*795d594fSAndroid Build Coastguard Worker   mv a0, xSELF
289*795d594fSAndroid Build Coastguard Worker   ld a1, (sp)  // caller ArtMethod*
290*795d594fSAndroid Build Coastguard Worker   mv a2, xPC
291*795d594fSAndroid Build Coastguard Worker   call nterp_load_object  // return a0 := method handle or method type
292*795d594fSAndroid Build Coastguard Worker   srliw t0, xINST, 8  // t0 := AA
293*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2
294*795d594fSAndroid Build Coastguard Worker   SET_VREG_OBJECT a0, t0, z0=t1
295*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
296*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
297*795d594fSAndroid Build Coastguard Worker
298*795d594fSAndroid Build Coastguard Worker
299*795d594fSAndroid Build Coastguard Worker// const-method-type vAA, proto@BBBB
300*795d594fSAndroid Build Coastguard Worker// Format 21c: AA|ff BBBB
301*795d594fSAndroid Build Coastguard Worker%def op_const_method_type():
302*795d594fSAndroid Build Coastguard Worker%  op_const_method_handle()
303*795d594fSAndroid Build Coastguard Worker
304*795d594fSAndroid Build Coastguard Worker
305*795d594fSAndroid Build Coastguard Worker// monitor-enter vAA
306*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|1d
307*795d594fSAndroid Build Coastguard Worker// Acquire the monitor for the indicated object.
308*795d594fSAndroid Build Coastguard Worker%def op_monitor_enter():
309*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
310*795d594fSAndroid Build Coastguard Worker   srliw t0, xINST, 8  // t0 := AA
311*795d594fSAndroid Build Coastguard Worker   GET_VREG_OBJECT a0, t0
312*795d594fSAndroid Build Coastguard Worker   call art_quick_lock_object  // arg a0
313*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 1
314*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
315*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
316*795d594fSAndroid Build Coastguard Worker
317*795d594fSAndroid Build Coastguard Worker
318*795d594fSAndroid Build Coastguard Worker// monitor-exit vAA
319*795d594fSAndroid Build Coastguard Worker// Format 11x: AA|1e
320*795d594fSAndroid Build Coastguard Worker// Release the monitor for the indicated object.
321*795d594fSAndroid Build Coastguard Worker// Note: If this instruction needs to throw an exception, it must do so as if the pc has
322*795d594fSAndroid Build Coastguard Worker//       already advanced past the instruction. It may be useful to think of this as the instruction
323*795d594fSAndroid Build Coastguard Worker//       successfully executing (in a sense), and the exception getting thrown after the instruction
324*795d594fSAndroid Build Coastguard Worker//       but before the next one gets a chance to run. This definition makes it possible for a
325*795d594fSAndroid Build Coastguard Worker//       method to use a monitor cleanup catch-all (e.g., finally) block as the monitor cleanup for
326*795d594fSAndroid Build Coastguard Worker//       that block itself, as a way to handle the arbitrary exceptions that might get thrown due to
327*795d594fSAndroid Build Coastguard Worker//       the historical implementation of Thread.stop(), while still managing to have proper monitor
328*795d594fSAndroid Build Coastguard Worker//       hygiene.
329*795d594fSAndroid Build Coastguard Worker%def op_monitor_exit():
330*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
331*795d594fSAndroid Build Coastguard Worker   srliw t0, xINST, 8  // t0 := AA
332*795d594fSAndroid Build Coastguard Worker   GET_VREG_OBJECT a0, t0
333*795d594fSAndroid Build Coastguard Worker   call art_quick_unlock_object  // arg a0
334*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 1
335*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE t0
336*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE t0
337*795d594fSAndroid Build Coastguard Worker
338*795d594fSAndroid Build Coastguard Worker
339*795d594fSAndroid Build Coastguard Worker%def op_unused_3e():
340*795d594fSAndroid Build Coastguard Worker%  unused()
341*795d594fSAndroid Build Coastguard Worker
342*795d594fSAndroid Build Coastguard Worker%def op_unused_3f():
343*795d594fSAndroid Build Coastguard Worker%  unused()
344*795d594fSAndroid Build Coastguard Worker
345*795d594fSAndroid Build Coastguard Worker%def op_unused_40():
346*795d594fSAndroid Build Coastguard Worker%  unused()
347*795d594fSAndroid Build Coastguard Worker
348*795d594fSAndroid Build Coastguard Worker%def op_unused_41():
349*795d594fSAndroid Build Coastguard Worker%  unused()
350*795d594fSAndroid Build Coastguard Worker
351*795d594fSAndroid Build Coastguard Worker%def op_unused_42():
352*795d594fSAndroid Build Coastguard Worker%  unused()
353*795d594fSAndroid Build Coastguard Worker
354*795d594fSAndroid Build Coastguard Worker%def op_unused_43():
355*795d594fSAndroid Build Coastguard Worker%  unused()
356*795d594fSAndroid Build Coastguard Worker
357*795d594fSAndroid Build Coastguard Worker%def op_unused_73():
358*795d594fSAndroid Build Coastguard Worker%  unused()
359*795d594fSAndroid Build Coastguard Worker
360*795d594fSAndroid Build Coastguard Worker%def op_unused_79():
361*795d594fSAndroid Build Coastguard Worker%  unused()
362*795d594fSAndroid Build Coastguard Worker
363*795d594fSAndroid Build Coastguard Worker%def op_unused_7a():
364*795d594fSAndroid Build Coastguard Worker%  unused()
365*795d594fSAndroid Build Coastguard Worker
366*795d594fSAndroid Build Coastguard Worker%def op_unused_e3():
367*795d594fSAndroid Build Coastguard Worker%  unused()
368*795d594fSAndroid Build Coastguard Worker
369*795d594fSAndroid Build Coastguard Worker%def op_unused_e4():
370*795d594fSAndroid Build Coastguard Worker%  unused()
371*795d594fSAndroid Build Coastguard Worker
372*795d594fSAndroid Build Coastguard Worker%def op_unused_e5():
373*795d594fSAndroid Build Coastguard Worker%  unused()
374*795d594fSAndroid Build Coastguard Worker
375*795d594fSAndroid Build Coastguard Worker%def op_unused_e6():
376*795d594fSAndroid Build Coastguard Worker%  unused()
377*795d594fSAndroid Build Coastguard Worker
378*795d594fSAndroid Build Coastguard Worker%def op_unused_e7():
379*795d594fSAndroid Build Coastguard Worker%  unused()
380*795d594fSAndroid Build Coastguard Worker
381*795d594fSAndroid Build Coastguard Worker%def op_unused_e8():
382*795d594fSAndroid Build Coastguard Worker%  unused()
383*795d594fSAndroid Build Coastguard Worker
384*795d594fSAndroid Build Coastguard Worker%def op_unused_e9():
385*795d594fSAndroid Build Coastguard Worker%  unused()
386*795d594fSAndroid Build Coastguard Worker
387*795d594fSAndroid Build Coastguard Worker%def op_unused_ea():
388*795d594fSAndroid Build Coastguard Worker%  unused()
389*795d594fSAndroid Build Coastguard Worker
390*795d594fSAndroid Build Coastguard Worker%def op_unused_eb():
391*795d594fSAndroid Build Coastguard Worker%  unused()
392*795d594fSAndroid Build Coastguard Worker
393*795d594fSAndroid Build Coastguard Worker%def op_unused_ec():
394*795d594fSAndroid Build Coastguard Worker%  unused()
395*795d594fSAndroid Build Coastguard Worker
396*795d594fSAndroid Build Coastguard Worker%def op_unused_ed():
397*795d594fSAndroid Build Coastguard Worker%  unused()
398*795d594fSAndroid Build Coastguard Worker
399*795d594fSAndroid Build Coastguard Worker%def op_unused_ee():
400*795d594fSAndroid Build Coastguard Worker%  unused()
401*795d594fSAndroid Build Coastguard Worker
402*795d594fSAndroid Build Coastguard Worker%def op_unused_ef():
403*795d594fSAndroid Build Coastguard Worker%  unused()
404*795d594fSAndroid Build Coastguard Worker
405*795d594fSAndroid Build Coastguard Worker%def op_unused_f0():
406*795d594fSAndroid Build Coastguard Worker%  unused()
407*795d594fSAndroid Build Coastguard Worker
408*795d594fSAndroid Build Coastguard Worker%def op_unused_f1():
409*795d594fSAndroid Build Coastguard Worker%  unused()
410*795d594fSAndroid Build Coastguard Worker
411*795d594fSAndroid Build Coastguard Worker%def op_unused_f2():
412*795d594fSAndroid Build Coastguard Worker%  unused()
413*795d594fSAndroid Build Coastguard Worker
414*795d594fSAndroid Build Coastguard Worker%def op_unused_f3():
415*795d594fSAndroid Build Coastguard Worker%  unused()
416*795d594fSAndroid Build Coastguard Worker
417*795d594fSAndroid Build Coastguard Worker%def op_unused_f4():
418*795d594fSAndroid Build Coastguard Worker%  unused()
419*795d594fSAndroid Build Coastguard Worker
420*795d594fSAndroid Build Coastguard Worker%def op_unused_f5():
421*795d594fSAndroid Build Coastguard Worker%  unused()
422*795d594fSAndroid Build Coastguard Worker
423*795d594fSAndroid Build Coastguard Worker%def op_unused_f6():
424*795d594fSAndroid Build Coastguard Worker%  unused()
425*795d594fSAndroid Build Coastguard Worker
426*795d594fSAndroid Build Coastguard Worker%def op_unused_f7():
427*795d594fSAndroid Build Coastguard Worker%  unused()
428*795d594fSAndroid Build Coastguard Worker
429*795d594fSAndroid Build Coastguard Worker%def op_unused_f8():
430*795d594fSAndroid Build Coastguard Worker%  unused()
431*795d594fSAndroid Build Coastguard Worker
432*795d594fSAndroid Build Coastguard Worker%def op_unused_f9():
433*795d594fSAndroid Build Coastguard Worker%  unused()
434*795d594fSAndroid Build Coastguard Worker
435*795d594fSAndroid Build Coastguard Worker%def op_unused_fc():
436*795d594fSAndroid Build Coastguard Worker%  unused()
437*795d594fSAndroid Build Coastguard Worker
438*795d594fSAndroid Build Coastguard Worker%def op_unused_fd():
439*795d594fSAndroid Build Coastguard Worker%  unused()
440*795d594fSAndroid Build Coastguard Worker
441