xref: /aosp_15_r20/art/runtime/interpreter/mterp/arm64ng/other.S (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker%def unused():
2*795d594fSAndroid Build Coastguard Worker    brk 42
3*795d594fSAndroid Build Coastguard Worker
4*795d594fSAndroid Build Coastguard Worker%def op_const():
5*795d594fSAndroid Build Coastguard Worker    /* const vAA, #+BBBBbbbb */
6*795d594fSAndroid Build Coastguard Worker    lsr     w3, wINST, #8               // w3<- AA
7*795d594fSAndroid Build Coastguard Worker    FETCH w0, 1                         // w0<- bbbb (low)
8*795d594fSAndroid Build Coastguard Worker    FETCH w1, 2                         // w1<- BBBB (high)
9*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 3                // advance rPC, load wINST
10*795d594fSAndroid Build Coastguard Worker    orr     w0, w0, w1, lsl #16         // w0<- BBBBbbbb
11*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from wINST
12*795d594fSAndroid Build Coastguard Worker    SET_VREG w0, w3                     // vAA<- w0
13*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
14*795d594fSAndroid Build Coastguard Worker
15*795d594fSAndroid Build Coastguard Worker%def op_const_16():
16*795d594fSAndroid Build Coastguard Worker    /* const/16 vAA, #+BBBB */
17*795d594fSAndroid Build Coastguard Worker    FETCH_S w0, 1                       // w0<- ssssBBBB (sign-extended)
18*795d594fSAndroid Build Coastguard Worker    lsr     w3, wINST, #8               // w3<- AA
19*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 2                // advance xPC, load wINST
20*795d594fSAndroid Build Coastguard Worker    SET_VREG w0, w3                     // vAA<- w0
21*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from wINST
22*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
23*795d594fSAndroid Build Coastguard Worker
24*795d594fSAndroid Build Coastguard Worker%def op_const_4():
25*795d594fSAndroid Build Coastguard Worker    /* const/4 vA, #+B */
26*795d594fSAndroid Build Coastguard Worker    sbfx    w1, wINST, #12, #4          // w1<- sssssssB
27*795d594fSAndroid Build Coastguard Worker    ubfx    w0, wINST, #8, #4           // w0<- A
28*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 1                // advance xPC, load wINST
29*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // ip<- opcode from xINST
30*795d594fSAndroid Build Coastguard Worker    SET_VREG w1, w0                     // fp[A]<- w1
31*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // execute next instruction
32*795d594fSAndroid Build Coastguard Worker
33*795d594fSAndroid Build Coastguard Worker%def op_const_high16():
34*795d594fSAndroid Build Coastguard Worker    /* const/high16 vAA, #+BBBB0000 */
35*795d594fSAndroid Build Coastguard Worker    FETCH   w0, 1                       // r0<- 0000BBBB (zero-extended)
36*795d594fSAndroid Build Coastguard Worker    lsr     w3, wINST, #8               // r3<- AA
37*795d594fSAndroid Build Coastguard Worker    lsl     w0, w0, #16                 // r0<- BBBB0000
38*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 2                // advance rPC, load rINST
39*795d594fSAndroid Build Coastguard Worker    SET_VREG w0, w3                     // vAA<- r0
40*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from rINST
41*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
42*795d594fSAndroid Build Coastguard Worker
43*795d594fSAndroid Build Coastguard Worker%def op_const_object(jumbo="0", helper="nterp_load_object"):
44*795d594fSAndroid Build Coastguard Worker   // Fast-path which gets the object from thread-local cache.
45*795d594fSAndroid Build Coastguard Worker%  fetch_from_thread_cache("x0", miss_label="2f")
46*795d594fSAndroid Build Coastguard Worker   TEST_IF_MARKING 3f
47*795d594fSAndroid Build Coastguard Worker1:
48*795d594fSAndroid Build Coastguard Worker   lsr     w1, wINST, #8               // w1<- AA
49*795d594fSAndroid Build Coastguard Worker   .if $jumbo
50*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 3                // advance rPC, load wINST
51*795d594fSAndroid Build Coastguard Worker   .else
52*795d594fSAndroid Build Coastguard Worker   FETCH_ADVANCE_INST 2                // advance rPC, load wINST
53*795d594fSAndroid Build Coastguard Worker   .endif
54*795d594fSAndroid Build Coastguard Worker   GET_INST_OPCODE ip                  // extract opcode from wINST
55*795d594fSAndroid Build Coastguard Worker   SET_VREG_OBJECT w0, w1              // vAA <- value
56*795d594fSAndroid Build Coastguard Worker   GOTO_OPCODE ip                      // jump to next instruction
57*795d594fSAndroid Build Coastguard Worker2:
58*795d594fSAndroid Build Coastguard Worker   EXPORT_PC
59*795d594fSAndroid Build Coastguard Worker   mov x0, xSELF
60*795d594fSAndroid Build Coastguard Worker   ldr x1, [sp]
61*795d594fSAndroid Build Coastguard Worker   mov x2, xPC
62*795d594fSAndroid Build Coastguard Worker   bl $helper
63*795d594fSAndroid Build Coastguard Worker   b 1b
64*795d594fSAndroid Build Coastguard Worker3:
65*795d594fSAndroid Build Coastguard Worker   bl art_quick_read_barrier_mark_reg00
66*795d594fSAndroid Build Coastguard Worker   b 1b
67*795d594fSAndroid Build Coastguard Worker
68*795d594fSAndroid Build Coastguard Worker%def op_const_class():
69*795d594fSAndroid Build Coastguard Worker%  op_const_object(jumbo="0", helper="nterp_get_class")
70*795d594fSAndroid Build Coastguard Worker
71*795d594fSAndroid Build Coastguard Worker%def op_const_method_handle():
72*795d594fSAndroid Build Coastguard Worker%  op_const_object(jumbo="0")
73*795d594fSAndroid Build Coastguard Worker
74*795d594fSAndroid Build Coastguard Worker%def op_const_method_type():
75*795d594fSAndroid Build Coastguard Worker%  op_const_object(jumbo="0")
76*795d594fSAndroid Build Coastguard Worker
77*795d594fSAndroid Build Coastguard Worker%def op_const_string():
78*795d594fSAndroid Build Coastguard Worker   /* const/string vAA, String@BBBB */
79*795d594fSAndroid Build Coastguard Worker%  op_const_object(jumbo="0")
80*795d594fSAndroid Build Coastguard Worker
81*795d594fSAndroid Build Coastguard Worker%def op_const_string_jumbo():
82*795d594fSAndroid Build Coastguard Worker   /* const/string vAA, String@BBBBBBBB */
83*795d594fSAndroid Build Coastguard Worker%  op_const_object(jumbo="1")
84*795d594fSAndroid Build Coastguard Worker
85*795d594fSAndroid Build Coastguard Worker%def op_const_wide():
86*795d594fSAndroid Build Coastguard Worker    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
87*795d594fSAndroid Build Coastguard Worker    FETCH w0, 1                         // w0<- bbbb (low)
88*795d594fSAndroid Build Coastguard Worker    FETCH w1, 2                         // w1<- BBBB (low middle)
89*795d594fSAndroid Build Coastguard Worker    FETCH w2, 3                         // w2<- hhhh (high middle)
90*795d594fSAndroid Build Coastguard Worker    FETCH w3, 4                         // w3<- HHHH (high)
91*795d594fSAndroid Build Coastguard Worker    lsr     w4, wINST, #8               // r4<- AA
92*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 5                // advance rPC, load wINST
93*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from wINST
94*795d594fSAndroid Build Coastguard Worker    orr     w0, w0, w1, lsl #16         // w0<-         BBBBbbbb
95*795d594fSAndroid Build Coastguard Worker    orr     x0, x0, x2, lsl #32         // w0<-     hhhhBBBBbbbb
96*795d594fSAndroid Build Coastguard Worker    orr     x0, x0, x3, lsl #48         // w0<- HHHHhhhhBBBBbbbb
97*795d594fSAndroid Build Coastguard Worker    SET_VREG_WIDE x0, w4
98*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
99*795d594fSAndroid Build Coastguard Worker
100*795d594fSAndroid Build Coastguard Worker%def op_const_wide_16():
101*795d594fSAndroid Build Coastguard Worker    /* const-wide/16 vAA, #+BBBB */
102*795d594fSAndroid Build Coastguard Worker    FETCH_S x0, 1                       // x0<- ssssssssssssBBBB (sign-extended)
103*795d594fSAndroid Build Coastguard Worker    lsr     w3, wINST, #8               // w3<- AA
104*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 2                // advance rPC, load rINST
105*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from rINST
106*795d594fSAndroid Build Coastguard Worker    SET_VREG_WIDE x0, w3
107*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
108*795d594fSAndroid Build Coastguard Worker
109*795d594fSAndroid Build Coastguard Worker%def op_const_wide_32():
110*795d594fSAndroid Build Coastguard Worker    /* const-wide/32 vAA, #+BBBBbbbb */
111*795d594fSAndroid Build Coastguard Worker    FETCH   w0, 1                       // x0<- 000000000000bbbb (low)
112*795d594fSAndroid Build Coastguard Worker    lsr     w3, wINST, #8               // w3<- AA
113*795d594fSAndroid Build Coastguard Worker    FETCH_S x2, 2                       // x2<- ssssssssssssBBBB (high)
114*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 3                // advance rPC, load wINST
115*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from wINST
116*795d594fSAndroid Build Coastguard Worker    orr     x0, x0, x2, lsl #16         // x0<- ssssssssBBBBbbbb
117*795d594fSAndroid Build Coastguard Worker    SET_VREG_WIDE x0, w3
118*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
119*795d594fSAndroid Build Coastguard Worker
120*795d594fSAndroid Build Coastguard Worker%def op_const_wide_high16():
121*795d594fSAndroid Build Coastguard Worker    /* const-wide/high16 vAA, #+BBBB000000000000 */
122*795d594fSAndroid Build Coastguard Worker    FETCH w0, 1                         // w0<- 0000BBBB (zero-extended)
123*795d594fSAndroid Build Coastguard Worker    lsr     w1, wINST, #8               // w1<- AA
124*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 2                // advance rPC, load wINST
125*795d594fSAndroid Build Coastguard Worker    lsl     x0, x0, #48
126*795d594fSAndroid Build Coastguard Worker    SET_VREG_WIDE x0, w1
127*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from wINST
128*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
129*795d594fSAndroid Build Coastguard Worker
130*795d594fSAndroid Build Coastguard Worker%def op_monitor_enter():
131*795d594fSAndroid Build Coastguard Worker/*
132*795d594fSAndroid Build Coastguard Worker * Synchronize on an object.
133*795d594fSAndroid Build Coastguard Worker */
134*795d594fSAndroid Build Coastguard Worker    /* monitor-enter vAA */
135*795d594fSAndroid Build Coastguard Worker    EXPORT_PC
136*795d594fSAndroid Build Coastguard Worker    lsr      w2, wINST, #8               // w2<- AA
137*795d594fSAndroid Build Coastguard Worker    GET_VREG w0, w2
138*795d594fSAndroid Build Coastguard Worker    bl art_quick_lock_object
139*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 1
140*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                   // extract opcode from rINST
141*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                       // jump to next instruction
142*795d594fSAndroid Build Coastguard Worker
143*795d594fSAndroid Build Coastguard Worker%def op_monitor_exit():
144*795d594fSAndroid Build Coastguard Worker/*
145*795d594fSAndroid Build Coastguard Worker * Unlock an object.
146*795d594fSAndroid Build Coastguard Worker *
147*795d594fSAndroid Build Coastguard Worker * Exceptions that occur when unlocking a monitor need to appear as
148*795d594fSAndroid Build Coastguard Worker * if they happened at the following instruction.  See the Dalvik
149*795d594fSAndroid Build Coastguard Worker * instruction spec.
150*795d594fSAndroid Build Coastguard Worker */
151*795d594fSAndroid Build Coastguard Worker    /* monitor-exit vAA */
152*795d594fSAndroid Build Coastguard Worker    EXPORT_PC
153*795d594fSAndroid Build Coastguard Worker    lsr      w2, wINST, #8               // w2<- AA
154*795d594fSAndroid Build Coastguard Worker    GET_VREG w0, w2
155*795d594fSAndroid Build Coastguard Worker    bl art_quick_unlock_object
156*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 1
157*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                   // extract opcode from rINST
158*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                       // jump to next instruction
159*795d594fSAndroid Build Coastguard Worker
160*795d594fSAndroid Build Coastguard Worker%def op_move(is_object="0"):
161*795d594fSAndroid Build Coastguard Worker    /* for move, move-object, long-to-int */
162*795d594fSAndroid Build Coastguard Worker    /* op vA, vB */
163*795d594fSAndroid Build Coastguard Worker    lsr     w1, wINST, #12              // x1<- B from 15:12
164*795d594fSAndroid Build Coastguard Worker    ubfx    w0, wINST, #8, #4           // x0<- A from 11:8
165*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 1                // advance rPC, load wINST
166*795d594fSAndroid Build Coastguard Worker    GET_VREG w2, w1                     // x2<- fp[B]
167*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // ip<- opcode from wINST
168*795d594fSAndroid Build Coastguard Worker    .if $is_object
169*795d594fSAndroid Build Coastguard Worker    SET_VREG_OBJECT w2, w0              // fp[A]<- x2
170*795d594fSAndroid Build Coastguard Worker    .else
171*795d594fSAndroid Build Coastguard Worker    SET_VREG w2, w0                     // fp[A]<- x2
172*795d594fSAndroid Build Coastguard Worker    .endif
173*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // execute next instruction
174*795d594fSAndroid Build Coastguard Worker
175*795d594fSAndroid Build Coastguard Worker%def op_move_16(is_object="0"):
176*795d594fSAndroid Build Coastguard Worker    /* for: move/16, move-object/16 */
177*795d594fSAndroid Build Coastguard Worker    /* op vAAAA, vBBBB */
178*795d594fSAndroid Build Coastguard Worker    FETCH w1, 2                         // w1<- BBBB
179*795d594fSAndroid Build Coastguard Worker    FETCH w0, 1                         // w0<- AAAA
180*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 3                // advance xPC, load xINST
181*795d594fSAndroid Build Coastguard Worker    GET_VREG w2, w1                     // w2<- fp[BBBB]
182*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from xINST
183*795d594fSAndroid Build Coastguard Worker    .if $is_object
184*795d594fSAndroid Build Coastguard Worker    SET_VREG_OBJECT w2, w0              // fp[AAAA]<- w2
185*795d594fSAndroid Build Coastguard Worker    .else
186*795d594fSAndroid Build Coastguard Worker    SET_VREG w2, w0                     // fp[AAAA]<- w2
187*795d594fSAndroid Build Coastguard Worker    .endif
188*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
189*795d594fSAndroid Build Coastguard Worker
190*795d594fSAndroid Build Coastguard Worker%def op_move_exception():
191*795d594fSAndroid Build Coastguard Worker    /* move-exception vAA */
192*795d594fSAndroid Build Coastguard Worker    lsr     w2, wINST, #8               // w2<- AA
193*795d594fSAndroid Build Coastguard Worker    ldr     x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
194*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 1                // advance rPC, load rINST
195*795d594fSAndroid Build Coastguard Worker    SET_VREG_OBJECT w3, w2              // fp[AA]<- exception obj
196*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from rINST
197*795d594fSAndroid Build Coastguard Worker    str     xzr, [xSELF, #THREAD_EXCEPTION_OFFSET]  // clear exception
198*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
199*795d594fSAndroid Build Coastguard Worker
200*795d594fSAndroid Build Coastguard Worker%def op_move_from16(is_object="0"):
201*795d594fSAndroid Build Coastguard Worker    /* for: move/from16, move-object/from16 */
202*795d594fSAndroid Build Coastguard Worker    /* op vAA, vBBBB */
203*795d594fSAndroid Build Coastguard Worker    FETCH w1, 1                         // r1<- BBBB
204*795d594fSAndroid Build Coastguard Worker    lsr     w0, wINST, #8               // r0<- AA
205*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 2                // advance rPC, load wINST
206*795d594fSAndroid Build Coastguard Worker    GET_VREG w2, w1                     // r2<- fp[BBBB]
207*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from wINST
208*795d594fSAndroid Build Coastguard Worker    .if $is_object
209*795d594fSAndroid Build Coastguard Worker    SET_VREG_OBJECT w2, w0              // fp[AA]<- r2
210*795d594fSAndroid Build Coastguard Worker    .else
211*795d594fSAndroid Build Coastguard Worker    SET_VREG w2, w0                     // fp[AA]<- r2
212*795d594fSAndroid Build Coastguard Worker    .endif
213*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
214*795d594fSAndroid Build Coastguard Worker
215*795d594fSAndroid Build Coastguard Worker%def op_move_object():
216*795d594fSAndroid Build Coastguard Worker%  op_move(is_object="1")
217*795d594fSAndroid Build Coastguard Worker
218*795d594fSAndroid Build Coastguard Worker%def op_move_object_16():
219*795d594fSAndroid Build Coastguard Worker%  op_move_16(is_object="1")
220*795d594fSAndroid Build Coastguard Worker
221*795d594fSAndroid Build Coastguard Worker%def op_move_object_from16():
222*795d594fSAndroid Build Coastguard Worker%  op_move_from16(is_object="1")
223*795d594fSAndroid Build Coastguard Worker
224*795d594fSAndroid Build Coastguard Worker%def op_move_result(is_object="0"):
225*795d594fSAndroid Build Coastguard Worker    /* for: move-result, move-result-object */
226*795d594fSAndroid Build Coastguard Worker    /* op vAA */
227*795d594fSAndroid Build Coastguard Worker    lsr     w2, wINST, #8               // r2<- AA
228*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 1                // advance rPC, load wINST
229*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from wINST
230*795d594fSAndroid Build Coastguard Worker    .if $is_object
231*795d594fSAndroid Build Coastguard Worker    SET_VREG_OBJECT w0, w2              // fp[AA]<- r0
232*795d594fSAndroid Build Coastguard Worker    .else
233*795d594fSAndroid Build Coastguard Worker    SET_VREG w0, w2                     // fp[AA]<- r0
234*795d594fSAndroid Build Coastguard Worker    .endif
235*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
236*795d594fSAndroid Build Coastguard Worker
237*795d594fSAndroid Build Coastguard Worker%def op_move_result_object():
238*795d594fSAndroid Build Coastguard Worker%  op_move_result(is_object="1")
239*795d594fSAndroid Build Coastguard Worker
240*795d594fSAndroid Build Coastguard Worker%def op_move_result_wide():
241*795d594fSAndroid Build Coastguard Worker    /* for: move-result-wide */
242*795d594fSAndroid Build Coastguard Worker    /* op vAA */
243*795d594fSAndroid Build Coastguard Worker    lsr     w2, wINST, #8               // r2<- AA
244*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 1                // advance rPC, load wINST
245*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from wINST
246*795d594fSAndroid Build Coastguard Worker    SET_VREG_WIDE x0, w2                // fp[AA]<- r0
247*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
248*795d594fSAndroid Build Coastguard Worker
249*795d594fSAndroid Build Coastguard Worker%def op_move_wide():
250*795d594fSAndroid Build Coastguard Worker    /* move-wide vA, vB */
251*795d594fSAndroid Build Coastguard Worker    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
252*795d594fSAndroid Build Coastguard Worker    lsr     w3, wINST, #12              // w3<- B
253*795d594fSAndroid Build Coastguard Worker    ubfx    w2, wINST, #8, #4           // w2<- A
254*795d594fSAndroid Build Coastguard Worker    GET_VREG_WIDE  x3, w3
255*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 1                // advance rPC, load wINST
256*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from wINST
257*795d594fSAndroid Build Coastguard Worker    SET_VREG_WIDE  x3, w2
258*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
259*795d594fSAndroid Build Coastguard Worker
260*795d594fSAndroid Build Coastguard Worker%def op_move_wide_16():
261*795d594fSAndroid Build Coastguard Worker    /* move-wide/16 vAAAA, vBBBB */
262*795d594fSAndroid Build Coastguard Worker    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
263*795d594fSAndroid Build Coastguard Worker    FETCH w3, 2                         // w3<- BBBB
264*795d594fSAndroid Build Coastguard Worker    FETCH w2, 1                         // w2<- AAAA
265*795d594fSAndroid Build Coastguard Worker    GET_VREG_WIDE x3, w3
266*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 3                // advance rPC, load rINST
267*795d594fSAndroid Build Coastguard Worker    SET_VREG_WIDE x3, w2
268*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from rINST
269*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
270*795d594fSAndroid Build Coastguard Worker
271*795d594fSAndroid Build Coastguard Worker%def op_move_wide_from16():
272*795d594fSAndroid Build Coastguard Worker    /* move-wide/from16 vAA, vBBBB */
273*795d594fSAndroid Build Coastguard Worker    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
274*795d594fSAndroid Build Coastguard Worker    FETCH w3, 1                         // w3<- BBBB
275*795d594fSAndroid Build Coastguard Worker    lsr     w2, wINST, #8               // w2<- AA
276*795d594fSAndroid Build Coastguard Worker    GET_VREG_WIDE x3, w3
277*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 2                // advance rPC, load wINST
278*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // extract opcode from wINST
279*795d594fSAndroid Build Coastguard Worker    SET_VREG_WIDE x3, w2
280*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // jump to next instruction
281*795d594fSAndroid Build Coastguard Worker
282*795d594fSAndroid Build Coastguard Worker%def op_nop():
283*795d594fSAndroid Build Coastguard Worker    FETCH_ADVANCE_INST 1                // advance to next instr, load rINST
284*795d594fSAndroid Build Coastguard Worker    GET_INST_OPCODE ip                  // ip<- opcode from rINST
285*795d594fSAndroid Build Coastguard Worker    GOTO_OPCODE ip                      // execute it
286*795d594fSAndroid Build Coastguard Worker
287*795d594fSAndroid Build Coastguard Worker%def op_unused_3e():
288*795d594fSAndroid Build Coastguard Worker%  unused()
289*795d594fSAndroid Build Coastguard Worker
290*795d594fSAndroid Build Coastguard Worker%def op_unused_3f():
291*795d594fSAndroid Build Coastguard Worker%  unused()
292*795d594fSAndroid Build Coastguard Worker
293*795d594fSAndroid Build Coastguard Worker%def op_unused_40():
294*795d594fSAndroid Build Coastguard Worker%  unused()
295*795d594fSAndroid Build Coastguard Worker
296*795d594fSAndroid Build Coastguard Worker%def op_unused_41():
297*795d594fSAndroid Build Coastguard Worker%  unused()
298*795d594fSAndroid Build Coastguard Worker
299*795d594fSAndroid Build Coastguard Worker%def op_unused_42():
300*795d594fSAndroid Build Coastguard Worker%  unused()
301*795d594fSAndroid Build Coastguard Worker
302*795d594fSAndroid Build Coastguard Worker%def op_unused_43():
303*795d594fSAndroid Build Coastguard Worker%  unused()
304*795d594fSAndroid Build Coastguard Worker
305*795d594fSAndroid Build Coastguard Worker%def op_unused_73():
306*795d594fSAndroid Build Coastguard Worker%  unused()
307*795d594fSAndroid Build Coastguard Worker
308*795d594fSAndroid Build Coastguard Worker%def op_unused_79():
309*795d594fSAndroid Build Coastguard Worker%  unused()
310*795d594fSAndroid Build Coastguard Worker
311*795d594fSAndroid Build Coastguard Worker%def op_unused_7a():
312*795d594fSAndroid Build Coastguard Worker%  unused()
313*795d594fSAndroid Build Coastguard Worker
314*795d594fSAndroid Build Coastguard Worker%def op_unused_e3():
315*795d594fSAndroid Build Coastguard Worker%  unused()
316*795d594fSAndroid Build Coastguard Worker
317*795d594fSAndroid Build Coastguard Worker%def op_unused_e4():
318*795d594fSAndroid Build Coastguard Worker%  unused()
319*795d594fSAndroid Build Coastguard Worker
320*795d594fSAndroid Build Coastguard Worker%def op_unused_e5():
321*795d594fSAndroid Build Coastguard Worker%  unused()
322*795d594fSAndroid Build Coastguard Worker
323*795d594fSAndroid Build Coastguard Worker%def op_unused_e6():
324*795d594fSAndroid Build Coastguard Worker%  unused()
325*795d594fSAndroid Build Coastguard Worker
326*795d594fSAndroid Build Coastguard Worker%def op_unused_e7():
327*795d594fSAndroid Build Coastguard Worker%  unused()
328*795d594fSAndroid Build Coastguard Worker
329*795d594fSAndroid Build Coastguard Worker%def op_unused_e8():
330*795d594fSAndroid Build Coastguard Worker%  unused()
331*795d594fSAndroid Build Coastguard Worker
332*795d594fSAndroid Build Coastguard Worker%def op_unused_e9():
333*795d594fSAndroid Build Coastguard Worker%  unused()
334*795d594fSAndroid Build Coastguard Worker
335*795d594fSAndroid Build Coastguard Worker%def op_unused_ea():
336*795d594fSAndroid Build Coastguard Worker%  unused()
337*795d594fSAndroid Build Coastguard Worker
338*795d594fSAndroid Build Coastguard Worker%def op_unused_eb():
339*795d594fSAndroid Build Coastguard Worker%  unused()
340*795d594fSAndroid Build Coastguard Worker
341*795d594fSAndroid Build Coastguard Worker%def op_unused_ec():
342*795d594fSAndroid Build Coastguard Worker%  unused()
343*795d594fSAndroid Build Coastguard Worker
344*795d594fSAndroid Build Coastguard Worker%def op_unused_ed():
345*795d594fSAndroid Build Coastguard Worker%  unused()
346*795d594fSAndroid Build Coastguard Worker
347*795d594fSAndroid Build Coastguard Worker%def op_unused_ee():
348*795d594fSAndroid Build Coastguard Worker%  unused()
349*795d594fSAndroid Build Coastguard Worker
350*795d594fSAndroid Build Coastguard Worker%def op_unused_ef():
351*795d594fSAndroid Build Coastguard Worker%  unused()
352*795d594fSAndroid Build Coastguard Worker
353*795d594fSAndroid Build Coastguard Worker%def op_unused_f0():
354*795d594fSAndroid Build Coastguard Worker%  unused()
355*795d594fSAndroid Build Coastguard Worker
356*795d594fSAndroid Build Coastguard Worker%def op_unused_f1():
357*795d594fSAndroid Build Coastguard Worker%  unused()
358*795d594fSAndroid Build Coastguard Worker
359*795d594fSAndroid Build Coastguard Worker%def op_unused_f2():
360*795d594fSAndroid Build Coastguard Worker%  unused()
361*795d594fSAndroid Build Coastguard Worker
362*795d594fSAndroid Build Coastguard Worker%def op_unused_f3():
363*795d594fSAndroid Build Coastguard Worker%  unused()
364*795d594fSAndroid Build Coastguard Worker
365*795d594fSAndroid Build Coastguard Worker%def op_unused_f4():
366*795d594fSAndroid Build Coastguard Worker%  unused()
367*795d594fSAndroid Build Coastguard Worker
368*795d594fSAndroid Build Coastguard Worker%def op_unused_f5():
369*795d594fSAndroid Build Coastguard Worker%  unused()
370*795d594fSAndroid Build Coastguard Worker
371*795d594fSAndroid Build Coastguard Worker%def op_unused_f6():
372*795d594fSAndroid Build Coastguard Worker%  unused()
373*795d594fSAndroid Build Coastguard Worker
374*795d594fSAndroid Build Coastguard Worker%def op_unused_f7():
375*795d594fSAndroid Build Coastguard Worker%  unused()
376*795d594fSAndroid Build Coastguard Worker
377*795d594fSAndroid Build Coastguard Worker%def op_unused_f8():
378*795d594fSAndroid Build Coastguard Worker%  unused()
379*795d594fSAndroid Build Coastguard Worker
380*795d594fSAndroid Build Coastguard Worker%def op_unused_f9():
381*795d594fSAndroid Build Coastguard Worker%  unused()
382*795d594fSAndroid Build Coastguard Worker
383*795d594fSAndroid Build Coastguard Worker%def op_unused_fc():
384*795d594fSAndroid Build Coastguard Worker%  unused()
385*795d594fSAndroid Build Coastguard Worker
386*795d594fSAndroid Build Coastguard Worker%def op_unused_fd():
387*795d594fSAndroid Build Coastguard Worker%  unused()
388