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