• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * This file was generated automatically by gen-mterp.py for 'arm'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: arm/header.S */
8/*
9 * Copyright (C) 2016 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 *      http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25  Art assembly interpreter notes:
26
27  First validate assembly code by implementing ExecuteXXXImpl() style body (doesn't
28  handle invoke, allows higher-level code to create frame & shadow frame.
29
30  Once that's working, support direct entry code & eliminate shadow frame (and
31  excess locals allocation.
32
33  Some (hopefully) temporary ugliness.  We'll treat rFP as pointing to the
34  base of the vreg array within the shadow frame.  Access the other fields,
35  dex_pc_, method_ and number_of_vregs_ via negative offsets.  For now, we'll continue
36  the shadow frame mechanism of double-storing object references - via rFP &
37  number_of_vregs_.
38
39 */
40
41/*
42ARM EABI general notes:
43
44r0-r3 hold first 4 args to a method; they are not preserved across method calls
45r4-r8 are available for general use
46r9 is given special treatment in some situations, but not for us
47r10 (sl) seems to be generally available
48r11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
49r12 (ip) is scratch -- not preserved across method calls
50r13 (sp) should be managed carefully in case a signal arrives
51r14 (lr) must be preserved
52r15 (pc) can be tinkered with directly
53
54r0 holds returns of <= 4 bytes
55r0-r1 hold returns of 8 bytes, low word in r0
56
57Callee must save/restore r4+ (except r12) if it modifies them.  If VFP
58is present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
59s0-s15 (d0-d7, q0-a3) do not need to be.
60
61Stack is "full descending".  Only the arguments that don't fit in the first 4
62registers are placed on the stack.  "sp" points at the first stacked argument
63(i.e. the 5th arg).
64
65VFP: single-precision results in s0, double-precision results in d0.
66
67In the EABI, "sp" must be 64-bit aligned on entry to a function, and any
6864-bit quantities (long long, double) must be 64-bit aligned.
69*/
70
71/*
72Mterp and ARM notes:
73
74The following registers have fixed assignments:
75
76  reg nick      purpose
77  r4  rPC       interpreted program counter, used for fetching instructions
78  r5  rFP       interpreted frame pointer, used for accessing locals and args
79  r6  rSELF     self (Thread) pointer
80  r7  rINST     first 16-bit code unit of current instruction
81  r8  rIBASE    interpreted instruction base pointer, used for computed goto
82  r10 rPROFILE  branch profiling countdown
83  r11 rREFS     base of object references in shadow frame  (ideally, we'll get rid of this later).
84
85Macros are provided for common operations.  Each macro MUST emit only
86one instruction to make instruction-counting easier.  They MUST NOT alter
87unspecified registers or condition codes.
88*/
89
90/*
91 * This is a #include, not a %include, because we want the C pre-processor
92 * to expand the macros into assembler assignment statements.
93 */
94#include "asm_support.h"
95
96#define MTERP_PROFILE_BRANCHES 1
97#define MTERP_LOGGING 0
98
99/* During bringup, we'll use the shadow frame model instead of rFP */
100/* single-purpose registers, given names for clarity */
101#define rPC      r4
102#define rFP      r5
103#define rSELF    r6
104#define rINST    r7
105#define rIBASE   r8
106#define rPROFILE r10
107#define rREFS    r11
108
109/*
110 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs.  So,
111 * to access other shadow frame fields, we need to use a backwards offset.  Define those here.
112 */
113#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
114#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
115#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
116#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
117#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
118#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
119#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
120#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
121#define OFF_FP_SHADOWFRAME OFF_FP(0)
122
123/*
124 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects.  Must
125 * be done *before* something throws.
126 *
127 * It's okay to do this more than once.
128 *
129 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
130 * dex byte codes.  However, the rest of the runtime expects dex pc to be an instruction
131 * offset into the code_items_[] array.  For effiency, we will "export" the
132 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
133 * to convert to a dex pc when needed.
134 */
135.macro EXPORT_PC
136    str  rPC, [rFP, #OFF_FP_DEX_PC_PTR]
137.endm
138
139.macro EXPORT_DEX_PC tmp
140    ldr  \tmp, [rFP, #OFF_FP_CODE_ITEM]
141    str  rPC, [rFP, #OFF_FP_DEX_PC_PTR]
142    add  \tmp, #CODEITEM_INSNS_OFFSET
143    sub  \tmp, rPC, \tmp
144    asr  \tmp, #1
145    str  \tmp, [rFP, #OFF_FP_DEX_PC]
146.endm
147
148/*
149 * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
150 */
151.macro FETCH_INST
152    ldrh    rINST, [rPC]
153.endm
154
155/*
156 * Fetch the next instruction from the specified offset.  Advances rPC
157 * to point to the next instruction.  "_count" is in 16-bit code units.
158 *
159 * Because of the limited size of immediate constants on ARM, this is only
160 * suitable for small forward movements (i.e. don't try to implement "goto"
161 * with this).
162 *
163 * This must come AFTER anything that can throw an exception, or the
164 * exception catch may miss.  (This also implies that it must come after
165 * EXPORT_PC.)
166 */
167.macro FETCH_ADVANCE_INST count
168    ldrh    rINST, [rPC, #((\count)*2)]!
169.endm
170
171/*
172 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
173 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
174 */
175.macro PREFETCH_ADVANCE_INST dreg, sreg, count
176    ldrh    \dreg, [\sreg, #((\count)*2)]!
177.endm
178
179/*
180 * Similar to FETCH_ADVANCE_INST, but does not update rPC.  Used to load
181 * rINST ahead of possible exception point.  Be sure to manually advance rPC
182 * later.
183 */
184.macro PREFETCH_INST count
185    ldrh    rINST, [rPC, #((\count)*2)]
186.endm
187
188/* Advance rPC by some number of code units. */
189.macro ADVANCE count
190  add  rPC, #((\count)*2)
191.endm
192
193/*
194 * Fetch the next instruction from an offset specified by _reg.  Updates
195 * rPC to point to the next instruction.  "_reg" must specify the distance
196 * in bytes, *not* 16-bit code units, and may be a signed value.
197 *
198 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
199 * bits that hold the shift distance are used for the half/byte/sign flags.
200 * In some cases we can pre-double _reg for free, so we require a byte offset
201 * here.
202 */
203.macro FETCH_ADVANCE_INST_RB reg
204    ldrh    rINST, [rPC, \reg]!
205.endm
206
207/*
208 * Fetch a half-word code unit from an offset past the current PC.  The
209 * "_count" value is in 16-bit code units.  Does not advance rPC.
210 *
211 * The "_S" variant works the same but treats the value as signed.
212 */
213.macro FETCH reg, count
214    ldrh    \reg, [rPC, #((\count)*2)]
215.endm
216
217.macro FETCH_S reg, count
218    ldrsh   \reg, [rPC, #((\count)*2)]
219.endm
220
221/*
222 * Fetch one byte from an offset past the current PC.  Pass in the same
223 * "_count" as you would for FETCH, and an additional 0/1 indicating which
224 * byte of the halfword you want (lo/hi).
225 */
226.macro FETCH_B reg, count, byte
227    ldrb     \reg, [rPC, #((\count)*2+(\byte))]
228.endm
229
230/*
231 * Put the instruction's opcode field into the specified register.
232 */
233.macro GET_INST_OPCODE reg
234    and     \reg, rINST, #255
235.endm
236
237/*
238 * Put the prefetched instruction's opcode field into the specified register.
239 */
240.macro GET_PREFETCHED_OPCODE oreg, ireg
241    and     \oreg, \ireg, #255
242.endm
243
244/*
245 * Begin executing the opcode in _reg.  Because this only jumps within the
246 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
247 */
248.macro GOTO_OPCODE reg
249    add     pc, rIBASE, \reg, lsl #7
250.endm
251.macro GOTO_OPCODE_BASE base,reg
252    add     pc, \base, \reg, lsl #7
253.endm
254
255/*
256 * Get/set the 32-bit value from a Dalvik register.
257 */
258.macro GET_VREG reg, vreg
259    ldr     \reg, [rFP, \vreg, lsl #2]
260.endm
261.macro SET_VREG reg, vreg
262    str     \reg, [rFP, \vreg, lsl #2]
263    mov     \reg, #0
264    str     \reg, [rREFS, \vreg, lsl #2]
265.endm
266.macro SET_VREG_OBJECT reg, vreg, tmpreg
267    str     \reg, [rFP, \vreg, lsl #2]
268    str     \reg, [rREFS, \vreg, lsl #2]
269.endm
270.macro SET_VREG_SHADOW reg, vreg
271    str     \reg, [rREFS, \vreg, lsl #2]
272.endm
273
274/*
275 * Clear the corresponding shadow regs for a vreg pair
276 */
277.macro CLEAR_SHADOW_PAIR vreg, tmp1, tmp2
278    mov     \tmp1, #0
279    add     \tmp2, \vreg, #1
280    SET_VREG_SHADOW \tmp1, \vreg
281    SET_VREG_SHADOW \tmp1, \tmp2
282.endm
283
284/*
285 * Convert a virtual register index into an address.
286 */
287.macro VREG_INDEX_TO_ADDR reg, vreg
288    add     \reg, rFP, \vreg, lsl #2   /* WARNING/FIXME: handle shadow frame vreg zero if store */
289.endm
290
291/*
292 * Refresh handler table.
293 */
294.macro REFRESH_IBASE
295  ldr     rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
296.endm
297
298/* File: arm/entry.S */
299/*
300 * Copyright (C) 2016 The Android Open Source Project
301 *
302 * Licensed under the Apache License, Version 2.0 (the "License");
303 * you may not use this file except in compliance with the License.
304 * You may obtain a copy of the License at
305 *
306 *      http://www.apache.org/licenses/LICENSE-2.0
307 *
308 * Unless required by applicable law or agreed to in writing, software
309 * distributed under the License is distributed on an "AS IS" BASIS,
310 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
311 * See the License for the specific language governing permissions and
312 * limitations under the License.
313 */
314/*
315 * Interpreter entry point.
316 */
317
318    .text
319    .align  2
320    .global ExecuteMterpImpl
321    .type   ExecuteMterpImpl, %function
322
323/*
324 * On entry:
325 *  r0  Thread* self/
326 *  r1  code_item
327 *  r2  ShadowFrame
328 *  r3  JValue* result_register
329 *
330 */
331
332ExecuteMterpImpl:
333    .fnstart
334    .save {r3-r10,fp,lr}
335    stmfd   sp!, {r3-r10,fp,lr}         @ save 10 regs, (r3 just to align 64)
336
337    /* Remember the return register */
338    str     r3, [r2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
339
340    /* Remember the code_item */
341    str     r1, [r2, #SHADOWFRAME_CODE_ITEM_OFFSET]
342
343    /* set up "named" registers */
344    mov     rSELF, r0
345    ldr     r0, [r2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
346    add     rFP, r2, #SHADOWFRAME_VREGS_OFFSET     @ point to vregs.
347    VREG_INDEX_TO_ADDR rREFS, r0                   @ point to reference array in shadow frame
348    ldr     r0, [r2, #SHADOWFRAME_DEX_PC_OFFSET]   @ Get starting dex_pc.
349    add     rPC, r1, #CODEITEM_INSNS_OFFSET        @ Point to base of insns[]
350    add     rPC, rPC, r0, lsl #1                   @ Create direct pointer to 1st dex opcode
351    EXPORT_PC
352
353    /* Starting ibase */
354    ldr     rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
355
356    /* Set up for backwards branches & osr profiling */
357    ldr     r0, [rFP, #OFF_FP_METHOD]
358    add     r1, rFP, #OFF_FP_SHADOWFRAME
359    bl      MterpSetUpHotnessCountdown
360    mov     rPROFILE, r0                @ Starting hotness countdown to rPROFILE
361
362    /* start executing the instruction at rPC */
363    FETCH_INST                          @ load rINST from rPC
364    GET_INST_OPCODE ip                  @ extract opcode from rINST
365    GOTO_OPCODE ip                      @ jump to next instruction
366    /* NOTE: no fallthrough */
367
368
369    .global artMterpAsmInstructionStart
370    .type   artMterpAsmInstructionStart, %function
371artMterpAsmInstructionStart = .L_op_nop
372    .text
373
374/* ------------------------------ */
375    .balign 128
376.L_op_nop: /* 0x00 */
377/* File: arm/op_nop.S */
378    FETCH_ADVANCE_INST 1                @ advance to next instr, load rINST
379    GET_INST_OPCODE ip                  @ ip<- opcode from rINST
380    GOTO_OPCODE ip                      @ execute it
381
382/* ------------------------------ */
383    .balign 128
384.L_op_move: /* 0x01 */
385/* File: arm/op_move.S */
386    /* for move, move-object, long-to-int */
387    /* op vA, vB */
388    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
389    ubfx    r0, rINST, #8, #4           @ r0<- A from 11:8
390    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
391    GET_VREG r2, r1                     @ r2<- fp[B]
392    GET_INST_OPCODE ip                  @ ip<- opcode from rINST
393    .if 0
394    SET_VREG_OBJECT r2, r0              @ fp[A]<- r2
395    .else
396    SET_VREG r2, r0                     @ fp[A]<- r2
397    .endif
398    GOTO_OPCODE ip                      @ execute next instruction
399
400/* ------------------------------ */
401    .balign 128
402.L_op_move_from16: /* 0x02 */
403/* File: arm/op_move_from16.S */
404    /* for: move/from16, move-object/from16 */
405    /* op vAA, vBBBB */
406    FETCH r1, 1                         @ r1<- BBBB
407    mov     r0, rINST, lsr #8           @ r0<- AA
408    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
409    GET_VREG r2, r1                     @ r2<- fp[BBBB]
410    GET_INST_OPCODE ip                  @ extract opcode from rINST
411    .if 0
412    SET_VREG_OBJECT r2, r0              @ fp[AA]<- r2
413    .else
414    SET_VREG r2, r0                     @ fp[AA]<- r2
415    .endif
416    GOTO_OPCODE ip                      @ jump to next instruction
417
418/* ------------------------------ */
419    .balign 128
420.L_op_move_16: /* 0x03 */
421/* File: arm/op_move_16.S */
422    /* for: move/16, move-object/16 */
423    /* op vAAAA, vBBBB */
424    FETCH r1, 2                         @ r1<- BBBB
425    FETCH r0, 1                         @ r0<- AAAA
426    FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
427    GET_VREG r2, r1                     @ r2<- fp[BBBB]
428    GET_INST_OPCODE ip                  @ extract opcode from rINST
429    .if 0
430    SET_VREG_OBJECT r2, r0              @ fp[AAAA]<- r2
431    .else
432    SET_VREG r2, r0                     @ fp[AAAA]<- r2
433    .endif
434    GOTO_OPCODE ip                      @ jump to next instruction
435
436/* ------------------------------ */
437    .balign 128
438.L_op_move_wide: /* 0x04 */
439/* File: arm/op_move_wide.S */
440    /* move-wide vA, vB */
441    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
442    mov     r3, rINST, lsr #12          @ r3<- B
443    ubfx    rINST, rINST, #8, #4        @ rINST<- A
444    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
445    VREG_INDEX_TO_ADDR r2, rINST        @ r2<- &fp[A]
446    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
447    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero out the shadow regs
448    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
449    GET_INST_OPCODE ip                  @ extract opcode from rINST
450    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
451    GOTO_OPCODE ip                      @ jump to next instruction
452
453/* ------------------------------ */
454    .balign 128
455.L_op_move_wide_from16: /* 0x05 */
456/* File: arm/op_move_wide_from16.S */
457    /* move-wide/from16 vAA, vBBBB */
458    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
459    FETCH r3, 1                         @ r3<- BBBB
460    mov     rINST, rINST, lsr #8        @ rINST<- AA
461    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[BBBB]
462    VREG_INDEX_TO_ADDR r2, rINST        @ r2<- &fp[AA]
463    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
464    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero out the shadow regs
465    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
466    GET_INST_OPCODE ip                  @ extract opcode from rINST
467    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
468    GOTO_OPCODE ip                      @ jump to next instruction
469
470/* ------------------------------ */
471    .balign 128
472.L_op_move_wide_16: /* 0x06 */
473/* File: arm/op_move_wide_16.S */
474    /* move-wide/16 vAAAA, vBBBB */
475    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
476    FETCH r3, 2                         @ r3<- BBBB
477    FETCH r2, 1                         @ r2<- AAAA
478    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[BBBB]
479    VREG_INDEX_TO_ADDR lr, r2           @ r2<- &fp[AAAA]
480    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
481    FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
482    CLEAR_SHADOW_PAIR r2, r3, ip        @ Zero out the shadow regs
483    stmia   lr, {r0-r1}                 @ fp[AAAA]<- r0/r1
484    GET_INST_OPCODE ip                  @ extract opcode from rINST
485    GOTO_OPCODE ip                      @ jump to next instruction
486
487/* ------------------------------ */
488    .balign 128
489.L_op_move_object: /* 0x07 */
490/* File: arm/op_move_object.S */
491/* File: arm/op_move.S */
492    /* for move, move-object, long-to-int */
493    /* op vA, vB */
494    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
495    ubfx    r0, rINST, #8, #4           @ r0<- A from 11:8
496    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
497    GET_VREG r2, r1                     @ r2<- fp[B]
498    GET_INST_OPCODE ip                  @ ip<- opcode from rINST
499    .if 1
500    SET_VREG_OBJECT r2, r0              @ fp[A]<- r2
501    .else
502    SET_VREG r2, r0                     @ fp[A]<- r2
503    .endif
504    GOTO_OPCODE ip                      @ execute next instruction
505
506
507/* ------------------------------ */
508    .balign 128
509.L_op_move_object_from16: /* 0x08 */
510/* File: arm/op_move_object_from16.S */
511/* File: arm/op_move_from16.S */
512    /* for: move/from16, move-object/from16 */
513    /* op vAA, vBBBB */
514    FETCH r1, 1                         @ r1<- BBBB
515    mov     r0, rINST, lsr #8           @ r0<- AA
516    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
517    GET_VREG r2, r1                     @ r2<- fp[BBBB]
518    GET_INST_OPCODE ip                  @ extract opcode from rINST
519    .if 1
520    SET_VREG_OBJECT r2, r0              @ fp[AA]<- r2
521    .else
522    SET_VREG r2, r0                     @ fp[AA]<- r2
523    .endif
524    GOTO_OPCODE ip                      @ jump to next instruction
525
526
527/* ------------------------------ */
528    .balign 128
529.L_op_move_object_16: /* 0x09 */
530/* File: arm/op_move_object_16.S */
531/* File: arm/op_move_16.S */
532    /* for: move/16, move-object/16 */
533    /* op vAAAA, vBBBB */
534    FETCH r1, 2                         @ r1<- BBBB
535    FETCH r0, 1                         @ r0<- AAAA
536    FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
537    GET_VREG r2, r1                     @ r2<- fp[BBBB]
538    GET_INST_OPCODE ip                  @ extract opcode from rINST
539    .if 1
540    SET_VREG_OBJECT r2, r0              @ fp[AAAA]<- r2
541    .else
542    SET_VREG r2, r0                     @ fp[AAAA]<- r2
543    .endif
544    GOTO_OPCODE ip                      @ jump to next instruction
545
546
547/* ------------------------------ */
548    .balign 128
549.L_op_move_result: /* 0x0a */
550/* File: arm/op_move_result.S */
551    /* for: move-result, move-result-object */
552    /* op vAA */
553    mov     r2, rINST, lsr #8           @ r2<- AA
554    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
555    ldr     r0, [rFP, #OFF_FP_RESULT_REGISTER]  @ get pointer to result JType.
556    ldr     r0, [r0]                    @ r0 <- result.i.
557    GET_INST_OPCODE ip                  @ extract opcode from rINST
558    .if 0
559    SET_VREG_OBJECT r0, r2, r1          @ fp[AA]<- r0
560    .else
561    SET_VREG r0, r2                     @ fp[AA]<- r0
562    .endif
563    GOTO_OPCODE ip                      @ jump to next instruction
564
565/* ------------------------------ */
566    .balign 128
567.L_op_move_result_wide: /* 0x0b */
568/* File: arm/op_move_result_wide.S */
569    /* move-result-wide vAA */
570    mov     rINST, rINST, lsr #8        @ rINST<- AA
571    ldr     r3, [rFP, #OFF_FP_RESULT_REGISTER]
572    VREG_INDEX_TO_ADDR r2, rINST        @ r2<- &fp[AA]
573    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
574    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero out the shadow regs
575    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
576    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
577    GET_INST_OPCODE ip                  @ extract opcode from rINST
578    GOTO_OPCODE ip                      @ jump to next instruction
579
580/* ------------------------------ */
581    .balign 128
582.L_op_move_result_object: /* 0x0c */
583/* File: arm/op_move_result_object.S */
584/* File: arm/op_move_result.S */
585    /* for: move-result, move-result-object */
586    /* op vAA */
587    mov     r2, rINST, lsr #8           @ r2<- AA
588    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
589    ldr     r0, [rFP, #OFF_FP_RESULT_REGISTER]  @ get pointer to result JType.
590    ldr     r0, [r0]                    @ r0 <- result.i.
591    GET_INST_OPCODE ip                  @ extract opcode from rINST
592    .if 1
593    SET_VREG_OBJECT r0, r2, r1          @ fp[AA]<- r0
594    .else
595    SET_VREG r0, r2                     @ fp[AA]<- r0
596    .endif
597    GOTO_OPCODE ip                      @ jump to next instruction
598
599
600/* ------------------------------ */
601    .balign 128
602.L_op_move_exception: /* 0x0d */
603/* File: arm/op_move_exception.S */
604    /* move-exception vAA */
605    mov     r2, rINST, lsr #8           @ r2<- AA
606    ldr     r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
607    mov     r1, #0                      @ r1<- 0
608    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
609    SET_VREG_OBJECT r3, r2              @ fp[AA]<- exception obj
610    GET_INST_OPCODE ip                  @ extract opcode from rINST
611    str     r1, [rSELF, #THREAD_EXCEPTION_OFFSET]  @ clear exception
612    GOTO_OPCODE ip                      @ jump to next instruction
613
614/* ------------------------------ */
615    .balign 128
616.L_op_return_void: /* 0x0e */
617/* File: arm/op_return_void.S */
618    .extern MterpThreadFenceForConstructor
619    bl      MterpThreadFenceForConstructor
620    ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
621    mov     r0, rSELF
622    ands    lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
623    blne    MterpSuspendCheck                       @ (self)
624    mov    r0, #0
625    mov    r1, #0
626    b      MterpReturn
627
628/* ------------------------------ */
629    .balign 128
630.L_op_return: /* 0x0f */
631/* File: arm/op_return.S */
632    /*
633     * Return a 32-bit value.
634     *
635     * for: return, return-object
636     */
637    /* op vAA */
638    .extern MterpThreadFenceForConstructor
639    bl      MterpThreadFenceForConstructor
640    ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
641    mov     r0, rSELF
642    ands    lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
643    blne    MterpSuspendCheck                       @ (self)
644    mov     r2, rINST, lsr #8           @ r2<- AA
645    GET_VREG r0, r2                     @ r0<- vAA
646    mov     r1, #0
647    b       MterpReturn
648
649/* ------------------------------ */
650    .balign 128
651.L_op_return_wide: /* 0x10 */
652/* File: arm/op_return_wide.S */
653    /*
654     * Return a 64-bit value.
655     */
656    /* return-wide vAA */
657    .extern MterpThreadFenceForConstructor
658    bl      MterpThreadFenceForConstructor
659    ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
660    mov     r0, rSELF
661    ands    lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
662    blne    MterpSuspendCheck                       @ (self)
663    mov     r2, rINST, lsr #8           @ r2<- AA
664    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[AA]
665    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
666    b       MterpReturn
667
668/* ------------------------------ */
669    .balign 128
670.L_op_return_object: /* 0x11 */
671/* File: arm/op_return_object.S */
672/* File: arm/op_return.S */
673    /*
674     * Return a 32-bit value.
675     *
676     * for: return, return-object
677     */
678    /* op vAA */
679    .extern MterpThreadFenceForConstructor
680    bl      MterpThreadFenceForConstructor
681    ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
682    mov     r0, rSELF
683    ands    lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
684    blne    MterpSuspendCheck                       @ (self)
685    mov     r2, rINST, lsr #8           @ r2<- AA
686    GET_VREG r0, r2                     @ r0<- vAA
687    mov     r1, #0
688    b       MterpReturn
689
690
691/* ------------------------------ */
692    .balign 128
693.L_op_const_4: /* 0x12 */
694/* File: arm/op_const_4.S */
695    /* const/4 vA, #+B */
696    sbfx    r1, rINST, #12, #4          @ r1<- sssssssB (sign-extended)
697    ubfx    r0, rINST, #8, #4           @ r0<- A
698    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
699    GET_INST_OPCODE ip                  @ ip<- opcode from rINST
700    SET_VREG r1, r0                     @ fp[A]<- r1
701    GOTO_OPCODE ip                      @ execute next instruction
702
703/* ------------------------------ */
704    .balign 128
705.L_op_const_16: /* 0x13 */
706/* File: arm/op_const_16.S */
707    /* const/16 vAA, #+BBBB */
708    FETCH_S r0, 1                       @ r0<- ssssBBBB (sign-extended)
709    mov     r3, rINST, lsr #8           @ r3<- AA
710    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
711    SET_VREG r0, r3                     @ vAA<- r0
712    GET_INST_OPCODE ip                  @ extract opcode from rINST
713    GOTO_OPCODE ip                      @ jump to next instruction
714
715/* ------------------------------ */
716    .balign 128
717.L_op_const: /* 0x14 */
718/* File: arm/op_const.S */
719    /* const vAA, #+BBBBbbbb */
720    mov     r3, rINST, lsr #8           @ r3<- AA
721    FETCH r0, 1                         @ r0<- bbbb (low)
722    FETCH r1, 2                         @ r1<- BBBB (high)
723    FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
724    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
725    GET_INST_OPCODE ip                  @ extract opcode from rINST
726    SET_VREG r0, r3                     @ vAA<- r0
727    GOTO_OPCODE ip                      @ jump to next instruction
728
729/* ------------------------------ */
730    .balign 128
731.L_op_const_high16: /* 0x15 */
732/* File: arm/op_const_high16.S */
733    /* const/high16 vAA, #+BBBB0000 */
734    FETCH r0, 1                         @ r0<- 0000BBBB (zero-extended)
735    mov     r3, rINST, lsr #8           @ r3<- AA
736    mov     r0, r0, lsl #16             @ r0<- BBBB0000
737    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
738    SET_VREG r0, r3                     @ vAA<- r0
739    GET_INST_OPCODE ip                  @ extract opcode from rINST
740    GOTO_OPCODE ip                      @ jump to next instruction
741
742/* ------------------------------ */
743    .balign 128
744.L_op_const_wide_16: /* 0x16 */
745/* File: arm/op_const_wide_16.S */
746    /* const-wide/16 vAA, #+BBBB */
747    FETCH_S r0, 1                       @ r0<- ssssBBBB (sign-extended)
748    mov     r3, rINST, lsr #8           @ r3<- AA
749    mov     r1, r0, asr #31             @ r1<- ssssssss
750    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
751    CLEAR_SHADOW_PAIR r3, r2, lr        @ Zero out the shadow regs
752    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[AA]
753    GET_INST_OPCODE ip                  @ extract opcode from rINST
754    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
755    GOTO_OPCODE ip                      @ jump to next instruction
756
757/* ------------------------------ */
758    .balign 128
759.L_op_const_wide_32: /* 0x17 */
760/* File: arm/op_const_wide_32.S */
761    /* const-wide/32 vAA, #+BBBBbbbb */
762    FETCH r0, 1                         @ r0<- 0000bbbb (low)
763    mov     r3, rINST, lsr #8           @ r3<- AA
764    FETCH_S r2, 2                       @ r2<- ssssBBBB (high)
765    FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
766    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
767    CLEAR_SHADOW_PAIR r3, r2, lr        @ Zero out the shadow regs
768    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[AA]
769    mov     r1, r0, asr #31             @ r1<- ssssssss
770    GET_INST_OPCODE ip                  @ extract opcode from rINST
771    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
772    GOTO_OPCODE ip                      @ jump to next instruction
773
774/* ------------------------------ */
775    .balign 128
776.L_op_const_wide: /* 0x18 */
777/* File: arm/op_const_wide.S */
778    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
779    FETCH r0, 1                         @ r0<- bbbb (low)
780    FETCH r1, 2                         @ r1<- BBBB (low middle)
781    FETCH r2, 3                         @ r2<- hhhh (high middle)
782    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
783    FETCH r3, 4                         @ r3<- HHHH (high)
784    mov     r9, rINST, lsr #8           @ r9<- AA
785    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
786    CLEAR_SHADOW_PAIR r9, r2, r3        @ Zero out the shadow regs
787    FETCH_ADVANCE_INST 5                @ advance rPC, load rINST
788    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
789    GET_INST_OPCODE ip                  @ extract opcode from rINST
790    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
791    GOTO_OPCODE ip                      @ jump to next instruction
792
793/* ------------------------------ */
794    .balign 128
795.L_op_const_wide_high16: /* 0x19 */
796/* File: arm/op_const_wide_high16.S */
797    /* const-wide/high16 vAA, #+BBBB000000000000 */
798    FETCH r1, 1                         @ r1<- 0000BBBB (zero-extended)
799    mov     r3, rINST, lsr #8           @ r3<- AA
800    mov     r0, #0                      @ r0<- 00000000
801    mov     r1, r1, lsl #16             @ r1<- BBBB0000
802    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
803    CLEAR_SHADOW_PAIR r3, r0, r2        @ Zero shadow regs
804    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[AA]
805    GET_INST_OPCODE ip                  @ extract opcode from rINST
806    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
807    GOTO_OPCODE ip                      @ jump to next instruction
808
809/* ------------------------------ */
810    .balign 128
811.L_op_const_string: /* 0x1a */
812/* File: arm/op_const_string.S */
813    /* const/string vAA, String@BBBB */
814    EXPORT_PC
815    FETCH r0, 1                         @ r0<- BBBB
816    mov     r1, rINST, lsr #8           @ r1<- AA
817    add     r2, rFP, #OFF_FP_SHADOWFRAME
818    mov     r3, rSELF
819    bl      MterpConstString            @ (index, tgt_reg, shadow_frame, self)
820    PREFETCH_INST 2                     @ load rINST
821    cmp     r0, #0                      @ fail?
822    bne     MterpPossibleException      @ let reference interpreter deal with it.
823    ADVANCE 2                           @ advance rPC
824    GET_INST_OPCODE ip                  @ extract opcode from rINST
825    GOTO_OPCODE ip                      @ jump to next instruction
826
827/* ------------------------------ */
828    .balign 128
829.L_op_const_string_jumbo: /* 0x1b */
830/* File: arm/op_const_string_jumbo.S */
831    /* const/string vAA, String@BBBBBBBB */
832    EXPORT_PC
833    FETCH r0, 1                         @ r0<- bbbb (low)
834    FETCH r2, 2                         @ r2<- BBBB (high)
835    mov     r1, rINST, lsr #8           @ r1<- AA
836    orr     r0, r0, r2, lsl #16         @ r1<- BBBBbbbb
837    add     r2, rFP, #OFF_FP_SHADOWFRAME
838    mov     r3, rSELF
839    bl      MterpConstString            @ (index, tgt_reg, shadow_frame, self)
840    PREFETCH_INST 3                     @ advance rPC
841    cmp     r0, #0                      @ fail?
842    bne     MterpPossibleException      @ let reference interpreter deal with it.
843    ADVANCE 3                           @ advance rPC
844    GET_INST_OPCODE ip                  @ extract opcode from rINST
845    GOTO_OPCODE ip                      @ jump to next instruction
846
847/* ------------------------------ */
848    .balign 128
849.L_op_const_class: /* 0x1c */
850/* File: arm/op_const_class.S */
851    /* const/class vAA, Class@BBBB */
852    EXPORT_PC
853    FETCH   r0, 1                       @ r0<- BBBB
854    mov     r1, rINST, lsr #8           @ r1<- AA
855    add     r2, rFP, #OFF_FP_SHADOWFRAME
856    mov     r3, rSELF
857    bl      MterpConstClass             @ (index, tgt_reg, shadow_frame, self)
858    PREFETCH_INST 2
859    cmp     r0, #0
860    bne     MterpPossibleException
861    ADVANCE 2
862    GET_INST_OPCODE ip                  @ extract opcode from rINST
863    GOTO_OPCODE ip                      @ jump to next instruction
864
865/* ------------------------------ */
866    .balign 128
867.L_op_monitor_enter: /* 0x1d */
868/* File: arm/op_monitor_enter.S */
869    /*
870     * Synchronize on an object.
871     */
872    /* monitor-enter vAA */
873    EXPORT_PC
874    mov      r2, rINST, lsr #8           @ r2<- AA
875    GET_VREG r0, r2                      @ r0<- vAA (object)
876    mov      r1, rSELF                   @ r1<- self
877    bl       artLockObjectFromCode
878    cmp      r0, #0
879    bne      MterpException
880    FETCH_ADVANCE_INST 1
881    GET_INST_OPCODE ip                   @ extract opcode from rINST
882    GOTO_OPCODE ip                       @ jump to next instruction
883
884/* ------------------------------ */
885    .balign 128
886.L_op_monitor_exit: /* 0x1e */
887/* File: arm/op_monitor_exit.S */
888    /*
889     * Unlock an object.
890     *
891     * Exceptions that occur when unlocking a monitor need to appear as
892     * if they happened at the following instruction.  See the Dalvik
893     * instruction spec.
894     */
895    /* monitor-exit vAA */
896    EXPORT_PC
897    mov      r2, rINST, lsr #8          @ r2<- AA
898    GET_VREG r0, r2                     @ r0<- vAA (object)
899    mov      r1, rSELF                  @ r0<- self
900    bl       artUnlockObjectFromCode    @ r0<- success for unlock(self, obj)
901    cmp     r0, #0                      @ failed?
902    bne     MterpException
903    FETCH_ADVANCE_INST 1                @ before throw: advance rPC, load rINST
904    GET_INST_OPCODE ip                  @ extract opcode from rINST
905    GOTO_OPCODE ip                      @ jump to next instruction
906
907/* ------------------------------ */
908    .balign 128
909.L_op_check_cast: /* 0x1f */
910/* File: arm/op_check_cast.S */
911    /*
912     * Check to see if a cast from one class to another is allowed.
913     */
914    /* check-cast vAA, class@BBBB */
915    EXPORT_PC
916    FETCH    r0, 1                      @ r0<- BBBB
917    mov      r1, rINST, lsr #8          @ r1<- AA
918    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &object
919    ldr      r2, [rFP, #OFF_FP_METHOD]  @ r2<- method
920    mov      r3, rSELF                  @ r3<- self
921    bl       MterpCheckCast             @ (index, &obj, method, self)
922    PREFETCH_INST 2
923    cmp      r0, #0
924    bne      MterpPossibleException
925    ADVANCE  2
926    GET_INST_OPCODE ip                  @ extract opcode from rINST
927    GOTO_OPCODE ip                      @ jump to next instruction
928
929/* ------------------------------ */
930    .balign 128
931.L_op_instance_of: /* 0x20 */
932/* File: arm/op_instance_of.S */
933    /*
934     * Check to see if an object reference is an instance of a class.
935     *
936     * Most common situation is a non-null object, being compared against
937     * an already-resolved class.
938     */
939    /* instance-of vA, vB, class@CCCC */
940    EXPORT_PC
941    FETCH     r0, 1                     @ r0<- CCCC
942    mov       r1, rINST, lsr #12        @ r1<- B
943    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &object
944    ldr       r2, [rFP, #OFF_FP_METHOD] @ r2<- method
945    mov       r3, rSELF                 @ r3<- self
946    bl        MterpInstanceOf           @ (index, &obj, method, self)
947    ldr       r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
948    ubfx      r9, rINST, #8, #4         @ r9<- A
949    PREFETCH_INST 2
950    cmp       r1, #0                    @ exception pending?
951    bne       MterpException
952    ADVANCE 2                           @ advance rPC
953    SET_VREG r0, r9                     @ vA<- r0
954    GET_INST_OPCODE ip                  @ extract opcode from rINST
955    GOTO_OPCODE ip                      @ jump to next instruction
956
957/* ------------------------------ */
958    .balign 128
959.L_op_array_length: /* 0x21 */
960/* File: arm/op_array_length.S */
961    /*
962     * Return the length of an array.
963     */
964    mov     r1, rINST, lsr #12          @ r1<- B
965    ubfx    r2, rINST, #8, #4           @ r2<- A
966    GET_VREG r0, r1                     @ r0<- vB (object ref)
967    cmp     r0, #0                      @ is object null?
968    beq     common_errNullObject        @ yup, fail
969    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
970    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- array length
971    GET_INST_OPCODE ip                  @ extract opcode from rINST
972    SET_VREG r3, r2                     @ vB<- length
973    GOTO_OPCODE ip                      @ jump to next instruction
974
975/* ------------------------------ */
976    .balign 128
977.L_op_new_instance: /* 0x22 */
978/* File: arm/op_new_instance.S */
979    /*
980     * Create a new instance of a class.
981     */
982    /* new-instance vAA, class@BBBB */
983    EXPORT_PC
984    add     r0, rFP, #OFF_FP_SHADOWFRAME
985    mov     r1, rSELF
986    mov     r2, rINST
987    bl      MterpNewInstance           @ (shadow_frame, self, inst_data)
988    cmp     r0, #0
989    beq     MterpPossibleException
990    FETCH_ADVANCE_INST 2               @ advance rPC, load rINST
991    GET_INST_OPCODE ip                 @ extract opcode from rINST
992    GOTO_OPCODE ip                     @ jump to next instruction
993
994/* ------------------------------ */
995    .balign 128
996.L_op_new_array: /* 0x23 */
997/* File: arm/op_new_array.S */
998    /*
999     * Allocate an array of objects, specified with the array class
1000     * and a count.
1001     *
1002     * The verifier guarantees that this is an array class, so we don't
1003     * check for it here.
1004     */
1005    /* new-array vA, vB, class@CCCC */
1006    EXPORT_PC
1007    add     r0, rFP, #OFF_FP_SHADOWFRAME
1008    mov     r1, rPC
1009    mov     r2, rINST
1010    mov     r3, rSELF
1011    bl      MterpNewArray
1012    cmp     r0, #0
1013    beq     MterpPossibleException
1014    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1015    GET_INST_OPCODE ip                  @ extract opcode from rINST
1016    GOTO_OPCODE ip                      @ jump to next instruction
1017
1018/* ------------------------------ */
1019    .balign 128
1020.L_op_filled_new_array: /* 0x24 */
1021/* File: arm/op_filled_new_array.S */
1022    /*
1023     * Create a new array with elements filled from registers.
1024     *
1025     * for: filled-new-array, filled-new-array/range
1026     */
1027    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1028    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1029    .extern MterpFilledNewArray
1030    EXPORT_PC
1031    add     r0, rFP, #OFF_FP_SHADOWFRAME
1032    mov     r1, rPC
1033    mov     r2, rSELF
1034    bl      MterpFilledNewArray
1035    cmp     r0, #0
1036    beq     MterpPossibleException
1037    FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
1038    GET_INST_OPCODE ip                  @ extract opcode from rINST
1039    GOTO_OPCODE ip                      @ jump to next instruction
1040
1041/* ------------------------------ */
1042    .balign 128
1043.L_op_filled_new_array_range: /* 0x25 */
1044/* File: arm/op_filled_new_array_range.S */
1045/* File: arm/op_filled_new_array.S */
1046    /*
1047     * Create a new array with elements filled from registers.
1048     *
1049     * for: filled-new-array, filled-new-array/range
1050     */
1051    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1052    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1053    .extern MterpFilledNewArrayRange
1054    EXPORT_PC
1055    add     r0, rFP, #OFF_FP_SHADOWFRAME
1056    mov     r1, rPC
1057    mov     r2, rSELF
1058    bl      MterpFilledNewArrayRange
1059    cmp     r0, #0
1060    beq     MterpPossibleException
1061    FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
1062    GET_INST_OPCODE ip                  @ extract opcode from rINST
1063    GOTO_OPCODE ip                      @ jump to next instruction
1064
1065
1066/* ------------------------------ */
1067    .balign 128
1068.L_op_fill_array_data: /* 0x26 */
1069/* File: arm/op_fill_array_data.S */
1070    /* fill-array-data vAA, +BBBBBBBB */
1071    EXPORT_PC
1072    FETCH r0, 1                         @ r0<- bbbb (lo)
1073    FETCH r1, 2                         @ r1<- BBBB (hi)
1074    mov     r3, rINST, lsr #8           @ r3<- AA
1075    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1076    GET_VREG r0, r3                     @ r0<- vAA (array object)
1077    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1078    bl      MterpFillArrayData          @ (obj, payload)
1079    cmp     r0, #0                      @ 0 means an exception is thrown
1080    beq     MterpPossibleException      @ exception?
1081    FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
1082    GET_INST_OPCODE ip                  @ extract opcode from rINST
1083    GOTO_OPCODE ip                      @ jump to next instruction
1084
1085/* ------------------------------ */
1086    .balign 128
1087.L_op_throw: /* 0x27 */
1088/* File: arm/op_throw.S */
1089    /*
1090     * Throw an exception object in the current thread.
1091     */
1092    /* throw vAA */
1093    EXPORT_PC
1094    mov      r2, rINST, lsr #8           @ r2<- AA
1095    GET_VREG r1, r2                      @ r1<- vAA (exception object)
1096    cmp      r1, #0                      @ null object?
1097    beq      common_errNullObject        @ yes, throw an NPE instead
1098    str      r1, [rSELF, #THREAD_EXCEPTION_OFFSET]  @ thread->exception<- obj
1099    b        MterpException
1100
1101/* ------------------------------ */
1102    .balign 128
1103.L_op_goto: /* 0x28 */
1104/* File: arm/op_goto.S */
1105    /*
1106     * Unconditional branch, 8-bit offset.
1107     *
1108     * The branch distance is a signed code-unit offset, which we need to
1109     * double to get a byte offset.
1110     */
1111    /* goto +AA */
1112    sbfx    rINST, rINST, #8, #8           @ rINST<- ssssssAA (sign-extended)
1113    b       MterpCommonTakenBranchNoFlags
1114
1115/* ------------------------------ */
1116    .balign 128
1117.L_op_goto_16: /* 0x29 */
1118/* File: arm/op_goto_16.S */
1119    /*
1120     * Unconditional branch, 16-bit offset.
1121     *
1122     * The branch distance is a signed code-unit offset, which we need to
1123     * double to get a byte offset.
1124     */
1125    /* goto/16 +AAAA */
1126    FETCH_S rINST, 1                    @ rINST<- ssssAAAA (sign-extended)
1127    b       MterpCommonTakenBranchNoFlags
1128
1129/* ------------------------------ */
1130    .balign 128
1131.L_op_goto_32: /* 0x2a */
1132/* File: arm/op_goto_32.S */
1133    /*
1134     * Unconditional branch, 32-bit offset.
1135     *
1136     * The branch distance is a signed code-unit offset, which we need to
1137     * double to get a byte offset.
1138     *
1139     * Unlike most opcodes, this one is allowed to branch to itself, so
1140     * our "backward branch" test must be "<=0" instead of "<0".  Because
1141     * we need the V bit set, we'll use an adds to convert from Dalvik
1142     * offset to byte offset.
1143     */
1144    /* goto/32 +AAAAAAAA */
1145    FETCH r0, 1                         @ r0<- aaaa (lo)
1146    FETCH r3, 2                         @ r1<- AAAA (hi)
1147    orrs    rINST, r0, r3, lsl #16      @ rINST<- AAAAaaaa
1148    b       MterpCommonTakenBranch
1149
1150/* ------------------------------ */
1151    .balign 128
1152.L_op_packed_switch: /* 0x2b */
1153/* File: arm/op_packed_switch.S */
1154    /*
1155     * Handle a packed-switch or sparse-switch instruction.  In both cases
1156     * we decode it and hand it off to a helper function.
1157     *
1158     * We don't really expect backward branches in a switch statement, but
1159     * they're perfectly legal, so we check for them here.
1160     *
1161     * for: packed-switch, sparse-switch
1162     */
1163    /* op vAA, +BBBB */
1164    FETCH r0, 1                         @ r0<- bbbb (lo)
1165    FETCH r1, 2                         @ r1<- BBBB (hi)
1166    mov     r3, rINST, lsr #8           @ r3<- AA
1167    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1168    GET_VREG r1, r3                     @ r1<- vAA
1169    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1170    bl      MterpDoPackedSwitch                       @ r0<- code-unit branch offset
1171    movs    rINST, r0
1172    b       MterpCommonTakenBranch
1173
1174/* ------------------------------ */
1175    .balign 128
1176.L_op_sparse_switch: /* 0x2c */
1177/* File: arm/op_sparse_switch.S */
1178/* File: arm/op_packed_switch.S */
1179    /*
1180     * Handle a packed-switch or sparse-switch instruction.  In both cases
1181     * we decode it and hand it off to a helper function.
1182     *
1183     * We don't really expect backward branches in a switch statement, but
1184     * they're perfectly legal, so we check for them here.
1185     *
1186     * for: packed-switch, sparse-switch
1187     */
1188    /* op vAA, +BBBB */
1189    FETCH r0, 1                         @ r0<- bbbb (lo)
1190    FETCH r1, 2                         @ r1<- BBBB (hi)
1191    mov     r3, rINST, lsr #8           @ r3<- AA
1192    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1193    GET_VREG r1, r3                     @ r1<- vAA
1194    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1195    bl      MterpDoSparseSwitch                       @ r0<- code-unit branch offset
1196    movs    rINST, r0
1197    b       MterpCommonTakenBranch
1198
1199
1200/* ------------------------------ */
1201    .balign 128
1202.L_op_cmpl_float: /* 0x2d */
1203/* File: arm/op_cmpl_float.S */
1204    /*
1205     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1206     * destination register based on the results of the comparison.
1207     *
1208     * int compare(x, y) {
1209     *     if (x == y) {
1210     *         return 0;
1211     *     } else if (x > y) {
1212     *         return 1;
1213     *     } else if (x < y) {
1214     *         return -1;
1215     *     } else {
1216     *         return -1;
1217     *     }
1218     * }
1219     */
1220    /* op vAA, vBB, vCC */
1221    FETCH r0, 1                         @ r0<- CCBB
1222    mov     r9, rINST, lsr #8           @ r9<- AA
1223    and     r2, r0, #255                @ r2<- BB
1224    mov     r3, r0, lsr #8              @ r3<- CC
1225    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
1226    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
1227    flds    s0, [r2]                    @ s0<- vBB
1228    flds    s1, [r3]                    @ s1<- vCC
1229    vcmpe.f32  s0, s1                   @ compare (vBB, vCC)
1230    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1231    mvn     r0, #0                      @ r0<- -1 (default)
1232    GET_INST_OPCODE ip                  @ extract opcode from rINST
1233    fmstat                              @ export status flags
1234    movgt   r0, #1                      @ (greater than) r1<- 1
1235    moveq   r0, #0                      @ (equal) r1<- 0
1236    SET_VREG r0, r9                     @ vAA<- r0
1237    GOTO_OPCODE ip                      @ jump to next instruction
1238
1239/* ------------------------------ */
1240    .balign 128
1241.L_op_cmpg_float: /* 0x2e */
1242/* File: arm/op_cmpg_float.S */
1243    /*
1244     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1245     * destination register based on the results of the comparison.
1246     *
1247     * int compare(x, y) {
1248     *     if (x == y) {
1249     *         return 0;
1250     *     } else if (x < y) {
1251     *         return -1;
1252     *     } else if (x > y) {
1253     *         return 1;
1254     *     } else {
1255     *         return 1;
1256     *     }
1257     * }
1258     */
1259    /* op vAA, vBB, vCC */
1260    FETCH r0, 1                         @ r0<- CCBB
1261    mov     r9, rINST, lsr #8           @ r9<- AA
1262    and     r2, r0, #255                @ r2<- BB
1263    mov     r3, r0, lsr #8              @ r3<- CC
1264    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
1265    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
1266    flds    s0, [r2]                    @ s0<- vBB
1267    flds    s1, [r3]                    @ s1<- vCC
1268    vcmpe.f32 s0, s1                    @ compare (vBB, vCC)
1269    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1270    mov     r0, #1                      @ r0<- 1 (default)
1271    GET_INST_OPCODE ip                  @ extract opcode from rINST
1272    fmstat                              @ export status flags
1273    mvnmi   r0, #0                      @ (less than) r1<- -1
1274    moveq   r0, #0                      @ (equal) r1<- 0
1275    SET_VREG r0, r9                     @ vAA<- r0
1276    GOTO_OPCODE ip                      @ jump to next instruction
1277
1278/* ------------------------------ */
1279    .balign 128
1280.L_op_cmpl_double: /* 0x2f */
1281/* File: arm/op_cmpl_double.S */
1282    /*
1283     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1284     * destination register based on the results of the comparison.
1285     *
1286     * int compare(x, y) {
1287     *     if (x == y) {
1288     *         return 0;
1289     *     } else if (x > y) {
1290     *         return 1;
1291     *     } else if (x < y) {
1292     *         return -1;
1293     *     } else {
1294     *         return -1;
1295     *     }
1296     * }
1297     */
1298    /* op vAA, vBB, vCC */
1299    FETCH r0, 1                         @ r0<- CCBB
1300    mov     r9, rINST, lsr #8           @ r9<- AA
1301    and     r2, r0, #255                @ r2<- BB
1302    mov     r3, r0, lsr #8              @ r3<- CC
1303    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
1304    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
1305    fldd    d0, [r2]                    @ d0<- vBB
1306    fldd    d1, [r3]                    @ d1<- vCC
1307    vcmpe.f64 d0, d1                    @ compare (vBB, vCC)
1308    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1309    mvn     r0, #0                      @ r0<- -1 (default)
1310    GET_INST_OPCODE ip                  @ extract opcode from rINST
1311    fmstat                              @ export status flags
1312    movgt   r0, #1                      @ (greater than) r1<- 1
1313    moveq   r0, #0                      @ (equal) r1<- 0
1314    SET_VREG r0, r9                     @ vAA<- r0
1315    GOTO_OPCODE ip                      @ jump to next instruction
1316
1317/* ------------------------------ */
1318    .balign 128
1319.L_op_cmpg_double: /* 0x30 */
1320/* File: arm/op_cmpg_double.S */
1321    /*
1322     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1323     * destination register based on the results of the comparison.
1324     *
1325     * int compare(x, y) {
1326     *     if (x == y) {
1327     *         return 0;
1328     *     } else if (x < y) {
1329     *         return -1;
1330     *     } else if (x > y) {
1331     *         return 1;
1332     *     } else {
1333     *         return 1;
1334     *     }
1335     * }
1336     */
1337    /* op vAA, vBB, vCC */
1338    FETCH r0, 1                         @ r0<- CCBB
1339    mov     r9, rINST, lsr #8           @ r9<- AA
1340    and     r2, r0, #255                @ r2<- BB
1341    mov     r3, r0, lsr #8              @ r3<- CC
1342    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
1343    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
1344    fldd    d0, [r2]                    @ d0<- vBB
1345    fldd    d1, [r3]                    @ d1<- vCC
1346    vcmpe.f64 d0, d1                    @ compare (vBB, vCC)
1347    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1348    mov     r0, #1                      @ r0<- 1 (default)
1349    GET_INST_OPCODE ip                  @ extract opcode from rINST
1350    fmstat                              @ export status flags
1351    mvnmi   r0, #0                      @ (less than) r1<- -1
1352    moveq   r0, #0                      @ (equal) r1<- 0
1353    SET_VREG r0, r9                     @ vAA<- r0
1354    GOTO_OPCODE ip                      @ jump to next instruction
1355
1356/* ------------------------------ */
1357    .balign 128
1358.L_op_cmp_long: /* 0x31 */
1359/* File: arm/op_cmp_long.S */
1360    /*
1361     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1362     * register based on the results of the comparison.
1363     */
1364    /* cmp-long vAA, vBB, vCC */
1365    FETCH r0, 1                         @ r0<- CCBB
1366    mov     r9, rINST, lsr #8           @ r9<- AA
1367    and     r2, r0, #255                @ r2<- BB
1368    mov     r3, r0, lsr #8              @ r3<- CC
1369    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
1370    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
1371    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1372    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1373    cmp     r0, r2
1374    sbcs    ip, r1, r3                  @ Sets correct CCs for checking LT (but not EQ/NE)
1375    mov     ip, #0
1376    mvnlt   ip, #0                      @ -1
1377    cmpeq   r0, r2                      @ For correct EQ/NE, we may need to repeat the first CMP
1378    orrne   ip, #1
1379    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1380    SET_VREG ip, r9                     @ vAA<- ip
1381    GET_INST_OPCODE ip                  @ extract opcode from rINST
1382    GOTO_OPCODE ip                      @ jump to next instruction
1383
1384/* ------------------------------ */
1385    .balign 128
1386.L_op_if_eq: /* 0x32 */
1387/* File: arm/op_if_eq.S */
1388/* File: arm/bincmp.S */
1389    /*
1390     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1391     * fragment that specifies the comparison to perform.
1392     *
1393     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1394     */
1395    /* if-cmp vA, vB, +CCCC */
1396    mov     r1, rINST, lsr #12          @ r1<- B
1397    ubfx    r0, rINST, #8, #4           @ r0<- A
1398    GET_VREG r3, r1                     @ r3<- vB
1399    GET_VREG r0, r0                     @ r0<- vA
1400    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1401    cmp     r0, r3                      @ compare (vA, vB)
1402    beq MterpCommonTakenBranchNoFlags
1403    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1404    beq     .L_check_not_taken_osr
1405    FETCH_ADVANCE_INST 2
1406    GET_INST_OPCODE ip                  @ extract opcode from rINST
1407    GOTO_OPCODE ip                      @ jump to next instruction
1408
1409
1410/* ------------------------------ */
1411    .balign 128
1412.L_op_if_ne: /* 0x33 */
1413/* File: arm/op_if_ne.S */
1414/* File: arm/bincmp.S */
1415    /*
1416     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1417     * fragment that specifies the comparison to perform.
1418     *
1419     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1420     */
1421    /* if-cmp vA, vB, +CCCC */
1422    mov     r1, rINST, lsr #12          @ r1<- B
1423    ubfx    r0, rINST, #8, #4           @ r0<- A
1424    GET_VREG r3, r1                     @ r3<- vB
1425    GET_VREG r0, r0                     @ r0<- vA
1426    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1427    cmp     r0, r3                      @ compare (vA, vB)
1428    bne MterpCommonTakenBranchNoFlags
1429    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1430    beq     .L_check_not_taken_osr
1431    FETCH_ADVANCE_INST 2
1432    GET_INST_OPCODE ip                  @ extract opcode from rINST
1433    GOTO_OPCODE ip                      @ jump to next instruction
1434
1435
1436/* ------------------------------ */
1437    .balign 128
1438.L_op_if_lt: /* 0x34 */
1439/* File: arm/op_if_lt.S */
1440/* File: arm/bincmp.S */
1441    /*
1442     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1443     * fragment that specifies the comparison to perform.
1444     *
1445     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1446     */
1447    /* if-cmp vA, vB, +CCCC */
1448    mov     r1, rINST, lsr #12          @ r1<- B
1449    ubfx    r0, rINST, #8, #4           @ r0<- A
1450    GET_VREG r3, r1                     @ r3<- vB
1451    GET_VREG r0, r0                     @ r0<- vA
1452    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1453    cmp     r0, r3                      @ compare (vA, vB)
1454    blt MterpCommonTakenBranchNoFlags
1455    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1456    beq     .L_check_not_taken_osr
1457    FETCH_ADVANCE_INST 2
1458    GET_INST_OPCODE ip                  @ extract opcode from rINST
1459    GOTO_OPCODE ip                      @ jump to next instruction
1460
1461
1462/* ------------------------------ */
1463    .balign 128
1464.L_op_if_ge: /* 0x35 */
1465/* File: arm/op_if_ge.S */
1466/* File: arm/bincmp.S */
1467    /*
1468     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1469     * fragment that specifies the comparison to perform.
1470     *
1471     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1472     */
1473    /* if-cmp vA, vB, +CCCC */
1474    mov     r1, rINST, lsr #12          @ r1<- B
1475    ubfx    r0, rINST, #8, #4           @ r0<- A
1476    GET_VREG r3, r1                     @ r3<- vB
1477    GET_VREG r0, r0                     @ r0<- vA
1478    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1479    cmp     r0, r3                      @ compare (vA, vB)
1480    bge MterpCommonTakenBranchNoFlags
1481    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1482    beq     .L_check_not_taken_osr
1483    FETCH_ADVANCE_INST 2
1484    GET_INST_OPCODE ip                  @ extract opcode from rINST
1485    GOTO_OPCODE ip                      @ jump to next instruction
1486
1487
1488/* ------------------------------ */
1489    .balign 128
1490.L_op_if_gt: /* 0x36 */
1491/* File: arm/op_if_gt.S */
1492/* File: arm/bincmp.S */
1493    /*
1494     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1495     * fragment that specifies the comparison to perform.
1496     *
1497     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1498     */
1499    /* if-cmp vA, vB, +CCCC */
1500    mov     r1, rINST, lsr #12          @ r1<- B
1501    ubfx    r0, rINST, #8, #4           @ r0<- A
1502    GET_VREG r3, r1                     @ r3<- vB
1503    GET_VREG r0, r0                     @ r0<- vA
1504    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1505    cmp     r0, r3                      @ compare (vA, vB)
1506    bgt MterpCommonTakenBranchNoFlags
1507    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1508    beq     .L_check_not_taken_osr
1509    FETCH_ADVANCE_INST 2
1510    GET_INST_OPCODE ip                  @ extract opcode from rINST
1511    GOTO_OPCODE ip                      @ jump to next instruction
1512
1513
1514/* ------------------------------ */
1515    .balign 128
1516.L_op_if_le: /* 0x37 */
1517/* File: arm/op_if_le.S */
1518/* File: arm/bincmp.S */
1519    /*
1520     * Generic two-operand compare-and-branch operation.  Provide a "condition"
1521     * fragment that specifies the comparison to perform.
1522     *
1523     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1524     */
1525    /* if-cmp vA, vB, +CCCC */
1526    mov     r1, rINST, lsr #12          @ r1<- B
1527    ubfx    r0, rINST, #8, #4           @ r0<- A
1528    GET_VREG r3, r1                     @ r3<- vB
1529    GET_VREG r0, r0                     @ r0<- vA
1530    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1531    cmp     r0, r3                      @ compare (vA, vB)
1532    ble MterpCommonTakenBranchNoFlags
1533    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1534    beq     .L_check_not_taken_osr
1535    FETCH_ADVANCE_INST 2
1536    GET_INST_OPCODE ip                  @ extract opcode from rINST
1537    GOTO_OPCODE ip                      @ jump to next instruction
1538
1539
1540/* ------------------------------ */
1541    .balign 128
1542.L_op_if_eqz: /* 0x38 */
1543/* File: arm/op_if_eqz.S */
1544/* File: arm/zcmp.S */
1545    /*
1546     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1547     * fragment that specifies the comparison to perform.
1548     *
1549     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1550     */
1551    /* if-cmp vAA, +BBBB */
1552    mov     r0, rINST, lsr #8           @ r0<- AA
1553    GET_VREG r0, r0                     @ r0<- vAA
1554    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1555    cmp     r0, #0                      @ compare (vA, 0)
1556    beq MterpCommonTakenBranchNoFlags
1557    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1558    beq     .L_check_not_taken_osr
1559    FETCH_ADVANCE_INST 2
1560    GET_INST_OPCODE ip                  @ extract opcode from rINST
1561    GOTO_OPCODE ip                      @ jump to next instruction
1562
1563
1564/* ------------------------------ */
1565    .balign 128
1566.L_op_if_nez: /* 0x39 */
1567/* File: arm/op_if_nez.S */
1568/* File: arm/zcmp.S */
1569    /*
1570     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1571     * fragment that specifies the comparison to perform.
1572     *
1573     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1574     */
1575    /* if-cmp vAA, +BBBB */
1576    mov     r0, rINST, lsr #8           @ r0<- AA
1577    GET_VREG r0, r0                     @ r0<- vAA
1578    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1579    cmp     r0, #0                      @ compare (vA, 0)
1580    bne MterpCommonTakenBranchNoFlags
1581    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1582    beq     .L_check_not_taken_osr
1583    FETCH_ADVANCE_INST 2
1584    GET_INST_OPCODE ip                  @ extract opcode from rINST
1585    GOTO_OPCODE ip                      @ jump to next instruction
1586
1587
1588/* ------------------------------ */
1589    .balign 128
1590.L_op_if_ltz: /* 0x3a */
1591/* File: arm/op_if_ltz.S */
1592/* File: arm/zcmp.S */
1593    /*
1594     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1595     * fragment that specifies the comparison to perform.
1596     *
1597     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1598     */
1599    /* if-cmp vAA, +BBBB */
1600    mov     r0, rINST, lsr #8           @ r0<- AA
1601    GET_VREG r0, r0                     @ r0<- vAA
1602    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1603    cmp     r0, #0                      @ compare (vA, 0)
1604    blt MterpCommonTakenBranchNoFlags
1605    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1606    beq     .L_check_not_taken_osr
1607    FETCH_ADVANCE_INST 2
1608    GET_INST_OPCODE ip                  @ extract opcode from rINST
1609    GOTO_OPCODE ip                      @ jump to next instruction
1610
1611
1612/* ------------------------------ */
1613    .balign 128
1614.L_op_if_gez: /* 0x3b */
1615/* File: arm/op_if_gez.S */
1616/* File: arm/zcmp.S */
1617    /*
1618     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1619     * fragment that specifies the comparison to perform.
1620     *
1621     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1622     */
1623    /* if-cmp vAA, +BBBB */
1624    mov     r0, rINST, lsr #8           @ r0<- AA
1625    GET_VREG r0, r0                     @ r0<- vAA
1626    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1627    cmp     r0, #0                      @ compare (vA, 0)
1628    bge MterpCommonTakenBranchNoFlags
1629    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1630    beq     .L_check_not_taken_osr
1631    FETCH_ADVANCE_INST 2
1632    GET_INST_OPCODE ip                  @ extract opcode from rINST
1633    GOTO_OPCODE ip                      @ jump to next instruction
1634
1635
1636/* ------------------------------ */
1637    .balign 128
1638.L_op_if_gtz: /* 0x3c */
1639/* File: arm/op_if_gtz.S */
1640/* File: arm/zcmp.S */
1641    /*
1642     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1643     * fragment that specifies the comparison to perform.
1644     *
1645     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1646     */
1647    /* if-cmp vAA, +BBBB */
1648    mov     r0, rINST, lsr #8           @ r0<- AA
1649    GET_VREG r0, r0                     @ r0<- vAA
1650    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1651    cmp     r0, #0                      @ compare (vA, 0)
1652    bgt MterpCommonTakenBranchNoFlags
1653    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1654    beq     .L_check_not_taken_osr
1655    FETCH_ADVANCE_INST 2
1656    GET_INST_OPCODE ip                  @ extract opcode from rINST
1657    GOTO_OPCODE ip                      @ jump to next instruction
1658
1659
1660/* ------------------------------ */
1661    .balign 128
1662.L_op_if_lez: /* 0x3d */
1663/* File: arm/op_if_lez.S */
1664/* File: arm/zcmp.S */
1665    /*
1666     * Generic one-operand compare-and-branch operation.  Provide a "condition"
1667     * fragment that specifies the comparison to perform.
1668     *
1669     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1670     */
1671    /* if-cmp vAA, +BBBB */
1672    mov     r0, rINST, lsr #8           @ r0<- AA
1673    GET_VREG r0, r0                     @ r0<- vAA
1674    FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
1675    cmp     r0, #0                      @ compare (vA, 0)
1676    ble MterpCommonTakenBranchNoFlags
1677    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
1678    beq     .L_check_not_taken_osr
1679    FETCH_ADVANCE_INST 2
1680    GET_INST_OPCODE ip                  @ extract opcode from rINST
1681    GOTO_OPCODE ip                      @ jump to next instruction
1682
1683
1684/* ------------------------------ */
1685    .balign 128
1686.L_op_unused_3e: /* 0x3e */
1687/* File: arm/op_unused_3e.S */
1688/* File: arm/unused.S */
1689/*
1690 * Bail to reference interpreter to throw.
1691 */
1692  b MterpFallback
1693
1694
1695/* ------------------------------ */
1696    .balign 128
1697.L_op_unused_3f: /* 0x3f */
1698/* File: arm/op_unused_3f.S */
1699/* File: arm/unused.S */
1700/*
1701 * Bail to reference interpreter to throw.
1702 */
1703  b MterpFallback
1704
1705
1706/* ------------------------------ */
1707    .balign 128
1708.L_op_unused_40: /* 0x40 */
1709/* File: arm/op_unused_40.S */
1710/* File: arm/unused.S */
1711/*
1712 * Bail to reference interpreter to throw.
1713 */
1714  b MterpFallback
1715
1716
1717/* ------------------------------ */
1718    .balign 128
1719.L_op_unused_41: /* 0x41 */
1720/* File: arm/op_unused_41.S */
1721/* File: arm/unused.S */
1722/*
1723 * Bail to reference interpreter to throw.
1724 */
1725  b MterpFallback
1726
1727
1728/* ------------------------------ */
1729    .balign 128
1730.L_op_unused_42: /* 0x42 */
1731/* File: arm/op_unused_42.S */
1732/* File: arm/unused.S */
1733/*
1734 * Bail to reference interpreter to throw.
1735 */
1736  b MterpFallback
1737
1738
1739/* ------------------------------ */
1740    .balign 128
1741.L_op_unused_43: /* 0x43 */
1742/* File: arm/op_unused_43.S */
1743/* File: arm/unused.S */
1744/*
1745 * Bail to reference interpreter to throw.
1746 */
1747  b MterpFallback
1748
1749
1750/* ------------------------------ */
1751    .balign 128
1752.L_op_aget: /* 0x44 */
1753/* File: arm/op_aget.S */
1754    /*
1755     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1756     *
1757     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1758     * instructions.  We use a pair of FETCH_Bs instead.
1759     *
1760     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1761     *
1762     * NOTE: assumes data offset for arrays is the same for all non-wide types.
1763     * If this changes, specialize.
1764     */
1765    /* op vAA, vBB, vCC */
1766    FETCH_B r2, 1, 0                    @ r2<- BB
1767    mov     r9, rINST, lsr #8           @ r9<- AA
1768    FETCH_B r3, 1, 1                    @ r3<- CC
1769    GET_VREG r0, r2                     @ r0<- vBB (array object)
1770    GET_VREG r1, r3                     @ r1<- vCC (requested index)
1771    cmp     r0, #0                      @ null array object?
1772    beq     common_errNullObject        @ yes, bail
1773    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
1774    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1775    cmp     r1, r3                      @ compare unsigned index, length
1776    bcs     common_errArrayIndex        @ index >= length, bail
1777    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1778    ldr   r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET]     @ r2<- vBB[vCC]
1779    GET_INST_OPCODE ip                  @ extract opcode from rINST
1780    SET_VREG r2, r9                     @ vAA<- r2
1781    GOTO_OPCODE ip                      @ jump to next instruction
1782
1783/* ------------------------------ */
1784    .balign 128
1785.L_op_aget_wide: /* 0x45 */
1786/* File: arm/op_aget_wide.S */
1787    /*
1788     * Array get, 64 bits.  vAA <- vBB[vCC].
1789     *
1790     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
1791     */
1792    /* aget-wide vAA, vBB, vCC */
1793    FETCH r0, 1                         @ r0<- CCBB
1794    mov     r9, rINST, lsr #8           @ r9<- AA
1795    and     r2, r0, #255                @ r2<- BB
1796    mov     r3, r0, lsr #8              @ r3<- CC
1797    GET_VREG r0, r2                     @ r0<- vBB (array object)
1798    GET_VREG r1, r3                     @ r1<- vCC (requested index)
1799    CLEAR_SHADOW_PAIR r9, r2, r3        @ Zero out the shadow regs
1800    cmp     r0, #0                      @ null array object?
1801    beq     common_errNullObject        @ yes, bail
1802    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
1803    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
1804    cmp     r1, r3                      @ compare unsigned index, length
1805    bcs     common_errArrayIndex        @ index >= length, bail
1806    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1807    ldrd    r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]  @ r2/r3<- vBB[vCC]
1808    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
1809    GET_INST_OPCODE ip                  @ extract opcode from rINST
1810    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
1811    GOTO_OPCODE ip                      @ jump to next instruction
1812
1813/* ------------------------------ */
1814    .balign 128
1815.L_op_aget_object: /* 0x46 */
1816/* File: arm/op_aget_object.S */
1817    /*
1818     * Array object get.  vAA <- vBB[vCC].
1819     *
1820     * for: aget-object
1821     */
1822    /* op vAA, vBB, vCC */
1823    FETCH_B r2, 1, 0                    @ r2<- BB
1824    mov     r9, rINST, lsr #8           @ r9<- AA
1825    FETCH_B r3, 1, 1                    @ r3<- CC
1826    EXPORT_PC
1827    GET_VREG r0, r2                     @ r0<- vBB (array object)
1828    GET_VREG r1, r3                     @ r1<- vCC (requested index)
1829    bl       artAGetObjectFromMterp     @ (array, index)
1830    ldr      r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
1831    PREFETCH_INST 2
1832    cmp      r1, #0
1833    bne      MterpException
1834    SET_VREG_OBJECT r0, r9
1835    ADVANCE 2
1836    GET_INST_OPCODE ip
1837    GOTO_OPCODE ip                      @ jump to next instruction
1838
1839/* ------------------------------ */
1840    .balign 128
1841.L_op_aget_boolean: /* 0x47 */
1842/* File: arm/op_aget_boolean.S */
1843/* File: arm/op_aget.S */
1844    /*
1845     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1846     *
1847     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1848     * instructions.  We use a pair of FETCH_Bs instead.
1849     *
1850     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1851     *
1852     * NOTE: assumes data offset for arrays is the same for all non-wide types.
1853     * If this changes, specialize.
1854     */
1855    /* op vAA, vBB, vCC */
1856    FETCH_B r2, 1, 0                    @ r2<- BB
1857    mov     r9, rINST, lsr #8           @ r9<- AA
1858    FETCH_B r3, 1, 1                    @ r3<- CC
1859    GET_VREG r0, r2                     @ r0<- vBB (array object)
1860    GET_VREG r1, r3                     @ r1<- vCC (requested index)
1861    cmp     r0, #0                      @ null array object?
1862    beq     common_errNullObject        @ yes, bail
1863    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
1864    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
1865    cmp     r1, r3                      @ compare unsigned index, length
1866    bcs     common_errArrayIndex        @ index >= length, bail
1867    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1868    ldrb   r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET]     @ r2<- vBB[vCC]
1869    GET_INST_OPCODE ip                  @ extract opcode from rINST
1870    SET_VREG r2, r9                     @ vAA<- r2
1871    GOTO_OPCODE ip                      @ jump to next instruction
1872
1873
1874/* ------------------------------ */
1875    .balign 128
1876.L_op_aget_byte: /* 0x48 */
1877/* File: arm/op_aget_byte.S */
1878/* File: arm/op_aget.S */
1879    /*
1880     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1881     *
1882     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1883     * instructions.  We use a pair of FETCH_Bs instead.
1884     *
1885     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1886     *
1887     * NOTE: assumes data offset for arrays is the same for all non-wide types.
1888     * If this changes, specialize.
1889     */
1890    /* op vAA, vBB, vCC */
1891    FETCH_B r2, 1, 0                    @ r2<- BB
1892    mov     r9, rINST, lsr #8           @ r9<- AA
1893    FETCH_B r3, 1, 1                    @ r3<- CC
1894    GET_VREG r0, r2                     @ r0<- vBB (array object)
1895    GET_VREG r1, r3                     @ r1<- vCC (requested index)
1896    cmp     r0, #0                      @ null array object?
1897    beq     common_errNullObject        @ yes, bail
1898    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
1899    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
1900    cmp     r1, r3                      @ compare unsigned index, length
1901    bcs     common_errArrayIndex        @ index >= length, bail
1902    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1903    ldrsb   r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET]     @ r2<- vBB[vCC]
1904    GET_INST_OPCODE ip                  @ extract opcode from rINST
1905    SET_VREG r2, r9                     @ vAA<- r2
1906    GOTO_OPCODE ip                      @ jump to next instruction
1907
1908
1909/* ------------------------------ */
1910    .balign 128
1911.L_op_aget_char: /* 0x49 */
1912/* File: arm/op_aget_char.S */
1913/* File: arm/op_aget.S */
1914    /*
1915     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1916     *
1917     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1918     * instructions.  We use a pair of FETCH_Bs instead.
1919     *
1920     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1921     *
1922     * NOTE: assumes data offset for arrays is the same for all non-wide types.
1923     * If this changes, specialize.
1924     */
1925    /* op vAA, vBB, vCC */
1926    FETCH_B r2, 1, 0                    @ r2<- BB
1927    mov     r9, rINST, lsr #8           @ r9<- AA
1928    FETCH_B r3, 1, 1                    @ r3<- CC
1929    GET_VREG r0, r2                     @ r0<- vBB (array object)
1930    GET_VREG r1, r3                     @ r1<- vCC (requested index)
1931    cmp     r0, #0                      @ null array object?
1932    beq     common_errNullObject        @ yes, bail
1933    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
1934    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
1935    cmp     r1, r3                      @ compare unsigned index, length
1936    bcs     common_errArrayIndex        @ index >= length, bail
1937    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1938    ldrh   r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET]     @ r2<- vBB[vCC]
1939    GET_INST_OPCODE ip                  @ extract opcode from rINST
1940    SET_VREG r2, r9                     @ vAA<- r2
1941    GOTO_OPCODE ip                      @ jump to next instruction
1942
1943
1944/* ------------------------------ */
1945    .balign 128
1946.L_op_aget_short: /* 0x4a */
1947/* File: arm/op_aget_short.S */
1948/* File: arm/op_aget.S */
1949    /*
1950     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1951     *
1952     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1953     * instructions.  We use a pair of FETCH_Bs instead.
1954     *
1955     * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1956     *
1957     * NOTE: assumes data offset for arrays is the same for all non-wide types.
1958     * If this changes, specialize.
1959     */
1960    /* op vAA, vBB, vCC */
1961    FETCH_B r2, 1, 0                    @ r2<- BB
1962    mov     r9, rINST, lsr #8           @ r9<- AA
1963    FETCH_B r3, 1, 1                    @ r3<- CC
1964    GET_VREG r0, r2                     @ r0<- vBB (array object)
1965    GET_VREG r1, r3                     @ r1<- vCC (requested index)
1966    cmp     r0, #0                      @ null array object?
1967    beq     common_errNullObject        @ yes, bail
1968    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
1969    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
1970    cmp     r1, r3                      @ compare unsigned index, length
1971    bcs     common_errArrayIndex        @ index >= length, bail
1972    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
1973    ldrsh   r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET]     @ r2<- vBB[vCC]
1974    GET_INST_OPCODE ip                  @ extract opcode from rINST
1975    SET_VREG r2, r9                     @ vAA<- r2
1976    GOTO_OPCODE ip                      @ jump to next instruction
1977
1978
1979/* ------------------------------ */
1980    .balign 128
1981.L_op_aput: /* 0x4b */
1982/* File: arm/op_aput.S */
1983    /*
1984     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
1985     *
1986     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1987     * instructions.  We use a pair of FETCH_Bs instead.
1988     *
1989     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1990     *
1991     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1992     * If this changes, specialize.
1993     */
1994    /* op vAA, vBB, vCC */
1995    FETCH_B r2, 1, 0                    @ r2<- BB
1996    mov     r9, rINST, lsr #8           @ r9<- AA
1997    FETCH_B r3, 1, 1                    @ r3<- CC
1998    GET_VREG r0, r2                     @ r0<- vBB (array object)
1999    GET_VREG r1, r3                     @ r1<- vCC (requested index)
2000    cmp     r0, #0                      @ null array object?
2001    beq     common_errNullObject        @ yes, bail
2002    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]     @ r3<- arrayObj->length
2003    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2004    cmp     r1, r3                      @ compare unsigned index, length
2005    bcs     common_errArrayIndex        @ index >= length, bail
2006    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
2007    GET_VREG r2, r9                     @ r2<- vAA
2008    GET_INST_OPCODE ip                  @ extract opcode from rINST
2009    str  r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET]     @ vBB[vCC]<- r2
2010    GOTO_OPCODE ip                      @ jump to next instruction
2011
2012/* ------------------------------ */
2013    .balign 128
2014.L_op_aput_wide: /* 0x4c */
2015/* File: arm/op_aput_wide.S */
2016    /*
2017     * Array put, 64 bits.  vBB[vCC] <- vAA.
2018     *
2019     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2020     */
2021    /* aput-wide vAA, vBB, vCC */
2022    FETCH r0, 1                         @ r0<- CCBB
2023    mov     r9, rINST, lsr #8           @ r9<- AA
2024    and     r2, r0, #255                @ r2<- BB
2025    mov     r3, r0, lsr #8              @ r3<- CC
2026    GET_VREG r0, r2                     @ r0<- vBB (array object)
2027    GET_VREG r1, r3                     @ r1<- vCC (requested index)
2028    cmp     r0, #0                      @ null array object?
2029    beq     common_errNullObject        @ yes, bail
2030    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
2031    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2032    cmp     r1, r3                      @ compare unsigned index, length
2033    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
2034    bcs     common_errArrayIndex        @ index >= length, bail
2035    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
2036    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
2037    GET_INST_OPCODE ip                  @ extract opcode from rINST
2038    strd    r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]  @ r2/r3<- vBB[vCC]
2039    GOTO_OPCODE ip                      @ jump to next instruction
2040
2041/* ------------------------------ */
2042    .balign 128
2043.L_op_aput_object: /* 0x4d */
2044/* File: arm/op_aput_object.S */
2045    /*
2046     * Store an object into an array.  vBB[vCC] <- vAA.
2047     */
2048    /* op vAA, vBB, vCC */
2049    EXPORT_PC
2050    add     r0, rFP, #OFF_FP_SHADOWFRAME
2051    mov     r1, rPC
2052    mov     r2, rINST
2053    bl      MterpAputObject
2054    cmp     r0, #0
2055    beq     MterpPossibleException
2056    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
2057    GET_INST_OPCODE ip                  @ extract opcode from rINST
2058    GOTO_OPCODE ip                      @ jump to next instruction
2059
2060/* ------------------------------ */
2061    .balign 128
2062.L_op_aput_boolean: /* 0x4e */
2063/* File: arm/op_aput_boolean.S */
2064/* File: arm/op_aput.S */
2065    /*
2066     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2067     *
2068     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2069     * instructions.  We use a pair of FETCH_Bs instead.
2070     *
2071     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2072     *
2073     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2074     * If this changes, specialize.
2075     */
2076    /* op vAA, vBB, vCC */
2077    FETCH_B r2, 1, 0                    @ r2<- BB
2078    mov     r9, rINST, lsr #8           @ r9<- AA
2079    FETCH_B r3, 1, 1                    @ r3<- CC
2080    GET_VREG r0, r2                     @ r0<- vBB (array object)
2081    GET_VREG r1, r3                     @ r1<- vCC (requested index)
2082    cmp     r0, #0                      @ null array object?
2083    beq     common_errNullObject        @ yes, bail
2084    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]     @ r3<- arrayObj->length
2085    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2086    cmp     r1, r3                      @ compare unsigned index, length
2087    bcs     common_errArrayIndex        @ index >= length, bail
2088    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
2089    GET_VREG r2, r9                     @ r2<- vAA
2090    GET_INST_OPCODE ip                  @ extract opcode from rINST
2091    strb  r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET]     @ vBB[vCC]<- r2
2092    GOTO_OPCODE ip                      @ jump to next instruction
2093
2094
2095/* ------------------------------ */
2096    .balign 128
2097.L_op_aput_byte: /* 0x4f */
2098/* File: arm/op_aput_byte.S */
2099/* File: arm/op_aput.S */
2100    /*
2101     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2102     *
2103     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2104     * instructions.  We use a pair of FETCH_Bs instead.
2105     *
2106     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2107     *
2108     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2109     * If this changes, specialize.
2110     */
2111    /* op vAA, vBB, vCC */
2112    FETCH_B r2, 1, 0                    @ r2<- BB
2113    mov     r9, rINST, lsr #8           @ r9<- AA
2114    FETCH_B r3, 1, 1                    @ r3<- CC
2115    GET_VREG r0, r2                     @ r0<- vBB (array object)
2116    GET_VREG r1, r3                     @ r1<- vCC (requested index)
2117    cmp     r0, #0                      @ null array object?
2118    beq     common_errNullObject        @ yes, bail
2119    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]     @ r3<- arrayObj->length
2120    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2121    cmp     r1, r3                      @ compare unsigned index, length
2122    bcs     common_errArrayIndex        @ index >= length, bail
2123    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
2124    GET_VREG r2, r9                     @ r2<- vAA
2125    GET_INST_OPCODE ip                  @ extract opcode from rINST
2126    strb  r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET]     @ vBB[vCC]<- r2
2127    GOTO_OPCODE ip                      @ jump to next instruction
2128
2129
2130/* ------------------------------ */
2131    .balign 128
2132.L_op_aput_char: /* 0x50 */
2133/* File: arm/op_aput_char.S */
2134/* File: arm/op_aput.S */
2135    /*
2136     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2137     *
2138     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2139     * instructions.  We use a pair of FETCH_Bs instead.
2140     *
2141     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2142     *
2143     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2144     * If this changes, specialize.
2145     */
2146    /* op vAA, vBB, vCC */
2147    FETCH_B r2, 1, 0                    @ r2<- BB
2148    mov     r9, rINST, lsr #8           @ r9<- AA
2149    FETCH_B r3, 1, 1                    @ r3<- CC
2150    GET_VREG r0, r2                     @ r0<- vBB (array object)
2151    GET_VREG r1, r3                     @ r1<- vCC (requested index)
2152    cmp     r0, #0                      @ null array object?
2153    beq     common_errNullObject        @ yes, bail
2154    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]     @ r3<- arrayObj->length
2155    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2156    cmp     r1, r3                      @ compare unsigned index, length
2157    bcs     common_errArrayIndex        @ index >= length, bail
2158    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
2159    GET_VREG r2, r9                     @ r2<- vAA
2160    GET_INST_OPCODE ip                  @ extract opcode from rINST
2161    strh  r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET]     @ vBB[vCC]<- r2
2162    GOTO_OPCODE ip                      @ jump to next instruction
2163
2164
2165/* ------------------------------ */
2166    .balign 128
2167.L_op_aput_short: /* 0x51 */
2168/* File: arm/op_aput_short.S */
2169/* File: arm/op_aput.S */
2170    /*
2171     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2172     *
2173     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2174     * instructions.  We use a pair of FETCH_Bs instead.
2175     *
2176     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2177     *
2178     * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2179     * If this changes, specialize.
2180     */
2181    /* op vAA, vBB, vCC */
2182    FETCH_B r2, 1, 0                    @ r2<- BB
2183    mov     r9, rINST, lsr #8           @ r9<- AA
2184    FETCH_B r3, 1, 1                    @ r3<- CC
2185    GET_VREG r0, r2                     @ r0<- vBB (array object)
2186    GET_VREG r1, r3                     @ r1<- vCC (requested index)
2187    cmp     r0, #0                      @ null array object?
2188    beq     common_errNullObject        @ yes, bail
2189    ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]     @ r3<- arrayObj->length
2190    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2191    cmp     r1, r3                      @ compare unsigned index, length
2192    bcs     common_errArrayIndex        @ index >= length, bail
2193    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
2194    GET_VREG r2, r9                     @ r2<- vAA
2195    GET_INST_OPCODE ip                  @ extract opcode from rINST
2196    strh  r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET]     @ vBB[vCC]<- r2
2197    GOTO_OPCODE ip                      @ jump to next instruction
2198
2199
2200/* ------------------------------ */
2201    .balign 128
2202.L_op_iget: /* 0x52 */
2203/* File: arm/op_iget.S */
2204    /*
2205     * General instance field get.
2206     *
2207     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2208     */
2209    EXPORT_PC
2210    FETCH    r0, 1                         @ r0<- field ref CCCC
2211    mov      r1, rINST, lsr #12            @ r1<- B
2212    GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
2213    ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
2214    mov      r3, rSELF                     @ r3<- self
2215    bl       artGet32InstanceFromCode
2216    ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2217    ubfx     r2, rINST, #8, #4             @ r2<- A
2218    PREFETCH_INST 2
2219    cmp      r3, #0
2220    bne      MterpPossibleException        @ bail out
2221    .if 0
2222    SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
2223    .else
2224    SET_VREG r0, r2                        @ fp[A]<- r0
2225    .endif
2226    ADVANCE 2
2227    GET_INST_OPCODE ip                     @ extract opcode from rINST
2228    GOTO_OPCODE ip                         @ jump to next instruction
2229
2230/* ------------------------------ */
2231    .balign 128
2232.L_op_iget_wide: /* 0x53 */
2233/* File: arm/op_iget_wide.S */
2234    /*
2235     * 64-bit instance field get.
2236     *
2237     * for: iget-wide
2238     */
2239    EXPORT_PC
2240    FETCH    r0, 1                         @ r0<- field ref CCCC
2241    mov      r1, rINST, lsr #12            @ r1<- B
2242    GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
2243    ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
2244    mov      r3, rSELF                     @ r3<- self
2245    bl       artGet64InstanceFromCode
2246    ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2247    ubfx     r2, rINST, #8, #4             @ r2<- A
2248    PREFETCH_INST 2
2249    cmp      r3, #0
2250    bne      MterpException                @ bail out
2251    CLEAR_SHADOW_PAIR r2, ip, lr           @ Zero out the shadow regs
2252    VREG_INDEX_TO_ADDR r3, r2              @ r3<- &fp[A]
2253    stmia    r3, {r0-r1}                   @ fp[A]<- r0/r1
2254    ADVANCE 2
2255    GET_INST_OPCODE ip                     @ extract opcode from rINST
2256    GOTO_OPCODE ip                         @ jump to next instruction
2257
2258/* ------------------------------ */
2259    .balign 128
2260.L_op_iget_object: /* 0x54 */
2261/* File: arm/op_iget_object.S */
2262/* File: arm/op_iget.S */
2263    /*
2264     * General instance field get.
2265     *
2266     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2267     */
2268    EXPORT_PC
2269    FETCH    r0, 1                         @ r0<- field ref CCCC
2270    mov      r1, rINST, lsr #12            @ r1<- B
2271    GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
2272    ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
2273    mov      r3, rSELF                     @ r3<- self
2274    bl       artGetObjInstanceFromCode
2275    ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2276    ubfx     r2, rINST, #8, #4             @ r2<- A
2277    PREFETCH_INST 2
2278    cmp      r3, #0
2279    bne      MterpPossibleException        @ bail out
2280    .if 1
2281    SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
2282    .else
2283    SET_VREG r0, r2                        @ fp[A]<- r0
2284    .endif
2285    ADVANCE 2
2286    GET_INST_OPCODE ip                     @ extract opcode from rINST
2287    GOTO_OPCODE ip                         @ jump to next instruction
2288
2289
2290/* ------------------------------ */
2291    .balign 128
2292.L_op_iget_boolean: /* 0x55 */
2293/* File: arm/op_iget_boolean.S */
2294/* File: arm/op_iget.S */
2295    /*
2296     * General instance field get.
2297     *
2298     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2299     */
2300    EXPORT_PC
2301    FETCH    r0, 1                         @ r0<- field ref CCCC
2302    mov      r1, rINST, lsr #12            @ r1<- B
2303    GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
2304    ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
2305    mov      r3, rSELF                     @ r3<- self
2306    bl       artGetBooleanInstanceFromCode
2307    ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2308    ubfx     r2, rINST, #8, #4             @ r2<- A
2309    PREFETCH_INST 2
2310    cmp      r3, #0
2311    bne      MterpPossibleException        @ bail out
2312    .if 0
2313    SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
2314    .else
2315    SET_VREG r0, r2                        @ fp[A]<- r0
2316    .endif
2317    ADVANCE 2
2318    GET_INST_OPCODE ip                     @ extract opcode from rINST
2319    GOTO_OPCODE ip                         @ jump to next instruction
2320
2321
2322/* ------------------------------ */
2323    .balign 128
2324.L_op_iget_byte: /* 0x56 */
2325/* File: arm/op_iget_byte.S */
2326/* File: arm/op_iget.S */
2327    /*
2328     * General instance field get.
2329     *
2330     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2331     */
2332    EXPORT_PC
2333    FETCH    r0, 1                         @ r0<- field ref CCCC
2334    mov      r1, rINST, lsr #12            @ r1<- B
2335    GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
2336    ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
2337    mov      r3, rSELF                     @ r3<- self
2338    bl       artGetByteInstanceFromCode
2339    ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2340    ubfx     r2, rINST, #8, #4             @ r2<- A
2341    PREFETCH_INST 2
2342    cmp      r3, #0
2343    bne      MterpPossibleException        @ bail out
2344    .if 0
2345    SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
2346    .else
2347    SET_VREG r0, r2                        @ fp[A]<- r0
2348    .endif
2349    ADVANCE 2
2350    GET_INST_OPCODE ip                     @ extract opcode from rINST
2351    GOTO_OPCODE ip                         @ jump to next instruction
2352
2353
2354/* ------------------------------ */
2355    .balign 128
2356.L_op_iget_char: /* 0x57 */
2357/* File: arm/op_iget_char.S */
2358/* File: arm/op_iget.S */
2359    /*
2360     * General instance field get.
2361     *
2362     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2363     */
2364    EXPORT_PC
2365    FETCH    r0, 1                         @ r0<- field ref CCCC
2366    mov      r1, rINST, lsr #12            @ r1<- B
2367    GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
2368    ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
2369    mov      r3, rSELF                     @ r3<- self
2370    bl       artGetCharInstanceFromCode
2371    ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2372    ubfx     r2, rINST, #8, #4             @ r2<- A
2373    PREFETCH_INST 2
2374    cmp      r3, #0
2375    bne      MterpPossibleException        @ bail out
2376    .if 0
2377    SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
2378    .else
2379    SET_VREG r0, r2                        @ fp[A]<- r0
2380    .endif
2381    ADVANCE 2
2382    GET_INST_OPCODE ip                     @ extract opcode from rINST
2383    GOTO_OPCODE ip                         @ jump to next instruction
2384
2385
2386/* ------------------------------ */
2387    .balign 128
2388.L_op_iget_short: /* 0x58 */
2389/* File: arm/op_iget_short.S */
2390/* File: arm/op_iget.S */
2391    /*
2392     * General instance field get.
2393     *
2394     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2395     */
2396    EXPORT_PC
2397    FETCH    r0, 1                         @ r0<- field ref CCCC
2398    mov      r1, rINST, lsr #12            @ r1<- B
2399    GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
2400    ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
2401    mov      r3, rSELF                     @ r3<- self
2402    bl       artGetShortInstanceFromCode
2403    ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2404    ubfx     r2, rINST, #8, #4             @ r2<- A
2405    PREFETCH_INST 2
2406    cmp      r3, #0
2407    bne      MterpPossibleException        @ bail out
2408    .if 0
2409    SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
2410    .else
2411    SET_VREG r0, r2                        @ fp[A]<- r0
2412    .endif
2413    ADVANCE 2
2414    GET_INST_OPCODE ip                     @ extract opcode from rINST
2415    GOTO_OPCODE ip                         @ jump to next instruction
2416
2417
2418/* ------------------------------ */
2419    .balign 128
2420.L_op_iput: /* 0x59 */
2421/* File: arm/op_iput.S */
2422    /*
2423     * General 32-bit instance field put.
2424     *
2425     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2426     */
2427    /* op vA, vB, field@CCCC */
2428    .extern artSet32InstanceFromMterp
2429    EXPORT_PC
2430    FETCH    r0, 1                      @ r0<- field ref CCCC
2431    mov      r1, rINST, lsr #12         @ r1<- B
2432    GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
2433    ubfx     r2, rINST, #8, #4          @ r2<- A
2434    GET_VREG r2, r2                     @ r2<- fp[A]
2435    ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
2436    PREFETCH_INST 2
2437    bl       artSet32InstanceFromMterp
2438    cmp      r0, #0
2439    bne      MterpPossibleException
2440    ADVANCE  2                          @ advance rPC
2441    GET_INST_OPCODE ip                  @ extract opcode from rINST
2442    GOTO_OPCODE ip                      @ jump to next instruction
2443
2444/* ------------------------------ */
2445    .balign 128
2446.L_op_iput_wide: /* 0x5a */
2447/* File: arm/op_iput_wide.S */
2448    /* iput-wide vA, vB, field@CCCC */
2449    .extern artSet64InstanceFromMterp
2450    EXPORT_PC
2451    FETCH    r0, 1                      @ r0<- field ref CCCC
2452    mov      r1, rINST, lsr #12         @ r1<- B
2453    GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
2454    ubfx     r2, rINST, #8, #4          @ r2<- A
2455    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[A]
2456    ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
2457    PREFETCH_INST 2
2458    bl       artSet64InstanceFromMterp
2459    cmp      r0, #0
2460    bne      MterpPossibleException
2461    ADVANCE  2                          @ advance rPC
2462    GET_INST_OPCODE ip                  @ extract opcode from rINST
2463    GOTO_OPCODE ip                      @ jump to next instruction
2464
2465/* ------------------------------ */
2466    .balign 128
2467.L_op_iput_object: /* 0x5b */
2468/* File: arm/op_iput_object.S */
2469    EXPORT_PC
2470    add     r0, rFP, #OFF_FP_SHADOWFRAME
2471    mov     r1, rPC
2472    mov     r2, rINST
2473    mov     r3, rSELF
2474    bl      MterpIputObject
2475    cmp     r0, #0
2476    beq     MterpException
2477    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
2478    GET_INST_OPCODE ip                  @ extract opcode from rINST
2479    GOTO_OPCODE ip                      @ jump to next instruction
2480
2481/* ------------------------------ */
2482    .balign 128
2483.L_op_iput_boolean: /* 0x5c */
2484/* File: arm/op_iput_boolean.S */
2485/* File: arm/op_iput.S */
2486    /*
2487     * General 32-bit instance field put.
2488     *
2489     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2490     */
2491    /* op vA, vB, field@CCCC */
2492    .extern artSet8InstanceFromMterp
2493    EXPORT_PC
2494    FETCH    r0, 1                      @ r0<- field ref CCCC
2495    mov      r1, rINST, lsr #12         @ r1<- B
2496    GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
2497    ubfx     r2, rINST, #8, #4          @ r2<- A
2498    GET_VREG r2, r2                     @ r2<- fp[A]
2499    ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
2500    PREFETCH_INST 2
2501    bl       artSet8InstanceFromMterp
2502    cmp      r0, #0
2503    bne      MterpPossibleException
2504    ADVANCE  2                          @ advance rPC
2505    GET_INST_OPCODE ip                  @ extract opcode from rINST
2506    GOTO_OPCODE ip                      @ jump to next instruction
2507
2508
2509/* ------------------------------ */
2510    .balign 128
2511.L_op_iput_byte: /* 0x5d */
2512/* File: arm/op_iput_byte.S */
2513/* File: arm/op_iput.S */
2514    /*
2515     * General 32-bit instance field put.
2516     *
2517     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2518     */
2519    /* op vA, vB, field@CCCC */
2520    .extern artSet8InstanceFromMterp
2521    EXPORT_PC
2522    FETCH    r0, 1                      @ r0<- field ref CCCC
2523    mov      r1, rINST, lsr #12         @ r1<- B
2524    GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
2525    ubfx     r2, rINST, #8, #4          @ r2<- A
2526    GET_VREG r2, r2                     @ r2<- fp[A]
2527    ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
2528    PREFETCH_INST 2
2529    bl       artSet8InstanceFromMterp
2530    cmp      r0, #0
2531    bne      MterpPossibleException
2532    ADVANCE  2                          @ advance rPC
2533    GET_INST_OPCODE ip                  @ extract opcode from rINST
2534    GOTO_OPCODE ip                      @ jump to next instruction
2535
2536
2537/* ------------------------------ */
2538    .balign 128
2539.L_op_iput_char: /* 0x5e */
2540/* File: arm/op_iput_char.S */
2541/* File: arm/op_iput.S */
2542    /*
2543     * General 32-bit instance field put.
2544     *
2545     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2546     */
2547    /* op vA, vB, field@CCCC */
2548    .extern artSet16InstanceFromMterp
2549    EXPORT_PC
2550    FETCH    r0, 1                      @ r0<- field ref CCCC
2551    mov      r1, rINST, lsr #12         @ r1<- B
2552    GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
2553    ubfx     r2, rINST, #8, #4          @ r2<- A
2554    GET_VREG r2, r2                     @ r2<- fp[A]
2555    ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
2556    PREFETCH_INST 2
2557    bl       artSet16InstanceFromMterp
2558    cmp      r0, #0
2559    bne      MterpPossibleException
2560    ADVANCE  2                          @ advance rPC
2561    GET_INST_OPCODE ip                  @ extract opcode from rINST
2562    GOTO_OPCODE ip                      @ jump to next instruction
2563
2564
2565/* ------------------------------ */
2566    .balign 128
2567.L_op_iput_short: /* 0x5f */
2568/* File: arm/op_iput_short.S */
2569/* File: arm/op_iput.S */
2570    /*
2571     * General 32-bit instance field put.
2572     *
2573     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2574     */
2575    /* op vA, vB, field@CCCC */
2576    .extern artSet16InstanceFromMterp
2577    EXPORT_PC
2578    FETCH    r0, 1                      @ r0<- field ref CCCC
2579    mov      r1, rINST, lsr #12         @ r1<- B
2580    GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
2581    ubfx     r2, rINST, #8, #4          @ r2<- A
2582    GET_VREG r2, r2                     @ r2<- fp[A]
2583    ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
2584    PREFETCH_INST 2
2585    bl       artSet16InstanceFromMterp
2586    cmp      r0, #0
2587    bne      MterpPossibleException
2588    ADVANCE  2                          @ advance rPC
2589    GET_INST_OPCODE ip                  @ extract opcode from rINST
2590    GOTO_OPCODE ip                      @ jump to next instruction
2591
2592
2593/* ------------------------------ */
2594    .balign 128
2595.L_op_sget: /* 0x60 */
2596/* File: arm/op_sget.S */
2597    /*
2598     * General SGET handler wrapper.
2599     *
2600     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2601     */
2602    /* op vAA, field@BBBB */
2603
2604    .extern artGet32StaticFromCode
2605    EXPORT_PC
2606    FETCH r0, 1                         @ r0<- field ref BBBB
2607    ldr   r1, [rFP, #OFF_FP_METHOD]
2608    mov   r2, rSELF
2609    bl    artGet32StaticFromCode
2610    ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2611    mov   r2, rINST, lsr #8             @ r2<- AA
2612    PREFETCH_INST 2
2613    cmp   r3, #0                        @ Fail to resolve?
2614    bne   MterpException                @ bail out
2615.if 0
2616    SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
2617.else
2618    SET_VREG r0, r2                     @ fp[AA]<- r0
2619.endif
2620    ADVANCE 2
2621    GET_INST_OPCODE ip                  @ extract opcode from rINST
2622    GOTO_OPCODE ip
2623
2624/* ------------------------------ */
2625    .balign 128
2626.L_op_sget_wide: /* 0x61 */
2627/* File: arm/op_sget_wide.S */
2628    /*
2629     * SGET_WIDE handler wrapper.
2630     *
2631     */
2632    /* sget-wide vAA, field@BBBB */
2633
2634    .extern artGet64StaticFromCode
2635    EXPORT_PC
2636    FETCH r0, 1                         @ r0<- field ref BBBB
2637    ldr   r1, [rFP, #OFF_FP_METHOD]
2638    mov   r2, rSELF
2639    bl    artGet64StaticFromCode
2640    ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2641    mov   r9, rINST, lsr #8             @ r9<- AA
2642    VREG_INDEX_TO_ADDR lr, r9           @ r9<- &fp[AA]
2643    cmp   r3, #0                        @ Fail to resolve?
2644    bne   MterpException                @ bail out
2645    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
2646    CLEAR_SHADOW_PAIR r9, r2, ip        @ Zero out the shadow regs
2647    stmia lr, {r0-r1}                   @ vAA/vAA+1<- r0/r1
2648    GET_INST_OPCODE ip                  @ extract opcode from rINST
2649    GOTO_OPCODE ip                      @ jump to next instruction
2650
2651/* ------------------------------ */
2652    .balign 128
2653.L_op_sget_object: /* 0x62 */
2654/* File: arm/op_sget_object.S */
2655/* File: arm/op_sget.S */
2656    /*
2657     * General SGET handler wrapper.
2658     *
2659     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2660     */
2661    /* op vAA, field@BBBB */
2662
2663    .extern artGetObjStaticFromCode
2664    EXPORT_PC
2665    FETCH r0, 1                         @ r0<- field ref BBBB
2666    ldr   r1, [rFP, #OFF_FP_METHOD]
2667    mov   r2, rSELF
2668    bl    artGetObjStaticFromCode
2669    ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2670    mov   r2, rINST, lsr #8             @ r2<- AA
2671    PREFETCH_INST 2
2672    cmp   r3, #0                        @ Fail to resolve?
2673    bne   MterpException                @ bail out
2674.if 1
2675    SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
2676.else
2677    SET_VREG r0, r2                     @ fp[AA]<- r0
2678.endif
2679    ADVANCE 2
2680    GET_INST_OPCODE ip                  @ extract opcode from rINST
2681    GOTO_OPCODE ip
2682
2683
2684/* ------------------------------ */
2685    .balign 128
2686.L_op_sget_boolean: /* 0x63 */
2687/* File: arm/op_sget_boolean.S */
2688/* File: arm/op_sget.S */
2689    /*
2690     * General SGET handler wrapper.
2691     *
2692     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2693     */
2694    /* op vAA, field@BBBB */
2695
2696    .extern artGetBooleanStaticFromCode
2697    EXPORT_PC
2698    FETCH r0, 1                         @ r0<- field ref BBBB
2699    ldr   r1, [rFP, #OFF_FP_METHOD]
2700    mov   r2, rSELF
2701    bl    artGetBooleanStaticFromCode
2702    ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2703    mov   r2, rINST, lsr #8             @ r2<- AA
2704    PREFETCH_INST 2
2705    cmp   r3, #0                        @ Fail to resolve?
2706    bne   MterpException                @ bail out
2707.if 0
2708    SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
2709.else
2710    SET_VREG r0, r2                     @ fp[AA]<- r0
2711.endif
2712    ADVANCE 2
2713    GET_INST_OPCODE ip                  @ extract opcode from rINST
2714    GOTO_OPCODE ip
2715
2716
2717/* ------------------------------ */
2718    .balign 128
2719.L_op_sget_byte: /* 0x64 */
2720/* File: arm/op_sget_byte.S */
2721/* File: arm/op_sget.S */
2722    /*
2723     * General SGET handler wrapper.
2724     *
2725     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2726     */
2727    /* op vAA, field@BBBB */
2728
2729    .extern artGetByteStaticFromCode
2730    EXPORT_PC
2731    FETCH r0, 1                         @ r0<- field ref BBBB
2732    ldr   r1, [rFP, #OFF_FP_METHOD]
2733    mov   r2, rSELF
2734    bl    artGetByteStaticFromCode
2735    ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2736    mov   r2, rINST, lsr #8             @ r2<- AA
2737    PREFETCH_INST 2
2738    cmp   r3, #0                        @ Fail to resolve?
2739    bne   MterpException                @ bail out
2740.if 0
2741    SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
2742.else
2743    SET_VREG r0, r2                     @ fp[AA]<- r0
2744.endif
2745    ADVANCE 2
2746    GET_INST_OPCODE ip                  @ extract opcode from rINST
2747    GOTO_OPCODE ip
2748
2749
2750/* ------------------------------ */
2751    .balign 128
2752.L_op_sget_char: /* 0x65 */
2753/* File: arm/op_sget_char.S */
2754/* File: arm/op_sget.S */
2755    /*
2756     * General SGET handler wrapper.
2757     *
2758     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2759     */
2760    /* op vAA, field@BBBB */
2761
2762    .extern artGetCharStaticFromCode
2763    EXPORT_PC
2764    FETCH r0, 1                         @ r0<- field ref BBBB
2765    ldr   r1, [rFP, #OFF_FP_METHOD]
2766    mov   r2, rSELF
2767    bl    artGetCharStaticFromCode
2768    ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2769    mov   r2, rINST, lsr #8             @ r2<- AA
2770    PREFETCH_INST 2
2771    cmp   r3, #0                        @ Fail to resolve?
2772    bne   MterpException                @ bail out
2773.if 0
2774    SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
2775.else
2776    SET_VREG r0, r2                     @ fp[AA]<- r0
2777.endif
2778    ADVANCE 2
2779    GET_INST_OPCODE ip                  @ extract opcode from rINST
2780    GOTO_OPCODE ip
2781
2782
2783/* ------------------------------ */
2784    .balign 128
2785.L_op_sget_short: /* 0x66 */
2786/* File: arm/op_sget_short.S */
2787/* File: arm/op_sget.S */
2788    /*
2789     * General SGET handler wrapper.
2790     *
2791     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2792     */
2793    /* op vAA, field@BBBB */
2794
2795    .extern artGetShortStaticFromCode
2796    EXPORT_PC
2797    FETCH r0, 1                         @ r0<- field ref BBBB
2798    ldr   r1, [rFP, #OFF_FP_METHOD]
2799    mov   r2, rSELF
2800    bl    artGetShortStaticFromCode
2801    ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2802    mov   r2, rINST, lsr #8             @ r2<- AA
2803    PREFETCH_INST 2
2804    cmp   r3, #0                        @ Fail to resolve?
2805    bne   MterpException                @ bail out
2806.if 0
2807    SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
2808.else
2809    SET_VREG r0, r2                     @ fp[AA]<- r0
2810.endif
2811    ADVANCE 2
2812    GET_INST_OPCODE ip                  @ extract opcode from rINST
2813    GOTO_OPCODE ip
2814
2815
2816/* ------------------------------ */
2817    .balign 128
2818.L_op_sput: /* 0x67 */
2819/* File: arm/op_sput.S */
2820    /*
2821     * General SPUT handler wrapper.
2822     *
2823     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2824     */
2825    /* op vAA, field@BBBB */
2826    EXPORT_PC
2827    FETCH   r0, 1                       @ r0<- field ref BBBB
2828    mov     r3, rINST, lsr #8           @ r3<- AA
2829    GET_VREG r1, r3                     @ r1<= fp[AA]
2830    ldr     r2, [rFP, #OFF_FP_METHOD]
2831    mov     r3, rSELF
2832    PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
2833    bl      artSet32StaticFromCode
2834    cmp     r0, #0                      @ 0 on success, -1 on failure
2835    bne     MterpException
2836    ADVANCE 2                           @ Past exception point - now advance rPC
2837    GET_INST_OPCODE ip                  @ extract opcode from rINST
2838    GOTO_OPCODE ip                      @ jump to next instruction
2839
2840/* ------------------------------ */
2841    .balign 128
2842.L_op_sput_wide: /* 0x68 */
2843/* File: arm/op_sput_wide.S */
2844    /*
2845     * SPUT_WIDE handler wrapper.
2846     *
2847     */
2848    /* sput-wide vAA, field@BBBB */
2849    .extern artSet64IndirectStaticFromMterp
2850    EXPORT_PC
2851    FETCH   r0, 1                       @ r0<- field ref BBBB
2852    ldr     r1, [rFP, #OFF_FP_METHOD]
2853    mov     r2, rINST, lsr #8           @ r3<- AA
2854    VREG_INDEX_TO_ADDR r2, r2
2855    mov     r3, rSELF
2856    PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
2857    bl      artSet64IndirectStaticFromMterp
2858    cmp     r0, #0                      @ 0 on success, -1 on failure
2859    bne     MterpException
2860    ADVANCE 2                           @ Past exception point - now advance rPC
2861    GET_INST_OPCODE ip                  @ extract opcode from rINST
2862    GOTO_OPCODE ip                      @ jump to next instruction
2863
2864/* ------------------------------ */
2865    .balign 128
2866.L_op_sput_object: /* 0x69 */
2867/* File: arm/op_sput_object.S */
2868    EXPORT_PC
2869    add     r0, rFP, #OFF_FP_SHADOWFRAME
2870    mov     r1, rPC
2871    mov     r2, rINST
2872    mov     r3, rSELF
2873    bl      MterpSputObject
2874    cmp     r0, #0
2875    beq     MterpException
2876    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
2877    GET_INST_OPCODE ip                  @ extract opcode from rINST
2878    GOTO_OPCODE ip                      @ jump to next instruction
2879
2880/* ------------------------------ */
2881    .balign 128
2882.L_op_sput_boolean: /* 0x6a */
2883/* File: arm/op_sput_boolean.S */
2884/* File: arm/op_sput.S */
2885    /*
2886     * General SPUT handler wrapper.
2887     *
2888     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2889     */
2890    /* op vAA, field@BBBB */
2891    EXPORT_PC
2892    FETCH   r0, 1                       @ r0<- field ref BBBB
2893    mov     r3, rINST, lsr #8           @ r3<- AA
2894    GET_VREG r1, r3                     @ r1<= fp[AA]
2895    ldr     r2, [rFP, #OFF_FP_METHOD]
2896    mov     r3, rSELF
2897    PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
2898    bl      artSet8StaticFromCode
2899    cmp     r0, #0                      @ 0 on success, -1 on failure
2900    bne     MterpException
2901    ADVANCE 2                           @ Past exception point - now advance rPC
2902    GET_INST_OPCODE ip                  @ extract opcode from rINST
2903    GOTO_OPCODE ip                      @ jump to next instruction
2904
2905
2906/* ------------------------------ */
2907    .balign 128
2908.L_op_sput_byte: /* 0x6b */
2909/* File: arm/op_sput_byte.S */
2910/* File: arm/op_sput.S */
2911    /*
2912     * General SPUT handler wrapper.
2913     *
2914     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2915     */
2916    /* op vAA, field@BBBB */
2917    EXPORT_PC
2918    FETCH   r0, 1                       @ r0<- field ref BBBB
2919    mov     r3, rINST, lsr #8           @ r3<- AA
2920    GET_VREG r1, r3                     @ r1<= fp[AA]
2921    ldr     r2, [rFP, #OFF_FP_METHOD]
2922    mov     r3, rSELF
2923    PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
2924    bl      artSet8StaticFromCode
2925    cmp     r0, #0                      @ 0 on success, -1 on failure
2926    bne     MterpException
2927    ADVANCE 2                           @ Past exception point - now advance rPC
2928    GET_INST_OPCODE ip                  @ extract opcode from rINST
2929    GOTO_OPCODE ip                      @ jump to next instruction
2930
2931
2932/* ------------------------------ */
2933    .balign 128
2934.L_op_sput_char: /* 0x6c */
2935/* File: arm/op_sput_char.S */
2936/* File: arm/op_sput.S */
2937    /*
2938     * General SPUT handler wrapper.
2939     *
2940     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2941     */
2942    /* op vAA, field@BBBB */
2943    EXPORT_PC
2944    FETCH   r0, 1                       @ r0<- field ref BBBB
2945    mov     r3, rINST, lsr #8           @ r3<- AA
2946    GET_VREG r1, r3                     @ r1<= fp[AA]
2947    ldr     r2, [rFP, #OFF_FP_METHOD]
2948    mov     r3, rSELF
2949    PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
2950    bl      artSet16StaticFromCode
2951    cmp     r0, #0                      @ 0 on success, -1 on failure
2952    bne     MterpException
2953    ADVANCE 2                           @ Past exception point - now advance rPC
2954    GET_INST_OPCODE ip                  @ extract opcode from rINST
2955    GOTO_OPCODE ip                      @ jump to next instruction
2956
2957
2958/* ------------------------------ */
2959    .balign 128
2960.L_op_sput_short: /* 0x6d */
2961/* File: arm/op_sput_short.S */
2962/* File: arm/op_sput.S */
2963    /*
2964     * General SPUT handler wrapper.
2965     *
2966     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2967     */
2968    /* op vAA, field@BBBB */
2969    EXPORT_PC
2970    FETCH   r0, 1                       @ r0<- field ref BBBB
2971    mov     r3, rINST, lsr #8           @ r3<- AA
2972    GET_VREG r1, r3                     @ r1<= fp[AA]
2973    ldr     r2, [rFP, #OFF_FP_METHOD]
2974    mov     r3, rSELF
2975    PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
2976    bl      artSet16StaticFromCode
2977    cmp     r0, #0                      @ 0 on success, -1 on failure
2978    bne     MterpException
2979    ADVANCE 2                           @ Past exception point - now advance rPC
2980    GET_INST_OPCODE ip                  @ extract opcode from rINST
2981    GOTO_OPCODE ip                      @ jump to next instruction
2982
2983
2984/* ------------------------------ */
2985    .balign 128
2986.L_op_invoke_virtual: /* 0x6e */
2987/* File: arm/op_invoke_virtual.S */
2988/* File: arm/invoke.S */
2989    /*
2990     * Generic invoke handler wrapper.
2991     */
2992    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2993    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2994    .extern MterpInvokeVirtual
2995    EXPORT_PC
2996    mov     r0, rSELF
2997    add     r1, rFP, #OFF_FP_SHADOWFRAME
2998    mov     r2, rPC
2999    mov     r3, rINST
3000    bl      MterpInvokeVirtual
3001    cmp     r0, #0
3002    beq     MterpException
3003    FETCH_ADVANCE_INST 3
3004    bl      MterpShouldSwitchInterpreters
3005    cmp     r0, #0
3006    bne     MterpFallback
3007    GET_INST_OPCODE ip
3008    GOTO_OPCODE ip
3009
3010
3011    /*
3012     * Handle a virtual method call.
3013     *
3014     * for: invoke-virtual, invoke-virtual/range
3015     */
3016    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3017    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3018
3019/* ------------------------------ */
3020    .balign 128
3021.L_op_invoke_super: /* 0x6f */
3022/* File: arm/op_invoke_super.S */
3023/* File: arm/invoke.S */
3024    /*
3025     * Generic invoke handler wrapper.
3026     */
3027    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3028    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3029    .extern MterpInvokeSuper
3030    EXPORT_PC
3031    mov     r0, rSELF
3032    add     r1, rFP, #OFF_FP_SHADOWFRAME
3033    mov     r2, rPC
3034    mov     r3, rINST
3035    bl      MterpInvokeSuper
3036    cmp     r0, #0
3037    beq     MterpException
3038    FETCH_ADVANCE_INST 3
3039    bl      MterpShouldSwitchInterpreters
3040    cmp     r0, #0
3041    bne     MterpFallback
3042    GET_INST_OPCODE ip
3043    GOTO_OPCODE ip
3044
3045
3046    /*
3047     * Handle a "super" method call.
3048     *
3049     * for: invoke-super, invoke-super/range
3050     */
3051    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3052    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3053
3054/* ------------------------------ */
3055    .balign 128
3056.L_op_invoke_direct: /* 0x70 */
3057/* File: arm/op_invoke_direct.S */
3058/* File: arm/invoke.S */
3059    /*
3060     * Generic invoke handler wrapper.
3061     */
3062    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3063    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3064    .extern MterpInvokeDirect
3065    EXPORT_PC
3066    mov     r0, rSELF
3067    add     r1, rFP, #OFF_FP_SHADOWFRAME
3068    mov     r2, rPC
3069    mov     r3, rINST
3070    bl      MterpInvokeDirect
3071    cmp     r0, #0
3072    beq     MterpException
3073    FETCH_ADVANCE_INST 3
3074    bl      MterpShouldSwitchInterpreters
3075    cmp     r0, #0
3076    bne     MterpFallback
3077    GET_INST_OPCODE ip
3078    GOTO_OPCODE ip
3079
3080
3081
3082/* ------------------------------ */
3083    .balign 128
3084.L_op_invoke_static: /* 0x71 */
3085/* File: arm/op_invoke_static.S */
3086/* File: arm/invoke.S */
3087    /*
3088     * Generic invoke handler wrapper.
3089     */
3090    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3091    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3092    .extern MterpInvokeStatic
3093    EXPORT_PC
3094    mov     r0, rSELF
3095    add     r1, rFP, #OFF_FP_SHADOWFRAME
3096    mov     r2, rPC
3097    mov     r3, rINST
3098    bl      MterpInvokeStatic
3099    cmp     r0, #0
3100    beq     MterpException
3101    FETCH_ADVANCE_INST 3
3102    bl      MterpShouldSwitchInterpreters
3103    cmp     r0, #0
3104    bne     MterpFallback
3105    GET_INST_OPCODE ip
3106    GOTO_OPCODE ip
3107
3108
3109
3110
3111/* ------------------------------ */
3112    .balign 128
3113.L_op_invoke_interface: /* 0x72 */
3114/* File: arm/op_invoke_interface.S */
3115/* File: arm/invoke.S */
3116    /*
3117     * Generic invoke handler wrapper.
3118     */
3119    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3120    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3121    .extern MterpInvokeInterface
3122    EXPORT_PC
3123    mov     r0, rSELF
3124    add     r1, rFP, #OFF_FP_SHADOWFRAME
3125    mov     r2, rPC
3126    mov     r3, rINST
3127    bl      MterpInvokeInterface
3128    cmp     r0, #0
3129    beq     MterpException
3130    FETCH_ADVANCE_INST 3
3131    bl      MterpShouldSwitchInterpreters
3132    cmp     r0, #0
3133    bne     MterpFallback
3134    GET_INST_OPCODE ip
3135    GOTO_OPCODE ip
3136
3137
3138    /*
3139     * Handle an interface method call.
3140     *
3141     * for: invoke-interface, invoke-interface/range
3142     */
3143    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3144    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3145
3146/* ------------------------------ */
3147    .balign 128
3148.L_op_return_void_no_barrier: /* 0x73 */
3149/* File: arm/op_return_void_no_barrier.S */
3150    ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
3151    mov     r0, rSELF
3152    ands    lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3153    blne    MterpSuspendCheck                       @ (self)
3154    mov    r0, #0
3155    mov    r1, #0
3156    b      MterpReturn
3157
3158/* ------------------------------ */
3159    .balign 128
3160.L_op_invoke_virtual_range: /* 0x74 */
3161/* File: arm/op_invoke_virtual_range.S */
3162/* File: arm/invoke.S */
3163    /*
3164     * Generic invoke handler wrapper.
3165     */
3166    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3167    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3168    .extern MterpInvokeVirtualRange
3169    EXPORT_PC
3170    mov     r0, rSELF
3171    add     r1, rFP, #OFF_FP_SHADOWFRAME
3172    mov     r2, rPC
3173    mov     r3, rINST
3174    bl      MterpInvokeVirtualRange
3175    cmp     r0, #0
3176    beq     MterpException
3177    FETCH_ADVANCE_INST 3
3178    bl      MterpShouldSwitchInterpreters
3179    cmp     r0, #0
3180    bne     MterpFallback
3181    GET_INST_OPCODE ip
3182    GOTO_OPCODE ip
3183
3184
3185
3186/* ------------------------------ */
3187    .balign 128
3188.L_op_invoke_super_range: /* 0x75 */
3189/* File: arm/op_invoke_super_range.S */
3190/* File: arm/invoke.S */
3191    /*
3192     * Generic invoke handler wrapper.
3193     */
3194    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3195    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3196    .extern MterpInvokeSuperRange
3197    EXPORT_PC
3198    mov     r0, rSELF
3199    add     r1, rFP, #OFF_FP_SHADOWFRAME
3200    mov     r2, rPC
3201    mov     r3, rINST
3202    bl      MterpInvokeSuperRange
3203    cmp     r0, #0
3204    beq     MterpException
3205    FETCH_ADVANCE_INST 3
3206    bl      MterpShouldSwitchInterpreters
3207    cmp     r0, #0
3208    bne     MterpFallback
3209    GET_INST_OPCODE ip
3210    GOTO_OPCODE ip
3211
3212
3213
3214/* ------------------------------ */
3215    .balign 128
3216.L_op_invoke_direct_range: /* 0x76 */
3217/* File: arm/op_invoke_direct_range.S */
3218/* File: arm/invoke.S */
3219    /*
3220     * Generic invoke handler wrapper.
3221     */
3222    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3223    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3224    .extern MterpInvokeDirectRange
3225    EXPORT_PC
3226    mov     r0, rSELF
3227    add     r1, rFP, #OFF_FP_SHADOWFRAME
3228    mov     r2, rPC
3229    mov     r3, rINST
3230    bl      MterpInvokeDirectRange
3231    cmp     r0, #0
3232    beq     MterpException
3233    FETCH_ADVANCE_INST 3
3234    bl      MterpShouldSwitchInterpreters
3235    cmp     r0, #0
3236    bne     MterpFallback
3237    GET_INST_OPCODE ip
3238    GOTO_OPCODE ip
3239
3240
3241
3242/* ------------------------------ */
3243    .balign 128
3244.L_op_invoke_static_range: /* 0x77 */
3245/* File: arm/op_invoke_static_range.S */
3246/* File: arm/invoke.S */
3247    /*
3248     * Generic invoke handler wrapper.
3249     */
3250    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3251    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3252    .extern MterpInvokeStaticRange
3253    EXPORT_PC
3254    mov     r0, rSELF
3255    add     r1, rFP, #OFF_FP_SHADOWFRAME
3256    mov     r2, rPC
3257    mov     r3, rINST
3258    bl      MterpInvokeStaticRange
3259    cmp     r0, #0
3260    beq     MterpException
3261    FETCH_ADVANCE_INST 3
3262    bl      MterpShouldSwitchInterpreters
3263    cmp     r0, #0
3264    bne     MterpFallback
3265    GET_INST_OPCODE ip
3266    GOTO_OPCODE ip
3267
3268
3269
3270/* ------------------------------ */
3271    .balign 128
3272.L_op_invoke_interface_range: /* 0x78 */
3273/* File: arm/op_invoke_interface_range.S */
3274/* File: arm/invoke.S */
3275    /*
3276     * Generic invoke handler wrapper.
3277     */
3278    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3279    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3280    .extern MterpInvokeInterfaceRange
3281    EXPORT_PC
3282    mov     r0, rSELF
3283    add     r1, rFP, #OFF_FP_SHADOWFRAME
3284    mov     r2, rPC
3285    mov     r3, rINST
3286    bl      MterpInvokeInterfaceRange
3287    cmp     r0, #0
3288    beq     MterpException
3289    FETCH_ADVANCE_INST 3
3290    bl      MterpShouldSwitchInterpreters
3291    cmp     r0, #0
3292    bne     MterpFallback
3293    GET_INST_OPCODE ip
3294    GOTO_OPCODE ip
3295
3296
3297
3298/* ------------------------------ */
3299    .balign 128
3300.L_op_unused_79: /* 0x79 */
3301/* File: arm/op_unused_79.S */
3302/* File: arm/unused.S */
3303/*
3304 * Bail to reference interpreter to throw.
3305 */
3306  b MterpFallback
3307
3308
3309/* ------------------------------ */
3310    .balign 128
3311.L_op_unused_7a: /* 0x7a */
3312/* File: arm/op_unused_7a.S */
3313/* File: arm/unused.S */
3314/*
3315 * Bail to reference interpreter to throw.
3316 */
3317  b MterpFallback
3318
3319
3320/* ------------------------------ */
3321    .balign 128
3322.L_op_neg_int: /* 0x7b */
3323/* File: arm/op_neg_int.S */
3324/* File: arm/unop.S */
3325    /*
3326     * Generic 32-bit unary operation.  Provide an "instr" line that
3327     * specifies an instruction that performs "result = op r0".
3328     * This could be an ARM instruction or a function call.
3329     *
3330     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3331     *      int-to-byte, int-to-char, int-to-short
3332     */
3333    /* unop vA, vB */
3334    mov     r3, rINST, lsr #12          @ r3<- B
3335    ubfx    r9, rINST, #8, #4           @ r9<- A
3336    GET_VREG r0, r3                     @ r0<- vB
3337                               @ optional op; may set condition codes
3338    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3339    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3340    GET_INST_OPCODE ip                  @ extract opcode from rINST
3341    SET_VREG r0, r9                     @ vAA<- r0
3342    GOTO_OPCODE ip                      @ jump to next instruction
3343    /* 8-9 instructions */
3344
3345
3346/* ------------------------------ */
3347    .balign 128
3348.L_op_not_int: /* 0x7c */
3349/* File: arm/op_not_int.S */
3350/* File: arm/unop.S */
3351    /*
3352     * Generic 32-bit unary operation.  Provide an "instr" line that
3353     * specifies an instruction that performs "result = op r0".
3354     * This could be an ARM instruction or a function call.
3355     *
3356     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3357     *      int-to-byte, int-to-char, int-to-short
3358     */
3359    /* unop vA, vB */
3360    mov     r3, rINST, lsr #12          @ r3<- B
3361    ubfx    r9, rINST, #8, #4           @ r9<- A
3362    GET_VREG r0, r3                     @ r0<- vB
3363                               @ optional op; may set condition codes
3364    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3365    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3366    GET_INST_OPCODE ip                  @ extract opcode from rINST
3367    SET_VREG r0, r9                     @ vAA<- r0
3368    GOTO_OPCODE ip                      @ jump to next instruction
3369    /* 8-9 instructions */
3370
3371
3372/* ------------------------------ */
3373    .balign 128
3374.L_op_neg_long: /* 0x7d */
3375/* File: arm/op_neg_long.S */
3376/* File: arm/unopWide.S */
3377    /*
3378     * Generic 64-bit unary operation.  Provide an "instr" line that
3379     * specifies an instruction that performs "result = op r0/r1".
3380     * This could be an ARM instruction or a function call.
3381     *
3382     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3383     */
3384    /* unop vA, vB */
3385    mov     r3, rINST, lsr #12          @ r3<- B
3386    ubfx    rINST, rINST, #8, #4        @ rINST<- A
3387    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
3388    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
3389    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3390    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
3391    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3392    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3393    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3394    GET_INST_OPCODE ip                  @ extract opcode from rINST
3395    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3396    GOTO_OPCODE ip                      @ jump to next instruction
3397    /* 10-11 instructions */
3398
3399
3400/* ------------------------------ */
3401    .balign 128
3402.L_op_not_long: /* 0x7e */
3403/* File: arm/op_not_long.S */
3404/* File: arm/unopWide.S */
3405    /*
3406     * Generic 64-bit unary operation.  Provide an "instr" line that
3407     * specifies an instruction that performs "result = op r0/r1".
3408     * This could be an ARM instruction or a function call.
3409     *
3410     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3411     */
3412    /* unop vA, vB */
3413    mov     r3, rINST, lsr #12          @ r3<- B
3414    ubfx    rINST, rINST, #8, #4        @ rINST<- A
3415    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
3416    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
3417    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3418    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
3419    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3420    mvn     r0, r0                           @ optional op; may set condition codes
3421    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3422    GET_INST_OPCODE ip                  @ extract opcode from rINST
3423    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3424    GOTO_OPCODE ip                      @ jump to next instruction
3425    /* 10-11 instructions */
3426
3427
3428/* ------------------------------ */
3429    .balign 128
3430.L_op_neg_float: /* 0x7f */
3431/* File: arm/op_neg_float.S */
3432/* File: arm/unop.S */
3433    /*
3434     * Generic 32-bit unary operation.  Provide an "instr" line that
3435     * specifies an instruction that performs "result = op r0".
3436     * This could be an ARM instruction or a function call.
3437     *
3438     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3439     *      int-to-byte, int-to-char, int-to-short
3440     */
3441    /* unop vA, vB */
3442    mov     r3, rINST, lsr #12          @ r3<- B
3443    ubfx    r9, rINST, #8, #4           @ r9<- A
3444    GET_VREG r0, r3                     @ r0<- vB
3445                               @ optional op; may set condition codes
3446    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3447    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3448    GET_INST_OPCODE ip                  @ extract opcode from rINST
3449    SET_VREG r0, r9                     @ vAA<- r0
3450    GOTO_OPCODE ip                      @ jump to next instruction
3451    /* 8-9 instructions */
3452
3453
3454/* ------------------------------ */
3455    .balign 128
3456.L_op_neg_double: /* 0x80 */
3457/* File: arm/op_neg_double.S */
3458/* File: arm/unopWide.S */
3459    /*
3460     * Generic 64-bit unary operation.  Provide an "instr" line that
3461     * specifies an instruction that performs "result = op r0/r1".
3462     * This could be an ARM instruction or a function call.
3463     *
3464     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3465     */
3466    /* unop vA, vB */
3467    mov     r3, rINST, lsr #12          @ r3<- B
3468    ubfx    rINST, rINST, #8, #4        @ rINST<- A
3469    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
3470    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
3471    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3472    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
3473    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3474                               @ optional op; may set condition codes
3475    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3476    GET_INST_OPCODE ip                  @ extract opcode from rINST
3477    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3478    GOTO_OPCODE ip                      @ jump to next instruction
3479    /* 10-11 instructions */
3480
3481
3482/* ------------------------------ */
3483    .balign 128
3484.L_op_int_to_long: /* 0x81 */
3485/* File: arm/op_int_to_long.S */
3486/* File: arm/unopWider.S */
3487    /*
3488     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3489     * that specifies an instruction that performs "result = op r0", where
3490     * "result" is a 64-bit quantity in r0/r1.
3491     *
3492     * For: int-to-long, int-to-double, float-to-long, float-to-double
3493     */
3494    /* unop vA, vB */
3495    mov     r3, rINST, lsr #12          @ r3<- B
3496    ubfx    rINST, rINST, #8, #4        @ rINST<- A
3497    GET_VREG r0, r3                     @ r0<- vB
3498    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
3499                               @ optional op; may set condition codes
3500    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
3501    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3502    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3503    GET_INST_OPCODE ip                  @ extract opcode from rINST
3504    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3505    GOTO_OPCODE ip                      @ jump to next instruction
3506    /* 9-10 instructions */
3507
3508
3509/* ------------------------------ */
3510    .balign 128
3511.L_op_int_to_float: /* 0x82 */
3512/* File: arm/op_int_to_float.S */
3513/* File: arm/funop.S */
3514    /*
3515     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3516     * line that specifies an instruction that performs "s1 = op s0".
3517     *
3518     * for: int-to-float, float-to-int
3519     */
3520    /* unop vA, vB */
3521    mov     r3, rINST, lsr #12          @ r3<- B
3522    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
3523    flds    s0, [r3]                    @ s0<- vB
3524    ubfx    r9, rINST, #8, #4           @ r9<- A
3525    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3526    fsitos  s1, s0                              @ s1<- op
3527    GET_INST_OPCODE ip                  @ extract opcode from rINST
3528    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
3529    fsts    s1, [r9]                    @ vA<- s1
3530    GOTO_OPCODE ip                      @ jump to next instruction
3531
3532
3533/* ------------------------------ */
3534    .balign 128
3535.L_op_int_to_double: /* 0x83 */
3536/* File: arm/op_int_to_double.S */
3537/* File: arm/funopWider.S */
3538    /*
3539     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3540     * "instr" line that specifies an instruction that performs "d0 = op s0".
3541     *
3542     * For: int-to-double, float-to-double
3543     */
3544    /* unop vA, vB */
3545    mov     r3, rINST, lsr #12          @ r3<- B
3546    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
3547    flds    s0, [r3]                    @ s0<- vB
3548    ubfx    r9, rINST, #8, #4           @ r9<- A
3549    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3550    fsitod  d0, s0                              @ d0<- op
3551    CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
3552    GET_INST_OPCODE ip                  @ extract opcode from rINST
3553    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
3554    fstd    d0, [r9]                    @ vA<- d0
3555    GOTO_OPCODE ip                      @ jump to next instruction
3556
3557
3558/* ------------------------------ */
3559    .balign 128
3560.L_op_long_to_int: /* 0x84 */
3561/* File: arm/op_long_to_int.S */
3562/* we ignore the high word, making this equivalent to a 32-bit reg move */
3563/* File: arm/op_move.S */
3564    /* for move, move-object, long-to-int */
3565    /* op vA, vB */
3566    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3567    ubfx    r0, rINST, #8, #4           @ r0<- A from 11:8
3568    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3569    GET_VREG r2, r1                     @ r2<- fp[B]
3570    GET_INST_OPCODE ip                  @ ip<- opcode from rINST
3571    .if 0
3572    SET_VREG_OBJECT r2, r0              @ fp[A]<- r2
3573    .else
3574    SET_VREG r2, r0                     @ fp[A]<- r2
3575    .endif
3576    GOTO_OPCODE ip                      @ execute next instruction
3577
3578
3579/* ------------------------------ */
3580    .balign 128
3581.L_op_long_to_float: /* 0x85 */
3582/* File: arm/op_long_to_float.S */
3583/* File: arm/unopNarrower.S */
3584    /*
3585     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3586     * that specifies an instruction that performs "result = op r0/r1", where
3587     * "result" is a 32-bit quantity in r0.
3588     *
3589     * For: long-to-float, double-to-int, double-to-float
3590     *
3591     * (This would work for long-to-int, but that instruction is actually
3592     * an exact match for op_move.)
3593     */
3594    /* unop vA, vB */
3595    mov     r3, rINST, lsr #12          @ r3<- B
3596    ubfx    r9, rINST, #8, #4           @ r9<- A
3597    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
3598    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3599    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3600                               @ optional op; may set condition codes
3601    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3602    GET_INST_OPCODE ip                  @ extract opcode from rINST
3603    SET_VREG r0, r9                     @ vA<- r0
3604    GOTO_OPCODE ip                      @ jump to next instruction
3605    /* 9-10 instructions */
3606
3607
3608/* ------------------------------ */
3609    .balign 128
3610.L_op_long_to_double: /* 0x86 */
3611/* File: arm/op_long_to_double.S */
3612    /*
3613     * Specialised 64-bit floating point operation.
3614     *
3615     * Note: The result will be returned in d2.
3616     *
3617     * For: long-to-double
3618     */
3619    mov     r3, rINST, lsr #12          @ r3<- B
3620    ubfx    r9, rINST, #8, #4           @ r9<- A
3621    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
3622    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[A]
3623    vldr    d0, [r3]                    @ d0<- vAA
3624    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3625
3626    vcvt.f64.s32    d1, s1              @ d1<- (double)(vAAh)
3627    vcvt.f64.u32    d2, s0              @ d2<- (double)(vAAl)
3628    vldr            d3, constvalop_long_to_double
3629    vmla.f64        d2, d1, d3          @ d2<- vAAh*2^32 + vAAl
3630
3631    GET_INST_OPCODE ip                  @ extract opcode from rINST
3632    vstr.64 d2, [r9]                    @ vAA<- d2
3633    GOTO_OPCODE ip                      @ jump to next instruction
3634
3635    /* literal pool helper */
3636constvalop_long_to_double:
3637    .8byte          0x41f0000000000000
3638
3639/* ------------------------------ */
3640    .balign 128
3641.L_op_float_to_int: /* 0x87 */
3642/* File: arm/op_float_to_int.S */
3643/* File: arm/funop.S */
3644    /*
3645     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3646     * line that specifies an instruction that performs "s1 = op s0".
3647     *
3648     * for: int-to-float, float-to-int
3649     */
3650    /* unop vA, vB */
3651    mov     r3, rINST, lsr #12          @ r3<- B
3652    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
3653    flds    s0, [r3]                    @ s0<- vB
3654    ubfx    r9, rINST, #8, #4           @ r9<- A
3655    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3656    ftosizs s1, s0                              @ s1<- op
3657    GET_INST_OPCODE ip                  @ extract opcode from rINST
3658    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
3659    fsts    s1, [r9]                    @ vA<- s1
3660    GOTO_OPCODE ip                      @ jump to next instruction
3661
3662
3663/* ------------------------------ */
3664    .balign 128
3665.L_op_float_to_long: /* 0x88 */
3666/* File: arm/op_float_to_long.S */
3667@include "arm/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3668/* File: arm/unopWider.S */
3669    /*
3670     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3671     * that specifies an instruction that performs "result = op r0", where
3672     * "result" is a 64-bit quantity in r0/r1.
3673     *
3674     * For: int-to-long, int-to-double, float-to-long, float-to-double
3675     */
3676    /* unop vA, vB */
3677    mov     r3, rINST, lsr #12          @ r3<- B
3678    ubfx    rINST, rINST, #8, #4        @ rINST<- A
3679    GET_VREG r0, r3                     @ r0<- vB
3680    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
3681                               @ optional op; may set condition codes
3682    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
3683    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3684    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3685    GET_INST_OPCODE ip                  @ extract opcode from rINST
3686    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3687    GOTO_OPCODE ip                      @ jump to next instruction
3688    /* 9-10 instructions */
3689
3690
3691
3692/* ------------------------------ */
3693    .balign 128
3694.L_op_float_to_double: /* 0x89 */
3695/* File: arm/op_float_to_double.S */
3696/* File: arm/funopWider.S */
3697    /*
3698     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3699     * "instr" line that specifies an instruction that performs "d0 = op s0".
3700     *
3701     * For: int-to-double, float-to-double
3702     */
3703    /* unop vA, vB */
3704    mov     r3, rINST, lsr #12          @ r3<- B
3705    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
3706    flds    s0, [r3]                    @ s0<- vB
3707    ubfx    r9, rINST, #8, #4           @ r9<- A
3708    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3709    vcvt.f64.f32  d0, s0                              @ d0<- op
3710    CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
3711    GET_INST_OPCODE ip                  @ extract opcode from rINST
3712    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
3713    fstd    d0, [r9]                    @ vA<- d0
3714    GOTO_OPCODE ip                      @ jump to next instruction
3715
3716
3717/* ------------------------------ */
3718    .balign 128
3719.L_op_double_to_int: /* 0x8a */
3720/* File: arm/op_double_to_int.S */
3721/* File: arm/funopNarrower.S */
3722    /*
3723     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3724     * "instr" line that specifies an instruction that performs "s0 = op d0".
3725     *
3726     * For: double-to-int, double-to-float
3727     */
3728    /* unop vA, vB */
3729    mov     r3, rINST, lsr #12          @ r3<- B
3730    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
3731    fldd    d0, [r3]                    @ d0<- vB
3732    ubfx    r9, rINST, #8, #4           @ r9<- A
3733    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3734    ftosizd  s0, d0                              @ s0<- op
3735    GET_INST_OPCODE ip                  @ extract opcode from rINST
3736    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
3737    fsts    s0, [r9]                    @ vA<- s0
3738    GOTO_OPCODE ip                      @ jump to next instruction
3739
3740
3741/* ------------------------------ */
3742    .balign 128
3743.L_op_double_to_long: /* 0x8b */
3744/* File: arm/op_double_to_long.S */
3745@include "arm/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
3746/* File: arm/unopWide.S */
3747    /*
3748     * Generic 64-bit unary operation.  Provide an "instr" line that
3749     * specifies an instruction that performs "result = op r0/r1".
3750     * This could be an ARM instruction or a function call.
3751     *
3752     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3753     */
3754    /* unop vA, vB */
3755    mov     r3, rINST, lsr #12          @ r3<- B
3756    ubfx    rINST, rINST, #8, #4        @ rINST<- A
3757    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
3758    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
3759    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3760    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
3761    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3762                               @ optional op; may set condition codes
3763    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
3764    GET_INST_OPCODE ip                  @ extract opcode from rINST
3765    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3766    GOTO_OPCODE ip                      @ jump to next instruction
3767    /* 10-11 instructions */
3768
3769
3770
3771/* ------------------------------ */
3772    .balign 128
3773.L_op_double_to_float: /* 0x8c */
3774/* File: arm/op_double_to_float.S */
3775/* File: arm/funopNarrower.S */
3776    /*
3777     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3778     * "instr" line that specifies an instruction that performs "s0 = op d0".
3779     *
3780     * For: double-to-int, double-to-float
3781     */
3782    /* unop vA, vB */
3783    mov     r3, rINST, lsr #12          @ r3<- B
3784    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
3785    fldd    d0, [r3]                    @ d0<- vB
3786    ubfx    r9, rINST, #8, #4           @ r9<- A
3787    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3788    vcvt.f32.f64  s0, d0                              @ s0<- op
3789    GET_INST_OPCODE ip                  @ extract opcode from rINST
3790    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
3791    fsts    s0, [r9]                    @ vA<- s0
3792    GOTO_OPCODE ip                      @ jump to next instruction
3793
3794
3795/* ------------------------------ */
3796    .balign 128
3797.L_op_int_to_byte: /* 0x8d */
3798/* File: arm/op_int_to_byte.S */
3799/* File: arm/unop.S */
3800    /*
3801     * Generic 32-bit unary operation.  Provide an "instr" line that
3802     * specifies an instruction that performs "result = op r0".
3803     * This could be an ARM instruction or a function call.
3804     *
3805     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3806     *      int-to-byte, int-to-char, int-to-short
3807     */
3808    /* unop vA, vB */
3809    mov     r3, rINST, lsr #12          @ r3<- B
3810    ubfx    r9, rINST, #8, #4           @ r9<- A
3811    GET_VREG r0, r3                     @ r0<- vB
3812                               @ optional op; may set condition codes
3813    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3814    sxtb    r0, r0                              @ r0<- op, r0-r3 changed
3815    GET_INST_OPCODE ip                  @ extract opcode from rINST
3816    SET_VREG r0, r9                     @ vAA<- r0
3817    GOTO_OPCODE ip                      @ jump to next instruction
3818    /* 8-9 instructions */
3819
3820
3821/* ------------------------------ */
3822    .balign 128
3823.L_op_int_to_char: /* 0x8e */
3824/* File: arm/op_int_to_char.S */
3825/* File: arm/unop.S */
3826    /*
3827     * Generic 32-bit unary operation.  Provide an "instr" line that
3828     * specifies an instruction that performs "result = op r0".
3829     * This could be an ARM instruction or a function call.
3830     *
3831     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3832     *      int-to-byte, int-to-char, int-to-short
3833     */
3834    /* unop vA, vB */
3835    mov     r3, rINST, lsr #12          @ r3<- B
3836    ubfx    r9, rINST, #8, #4           @ r9<- A
3837    GET_VREG r0, r3                     @ r0<- vB
3838                               @ optional op; may set condition codes
3839    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3840    uxth    r0, r0                              @ r0<- op, r0-r3 changed
3841    GET_INST_OPCODE ip                  @ extract opcode from rINST
3842    SET_VREG r0, r9                     @ vAA<- r0
3843    GOTO_OPCODE ip                      @ jump to next instruction
3844    /* 8-9 instructions */
3845
3846
3847/* ------------------------------ */
3848    .balign 128
3849.L_op_int_to_short: /* 0x8f */
3850/* File: arm/op_int_to_short.S */
3851/* File: arm/unop.S */
3852    /*
3853     * Generic 32-bit unary operation.  Provide an "instr" line that
3854     * specifies an instruction that performs "result = op r0".
3855     * This could be an ARM instruction or a function call.
3856     *
3857     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3858     *      int-to-byte, int-to-char, int-to-short
3859     */
3860    /* unop vA, vB */
3861    mov     r3, rINST, lsr #12          @ r3<- B
3862    ubfx    r9, rINST, #8, #4           @ r9<- A
3863    GET_VREG r0, r3                     @ r0<- vB
3864                               @ optional op; may set condition codes
3865    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
3866    sxth    r0, r0                              @ r0<- op, r0-r3 changed
3867    GET_INST_OPCODE ip                  @ extract opcode from rINST
3868    SET_VREG r0, r9                     @ vAA<- r0
3869    GOTO_OPCODE ip                      @ jump to next instruction
3870    /* 8-9 instructions */
3871
3872
3873/* ------------------------------ */
3874    .balign 128
3875.L_op_add_int: /* 0x90 */
3876/* File: arm/op_add_int.S */
3877/* File: arm/binop.S */
3878    /*
3879     * Generic 32-bit binary operation.  Provide an "instr" line that
3880     * specifies an instruction that performs "result = r0 op r1".
3881     * This could be an ARM instruction or a function call.  (If the result
3882     * comes back in a register other than r0, you can override "result".)
3883     *
3884     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3885     * vCC (r1).  Useful for integer division and modulus.  Note that we
3886     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3887     * handles it correctly.
3888     *
3889     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3890     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3891     *      mul-float, div-float, rem-float
3892     */
3893    /* binop vAA, vBB, vCC */
3894    FETCH r0, 1                         @ r0<- CCBB
3895    mov     r9, rINST, lsr #8           @ r9<- AA
3896    mov     r3, r0, lsr #8              @ r3<- CC
3897    and     r2, r0, #255                @ r2<- BB
3898    GET_VREG r1, r3                     @ r1<- vCC
3899    GET_VREG r0, r2                     @ r0<- vBB
3900    .if 0
3901    cmp     r1, #0                      @ is second operand zero?
3902    beq     common_errDivideByZero
3903    .endif
3904
3905    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
3906                               @ optional op; may set condition codes
3907    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
3908    GET_INST_OPCODE ip                  @ extract opcode from rINST
3909    SET_VREG r0, r9                @ vAA<- r0
3910    GOTO_OPCODE ip                      @ jump to next instruction
3911    /* 11-14 instructions */
3912
3913
3914/* ------------------------------ */
3915    .balign 128
3916.L_op_sub_int: /* 0x91 */
3917/* File: arm/op_sub_int.S */
3918/* File: arm/binop.S */
3919    /*
3920     * Generic 32-bit binary operation.  Provide an "instr" line that
3921     * specifies an instruction that performs "result = r0 op r1".
3922     * This could be an ARM instruction or a function call.  (If the result
3923     * comes back in a register other than r0, you can override "result".)
3924     *
3925     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3926     * vCC (r1).  Useful for integer division and modulus.  Note that we
3927     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3928     * handles it correctly.
3929     *
3930     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3931     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3932     *      mul-float, div-float, rem-float
3933     */
3934    /* binop vAA, vBB, vCC */
3935    FETCH r0, 1                         @ r0<- CCBB
3936    mov     r9, rINST, lsr #8           @ r9<- AA
3937    mov     r3, r0, lsr #8              @ r3<- CC
3938    and     r2, r0, #255                @ r2<- BB
3939    GET_VREG r1, r3                     @ r1<- vCC
3940    GET_VREG r0, r2                     @ r0<- vBB
3941    .if 0
3942    cmp     r1, #0                      @ is second operand zero?
3943    beq     common_errDivideByZero
3944    .endif
3945
3946    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
3947                               @ optional op; may set condition codes
3948    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
3949    GET_INST_OPCODE ip                  @ extract opcode from rINST
3950    SET_VREG r0, r9                @ vAA<- r0
3951    GOTO_OPCODE ip                      @ jump to next instruction
3952    /* 11-14 instructions */
3953
3954
3955/* ------------------------------ */
3956    .balign 128
3957.L_op_mul_int: /* 0x92 */
3958/* File: arm/op_mul_int.S */
3959/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
3960/* File: arm/binop.S */
3961    /*
3962     * Generic 32-bit binary operation.  Provide an "instr" line that
3963     * specifies an instruction that performs "result = r0 op r1".
3964     * This could be an ARM instruction or a function call.  (If the result
3965     * comes back in a register other than r0, you can override "result".)
3966     *
3967     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3968     * vCC (r1).  Useful for integer division and modulus.  Note that we
3969     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3970     * handles it correctly.
3971     *
3972     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3973     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3974     *      mul-float, div-float, rem-float
3975     */
3976    /* binop vAA, vBB, vCC */
3977    FETCH r0, 1                         @ r0<- CCBB
3978    mov     r9, rINST, lsr #8           @ r9<- AA
3979    mov     r3, r0, lsr #8              @ r3<- CC
3980    and     r2, r0, #255                @ r2<- BB
3981    GET_VREG r1, r3                     @ r1<- vCC
3982    GET_VREG r0, r2                     @ r0<- vBB
3983    .if 0
3984    cmp     r1, #0                      @ is second operand zero?
3985    beq     common_errDivideByZero
3986    .endif
3987
3988    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
3989                               @ optional op; may set condition codes
3990    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
3991    GET_INST_OPCODE ip                  @ extract opcode from rINST
3992    SET_VREG r0, r9                @ vAA<- r0
3993    GOTO_OPCODE ip                      @ jump to next instruction
3994    /* 11-14 instructions */
3995
3996
3997/* ------------------------------ */
3998    .balign 128
3999.L_op_div_int: /* 0x93 */
4000/* File: arm/op_div_int.S */
4001    /*
4002     * Specialized 32-bit binary operation
4003     *
4004     * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
4005     * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4006     * ARMv7 CPUs that have hardware division support).
4007     *
4008     * div-int
4009     *
4010     */
4011    FETCH r0, 1                         @ r0<- CCBB
4012    mov     r9, rINST, lsr #8           @ r9<- AA
4013    mov     r3, r0, lsr #8              @ r3<- CC
4014    and     r2, r0, #255                @ r2<- BB
4015    GET_VREG r1, r3                     @ r1<- vCC
4016    GET_VREG r0, r2                     @ r0<- vBB
4017    cmp     r1, #0                      @ is second operand zero?
4018    beq     common_errDivideByZero
4019
4020    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4021#ifdef __ARM_ARCH_EXT_IDIV__
4022    sdiv    r0, r0, r1                  @ r0<- op
4023#else
4024    bl    __aeabi_idiv                  @ r0<- op, r0-r3 changed
4025#endif
4026    GET_INST_OPCODE ip                  @ extract opcode from rINST
4027    SET_VREG r0, r9                     @ vAA<- r0
4028    GOTO_OPCODE ip                      @ jump to next instruction
4029    /* 11-14 instructions */
4030
4031/* ------------------------------ */
4032    .balign 128
4033.L_op_rem_int: /* 0x94 */
4034/* File: arm/op_rem_int.S */
4035    /*
4036     * Specialized 32-bit binary operation
4037     *
4038     * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
4039     * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4040     * ARMv7 CPUs that have hardware division support).
4041     *
4042     * NOTE: idivmod returns quotient in r0 and remainder in r1
4043     *
4044     * rem-int
4045     *
4046     */
4047    FETCH r0, 1                         @ r0<- CCBB
4048    mov     r9, rINST, lsr #8           @ r9<- AA
4049    mov     r3, r0, lsr #8              @ r3<- CC
4050    and     r2, r0, #255                @ r2<- BB
4051    GET_VREG r1, r3                     @ r1<- vCC
4052    GET_VREG r0, r2                     @ r0<- vBB
4053    cmp     r1, #0                      @ is second operand zero?
4054    beq     common_errDivideByZero
4055
4056    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4057#ifdef __ARM_ARCH_EXT_IDIV__
4058    sdiv    r2, r0, r1
4059    mls  r1, r1, r2, r0                 @ r1<- op, r0-r2 changed
4060#else
4061    bl   __aeabi_idivmod                @ r1<- op, r0-r3 changed
4062#endif
4063    GET_INST_OPCODE ip                  @ extract opcode from rINST
4064    SET_VREG r1, r9                     @ vAA<- r1
4065    GOTO_OPCODE ip                      @ jump to next instruction
4066    /* 11-14 instructions */
4067
4068/* ------------------------------ */
4069    .balign 128
4070.L_op_and_int: /* 0x95 */
4071/* File: arm/op_and_int.S */
4072/* File: arm/binop.S */
4073    /*
4074     * Generic 32-bit binary operation.  Provide an "instr" line that
4075     * specifies an instruction that performs "result = r0 op r1".
4076     * This could be an ARM instruction or a function call.  (If the result
4077     * comes back in a register other than r0, you can override "result".)
4078     *
4079     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4080     * vCC (r1).  Useful for integer division and modulus.  Note that we
4081     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4082     * handles it correctly.
4083     *
4084     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4085     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4086     *      mul-float, div-float, rem-float
4087     */
4088    /* binop vAA, vBB, vCC */
4089    FETCH r0, 1                         @ r0<- CCBB
4090    mov     r9, rINST, lsr #8           @ r9<- AA
4091    mov     r3, r0, lsr #8              @ r3<- CC
4092    and     r2, r0, #255                @ r2<- BB
4093    GET_VREG r1, r3                     @ r1<- vCC
4094    GET_VREG r0, r2                     @ r0<- vBB
4095    .if 0
4096    cmp     r1, #0                      @ is second operand zero?
4097    beq     common_errDivideByZero
4098    .endif
4099
4100    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4101                               @ optional op; may set condition codes
4102    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4103    GET_INST_OPCODE ip                  @ extract opcode from rINST
4104    SET_VREG r0, r9                @ vAA<- r0
4105    GOTO_OPCODE ip                      @ jump to next instruction
4106    /* 11-14 instructions */
4107
4108
4109/* ------------------------------ */
4110    .balign 128
4111.L_op_or_int: /* 0x96 */
4112/* File: arm/op_or_int.S */
4113/* File: arm/binop.S */
4114    /*
4115     * Generic 32-bit binary operation.  Provide an "instr" line that
4116     * specifies an instruction that performs "result = r0 op r1".
4117     * This could be an ARM instruction or a function call.  (If the result
4118     * comes back in a register other than r0, you can override "result".)
4119     *
4120     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4121     * vCC (r1).  Useful for integer division and modulus.  Note that we
4122     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4123     * handles it correctly.
4124     *
4125     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4126     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4127     *      mul-float, div-float, rem-float
4128     */
4129    /* binop vAA, vBB, vCC */
4130    FETCH r0, 1                         @ r0<- CCBB
4131    mov     r9, rINST, lsr #8           @ r9<- AA
4132    mov     r3, r0, lsr #8              @ r3<- CC
4133    and     r2, r0, #255                @ r2<- BB
4134    GET_VREG r1, r3                     @ r1<- vCC
4135    GET_VREG r0, r2                     @ r0<- vBB
4136    .if 0
4137    cmp     r1, #0                      @ is second operand zero?
4138    beq     common_errDivideByZero
4139    .endif
4140
4141    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4142                               @ optional op; may set condition codes
4143    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4144    GET_INST_OPCODE ip                  @ extract opcode from rINST
4145    SET_VREG r0, r9                @ vAA<- r0
4146    GOTO_OPCODE ip                      @ jump to next instruction
4147    /* 11-14 instructions */
4148
4149
4150/* ------------------------------ */
4151    .balign 128
4152.L_op_xor_int: /* 0x97 */
4153/* File: arm/op_xor_int.S */
4154/* File: arm/binop.S */
4155    /*
4156     * Generic 32-bit binary operation.  Provide an "instr" line that
4157     * specifies an instruction that performs "result = r0 op r1".
4158     * This could be an ARM instruction or a function call.  (If the result
4159     * comes back in a register other than r0, you can override "result".)
4160     *
4161     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4162     * vCC (r1).  Useful for integer division and modulus.  Note that we
4163     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4164     * handles it correctly.
4165     *
4166     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4167     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4168     *      mul-float, div-float, rem-float
4169     */
4170    /* binop vAA, vBB, vCC */
4171    FETCH r0, 1                         @ r0<- CCBB
4172    mov     r9, rINST, lsr #8           @ r9<- AA
4173    mov     r3, r0, lsr #8              @ r3<- CC
4174    and     r2, r0, #255                @ r2<- BB
4175    GET_VREG r1, r3                     @ r1<- vCC
4176    GET_VREG r0, r2                     @ r0<- vBB
4177    .if 0
4178    cmp     r1, #0                      @ is second operand zero?
4179    beq     common_errDivideByZero
4180    .endif
4181
4182    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4183                               @ optional op; may set condition codes
4184    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4185    GET_INST_OPCODE ip                  @ extract opcode from rINST
4186    SET_VREG r0, r9                @ vAA<- r0
4187    GOTO_OPCODE ip                      @ jump to next instruction
4188    /* 11-14 instructions */
4189
4190
4191/* ------------------------------ */
4192    .balign 128
4193.L_op_shl_int: /* 0x98 */
4194/* File: arm/op_shl_int.S */
4195/* File: arm/binop.S */
4196    /*
4197     * Generic 32-bit binary operation.  Provide an "instr" line that
4198     * specifies an instruction that performs "result = r0 op r1".
4199     * This could be an ARM instruction or a function call.  (If the result
4200     * comes back in a register other than r0, you can override "result".)
4201     *
4202     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4203     * vCC (r1).  Useful for integer division and modulus.  Note that we
4204     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4205     * handles it correctly.
4206     *
4207     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4208     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4209     *      mul-float, div-float, rem-float
4210     */
4211    /* binop vAA, vBB, vCC */
4212    FETCH r0, 1                         @ r0<- CCBB
4213    mov     r9, rINST, lsr #8           @ r9<- AA
4214    mov     r3, r0, lsr #8              @ r3<- CC
4215    and     r2, r0, #255                @ r2<- BB
4216    GET_VREG r1, r3                     @ r1<- vCC
4217    GET_VREG r0, r2                     @ r0<- vBB
4218    .if 0
4219    cmp     r1, #0                      @ is second operand zero?
4220    beq     common_errDivideByZero
4221    .endif
4222
4223    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4224    and     r1, r1, #31                           @ optional op; may set condition codes
4225    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4226    GET_INST_OPCODE ip                  @ extract opcode from rINST
4227    SET_VREG r0, r9                @ vAA<- r0
4228    GOTO_OPCODE ip                      @ jump to next instruction
4229    /* 11-14 instructions */
4230
4231
4232/* ------------------------------ */
4233    .balign 128
4234.L_op_shr_int: /* 0x99 */
4235/* File: arm/op_shr_int.S */
4236/* File: arm/binop.S */
4237    /*
4238     * Generic 32-bit binary operation.  Provide an "instr" line that
4239     * specifies an instruction that performs "result = r0 op r1".
4240     * This could be an ARM instruction or a function call.  (If the result
4241     * comes back in a register other than r0, you can override "result".)
4242     *
4243     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4244     * vCC (r1).  Useful for integer division and modulus.  Note that we
4245     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4246     * handles it correctly.
4247     *
4248     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4249     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4250     *      mul-float, div-float, rem-float
4251     */
4252    /* binop vAA, vBB, vCC */
4253    FETCH r0, 1                         @ r0<- CCBB
4254    mov     r9, rINST, lsr #8           @ r9<- AA
4255    mov     r3, r0, lsr #8              @ r3<- CC
4256    and     r2, r0, #255                @ r2<- BB
4257    GET_VREG r1, r3                     @ r1<- vCC
4258    GET_VREG r0, r2                     @ r0<- vBB
4259    .if 0
4260    cmp     r1, #0                      @ is second operand zero?
4261    beq     common_errDivideByZero
4262    .endif
4263
4264    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4265    and     r1, r1, #31                           @ optional op; may set condition codes
4266    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4267    GET_INST_OPCODE ip                  @ extract opcode from rINST
4268    SET_VREG r0, r9                @ vAA<- r0
4269    GOTO_OPCODE ip                      @ jump to next instruction
4270    /* 11-14 instructions */
4271
4272
4273/* ------------------------------ */
4274    .balign 128
4275.L_op_ushr_int: /* 0x9a */
4276/* File: arm/op_ushr_int.S */
4277/* File: arm/binop.S */
4278    /*
4279     * Generic 32-bit binary operation.  Provide an "instr" line that
4280     * specifies an instruction that performs "result = r0 op r1".
4281     * This could be an ARM instruction or a function call.  (If the result
4282     * comes back in a register other than r0, you can override "result".)
4283     *
4284     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4285     * vCC (r1).  Useful for integer division and modulus.  Note that we
4286     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4287     * handles it correctly.
4288     *
4289     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4290     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4291     *      mul-float, div-float, rem-float
4292     */
4293    /* binop vAA, vBB, vCC */
4294    FETCH r0, 1                         @ r0<- CCBB
4295    mov     r9, rINST, lsr #8           @ r9<- AA
4296    mov     r3, r0, lsr #8              @ r3<- CC
4297    and     r2, r0, #255                @ r2<- BB
4298    GET_VREG r1, r3                     @ r1<- vCC
4299    GET_VREG r0, r2                     @ r0<- vBB
4300    .if 0
4301    cmp     r1, #0                      @ is second operand zero?
4302    beq     common_errDivideByZero
4303    .endif
4304
4305    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4306    and     r1, r1, #31                           @ optional op; may set condition codes
4307    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4308    GET_INST_OPCODE ip                  @ extract opcode from rINST
4309    SET_VREG r0, r9                @ vAA<- r0
4310    GOTO_OPCODE ip                      @ jump to next instruction
4311    /* 11-14 instructions */
4312
4313
4314/* ------------------------------ */
4315    .balign 128
4316.L_op_add_long: /* 0x9b */
4317/* File: arm/op_add_long.S */
4318/* File: arm/binopWide.S */
4319    /*
4320     * Generic 64-bit binary operation.  Provide an "instr" line that
4321     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4322     * This could be an ARM instruction or a function call.  (If the result
4323     * comes back in a register other than r0, you can override "result".)
4324     *
4325     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4326     * vCC (r1).  Useful for integer division and modulus.
4327     *
4328     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4329     *      xor-long, add-double, sub-double, mul-double, div-double,
4330     *      rem-double
4331     *
4332     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4333     */
4334    /* binop vAA, vBB, vCC */
4335    FETCH r0, 1                         @ r0<- CCBB
4336    mov     rINST, rINST, lsr #8        @ rINST<- AA
4337    and     r2, r0, #255                @ r2<- BB
4338    mov     r3, r0, lsr #8              @ r3<- CC
4339    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
4340    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
4341    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
4342    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4343    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4344    .if 0
4345    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4346    beq     common_errDivideByZero
4347    .endif
4348    CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
4349    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4350    adds    r0, r0, r2                           @ optional op; may set condition codes
4351    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4352    GET_INST_OPCODE ip                  @ extract opcode from rINST
4353    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4354    GOTO_OPCODE ip                      @ jump to next instruction
4355    /* 14-17 instructions */
4356
4357
4358/* ------------------------------ */
4359    .balign 128
4360.L_op_sub_long: /* 0x9c */
4361/* File: arm/op_sub_long.S */
4362/* File: arm/binopWide.S */
4363    /*
4364     * Generic 64-bit binary operation.  Provide an "instr" line that
4365     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4366     * This could be an ARM instruction or a function call.  (If the result
4367     * comes back in a register other than r0, you can override "result".)
4368     *
4369     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4370     * vCC (r1).  Useful for integer division and modulus.
4371     *
4372     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4373     *      xor-long, add-double, sub-double, mul-double, div-double,
4374     *      rem-double
4375     *
4376     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4377     */
4378    /* binop vAA, vBB, vCC */
4379    FETCH r0, 1                         @ r0<- CCBB
4380    mov     rINST, rINST, lsr #8        @ rINST<- AA
4381    and     r2, r0, #255                @ r2<- BB
4382    mov     r3, r0, lsr #8              @ r3<- CC
4383    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
4384    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
4385    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
4386    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4387    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4388    .if 0
4389    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4390    beq     common_errDivideByZero
4391    .endif
4392    CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
4393    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4394    subs    r0, r0, r2                           @ optional op; may set condition codes
4395    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4396    GET_INST_OPCODE ip                  @ extract opcode from rINST
4397    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4398    GOTO_OPCODE ip                      @ jump to next instruction
4399    /* 14-17 instructions */
4400
4401
4402/* ------------------------------ */
4403    .balign 128
4404.L_op_mul_long: /* 0x9d */
4405/* File: arm/op_mul_long.S */
4406    /*
4407     * Signed 64-bit integer multiply.
4408     *
4409     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4410     *        WX
4411     *      x YZ
4412     *  --------
4413     *     ZW ZX
4414     *  YW YX
4415     *
4416     * The low word of the result holds ZX, the high word holds
4417     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4418     * it doesn't fit in the low 64 bits.
4419     *
4420     * Unlike most ARM math operations, multiply instructions have
4421     * restrictions on using the same register more than once (Rd and Rm
4422     * cannot be the same).
4423     */
4424    /* mul-long vAA, vBB, vCC */
4425    FETCH r0, 1                         @ r0<- CCBB
4426    and     r2, r0, #255                @ r2<- BB
4427    mov     r3, r0, lsr #8              @ r3<- CC
4428    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
4429    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
4430    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4431    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4432    mul     ip, r2, r1                  @ ip<- ZxW
4433    umull   r1, lr, r2, r0              @ r1/lr <- ZxX
4434    mla     r2, r0, r3, ip              @ r2<- YxX + (ZxW)
4435    mov     r0, rINST, lsr #8           @ r0<- AA
4436    add     r2, r2, lr                  @ r2<- lr + low(ZxW + (YxX))
4437    VREG_INDEX_TO_ADDR r0, r0           @ r0<- &fp[AA]
4438    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4439    GET_INST_OPCODE ip                  @ extract opcode from rINST
4440    stmia   r0, {r1-r2 }                @ vAA/vAA+1<- r1/r2
4441    GOTO_OPCODE ip                      @ jump to next instruction
4442
4443/* ------------------------------ */
4444    .balign 128
4445.L_op_div_long: /* 0x9e */
4446/* File: arm/op_div_long.S */
4447/* File: arm/binopWide.S */
4448    /*
4449     * Generic 64-bit binary operation.  Provide an "instr" line that
4450     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4451     * This could be an ARM instruction or a function call.  (If the result
4452     * comes back in a register other than r0, you can override "result".)
4453     *
4454     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4455     * vCC (r1).  Useful for integer division and modulus.
4456     *
4457     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4458     *      xor-long, add-double, sub-double, mul-double, div-double,
4459     *      rem-double
4460     *
4461     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4462     */
4463    /* binop vAA, vBB, vCC */
4464    FETCH r0, 1                         @ r0<- CCBB
4465    mov     rINST, rINST, lsr #8        @ rINST<- AA
4466    and     r2, r0, #255                @ r2<- BB
4467    mov     r3, r0, lsr #8              @ r3<- CC
4468    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
4469    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
4470    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
4471    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4472    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4473    .if 1
4474    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4475    beq     common_errDivideByZero
4476    .endif
4477    CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
4478    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4479                               @ optional op; may set condition codes
4480    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4481    GET_INST_OPCODE ip                  @ extract opcode from rINST
4482    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4483    GOTO_OPCODE ip                      @ jump to next instruction
4484    /* 14-17 instructions */
4485
4486
4487/* ------------------------------ */
4488    .balign 128
4489.L_op_rem_long: /* 0x9f */
4490/* File: arm/op_rem_long.S */
4491/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4492/* File: arm/binopWide.S */
4493    /*
4494     * Generic 64-bit binary operation.  Provide an "instr" line that
4495     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4496     * This could be an ARM instruction or a function call.  (If the result
4497     * comes back in a register other than r0, you can override "result".)
4498     *
4499     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4500     * vCC (r1).  Useful for integer division and modulus.
4501     *
4502     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4503     *      xor-long, add-double, sub-double, mul-double, div-double,
4504     *      rem-double
4505     *
4506     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4507     */
4508    /* binop vAA, vBB, vCC */
4509    FETCH r0, 1                         @ r0<- CCBB
4510    mov     rINST, rINST, lsr #8        @ rINST<- AA
4511    and     r2, r0, #255                @ r2<- BB
4512    mov     r3, r0, lsr #8              @ r3<- CC
4513    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
4514    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
4515    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
4516    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4517    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4518    .if 1
4519    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4520    beq     common_errDivideByZero
4521    .endif
4522    CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
4523    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4524                               @ optional op; may set condition codes
4525    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4526    GET_INST_OPCODE ip                  @ extract opcode from rINST
4527    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4528    GOTO_OPCODE ip                      @ jump to next instruction
4529    /* 14-17 instructions */
4530
4531
4532/* ------------------------------ */
4533    .balign 128
4534.L_op_and_long: /* 0xa0 */
4535/* File: arm/op_and_long.S */
4536/* File: arm/binopWide.S */
4537    /*
4538     * Generic 64-bit binary operation.  Provide an "instr" line that
4539     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4540     * This could be an ARM instruction or a function call.  (If the result
4541     * comes back in a register other than r0, you can override "result".)
4542     *
4543     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4544     * vCC (r1).  Useful for integer division and modulus.
4545     *
4546     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4547     *      xor-long, add-double, sub-double, mul-double, div-double,
4548     *      rem-double
4549     *
4550     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4551     */
4552    /* binop vAA, vBB, vCC */
4553    FETCH r0, 1                         @ r0<- CCBB
4554    mov     rINST, rINST, lsr #8        @ rINST<- AA
4555    and     r2, r0, #255                @ r2<- BB
4556    mov     r3, r0, lsr #8              @ r3<- CC
4557    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
4558    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
4559    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
4560    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4561    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4562    .if 0
4563    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4564    beq     common_errDivideByZero
4565    .endif
4566    CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
4567    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4568    and     r0, r0, r2                           @ optional op; may set condition codes
4569    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4570    GET_INST_OPCODE ip                  @ extract opcode from rINST
4571    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4572    GOTO_OPCODE ip                      @ jump to next instruction
4573    /* 14-17 instructions */
4574
4575
4576/* ------------------------------ */
4577    .balign 128
4578.L_op_or_long: /* 0xa1 */
4579/* File: arm/op_or_long.S */
4580/* File: arm/binopWide.S */
4581    /*
4582     * Generic 64-bit binary operation.  Provide an "instr" line that
4583     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4584     * This could be an ARM instruction or a function call.  (If the result
4585     * comes back in a register other than r0, you can override "result".)
4586     *
4587     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4588     * vCC (r1).  Useful for integer division and modulus.
4589     *
4590     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4591     *      xor-long, add-double, sub-double, mul-double, div-double,
4592     *      rem-double
4593     *
4594     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4595     */
4596    /* binop vAA, vBB, vCC */
4597    FETCH r0, 1                         @ r0<- CCBB
4598    mov     rINST, rINST, lsr #8        @ rINST<- AA
4599    and     r2, r0, #255                @ r2<- BB
4600    mov     r3, r0, lsr #8              @ r3<- CC
4601    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
4602    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
4603    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
4604    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4605    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4606    .if 0
4607    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4608    beq     common_errDivideByZero
4609    .endif
4610    CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
4611    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4612    orr     r0, r0, r2                           @ optional op; may set condition codes
4613    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4614    GET_INST_OPCODE ip                  @ extract opcode from rINST
4615    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4616    GOTO_OPCODE ip                      @ jump to next instruction
4617    /* 14-17 instructions */
4618
4619
4620/* ------------------------------ */
4621    .balign 128
4622.L_op_xor_long: /* 0xa2 */
4623/* File: arm/op_xor_long.S */
4624/* File: arm/binopWide.S */
4625    /*
4626     * Generic 64-bit binary operation.  Provide an "instr" line that
4627     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4628     * This could be an ARM instruction or a function call.  (If the result
4629     * comes back in a register other than r0, you can override "result".)
4630     *
4631     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4632     * vCC (r1).  Useful for integer division and modulus.
4633     *
4634     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4635     *      xor-long, add-double, sub-double, mul-double, div-double,
4636     *      rem-double
4637     *
4638     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4639     */
4640    /* binop vAA, vBB, vCC */
4641    FETCH r0, 1                         @ r0<- CCBB
4642    mov     rINST, rINST, lsr #8        @ rINST<- AA
4643    and     r2, r0, #255                @ r2<- BB
4644    mov     r3, r0, lsr #8              @ r3<- CC
4645    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
4646    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
4647    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
4648    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4649    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4650    .if 0
4651    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4652    beq     common_errDivideByZero
4653    .endif
4654    CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
4655    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4656    eor     r0, r0, r2                           @ optional op; may set condition codes
4657    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4658    GET_INST_OPCODE ip                  @ extract opcode from rINST
4659    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4660    GOTO_OPCODE ip                      @ jump to next instruction
4661    /* 14-17 instructions */
4662
4663
4664/* ------------------------------ */
4665    .balign 128
4666.L_op_shl_long: /* 0xa3 */
4667/* File: arm/op_shl_long.S */
4668    /*
4669     * Long integer shift.  This is different from the generic 32/64-bit
4670     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4671     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4672     * 6 bits of the shift distance.
4673     */
4674    /* shl-long vAA, vBB, vCC */
4675    FETCH r0, 1                         @ r0<- CCBB
4676    mov     r9, rINST, lsr #8           @ r9<- AA
4677    and     r3, r0, #255                @ r3<- BB
4678    mov     r0, r0, lsr #8              @ r0<- CC
4679    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[BB]
4680    GET_VREG r2, r0                     @ r2<- vCC
4681    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4682    CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
4683    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4684    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
4685    mov     r1, r1, asl r2              @ r1<- r1 << r2
4686    rsb     r3, r2, #32                 @ r3<- 32 - r2
4687    orr     r1, r1, r0, lsr r3          @ r1<- r1 | (r0 << (32-r2))
4688    subs    ip, r2, #32                 @ ip<- r2 - 32
4689    movpl   r1, r0, asl ip              @ if r2 >= 32, r1<- r0 << (r2-32)
4690    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4691    mov     r0, r0, asl r2              @ r0<- r0 << r2
4692    GET_INST_OPCODE ip                  @ extract opcode from rINST
4693    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
4694    GOTO_OPCODE ip                      @ jump to next instruction
4695
4696/* ------------------------------ */
4697    .balign 128
4698.L_op_shr_long: /* 0xa4 */
4699/* File: arm/op_shr_long.S */
4700    /*
4701     * Long integer shift.  This is different from the generic 32/64-bit
4702     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4703     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4704     * 6 bits of the shift distance.
4705     */
4706    /* shr-long vAA, vBB, vCC */
4707    FETCH r0, 1                         @ r0<- CCBB
4708    mov     r9, rINST, lsr #8           @ r9<- AA
4709    and     r3, r0, #255                @ r3<- BB
4710    mov     r0, r0, lsr #8              @ r0<- CC
4711    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[BB]
4712    GET_VREG r2, r0                     @ r2<- vCC
4713    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4714    CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
4715    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4716    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
4717    mov     r0, r0, lsr r2              @ r0<- r2 >> r2
4718    rsb     r3, r2, #32                 @ r3<- 32 - r2
4719    orr     r0, r0, r1, asl r3          @ r0<- r0 | (r1 << (32-r2))
4720    subs    ip, r2, #32                 @ ip<- r2 - 32
4721    movpl   r0, r1, asr ip              @ if r2 >= 32, r0<-r1 >> (r2-32)
4722    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4723    mov     r1, r1, asr r2              @ r1<- r1 >> r2
4724    GET_INST_OPCODE ip                  @ extract opcode from rINST
4725    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
4726    GOTO_OPCODE ip                      @ jump to next instruction
4727
4728/* ------------------------------ */
4729    .balign 128
4730.L_op_ushr_long: /* 0xa5 */
4731/* File: arm/op_ushr_long.S */
4732    /*
4733     * Long integer shift.  This is different from the generic 32/64-bit
4734     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4735     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4736     * 6 bits of the shift distance.
4737     */
4738    /* ushr-long vAA, vBB, vCC */
4739    FETCH r0, 1                         @ r0<- CCBB
4740    mov     r9, rINST, lsr #8           @ r9<- AA
4741    and     r3, r0, #255                @ r3<- BB
4742    mov     r0, r0, lsr #8              @ r0<- CC
4743    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[BB]
4744    GET_VREG r2, r0                     @ r2<- vCC
4745    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4746    CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
4747    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4748    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
4749    mov     r0, r0, lsr r2              @ r0<- r2 >> r2
4750    rsb     r3, r2, #32                 @ r3<- 32 - r2
4751    orr     r0, r0, r1, asl r3          @ r0<- r0 | (r1 << (32-r2))
4752    subs    ip, r2, #32                 @ ip<- r2 - 32
4753    movpl   r0, r1, lsr ip              @ if r2 >= 32, r0<-r1 >>> (r2-32)
4754    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4755    mov     r1, r1, lsr r2              @ r1<- r1 >>> r2
4756    GET_INST_OPCODE ip                  @ extract opcode from rINST
4757    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
4758    GOTO_OPCODE ip                      @ jump to next instruction
4759
4760/* ------------------------------ */
4761    .balign 128
4762.L_op_add_float: /* 0xa6 */
4763/* File: arm/op_add_float.S */
4764/* File: arm/fbinop.S */
4765    /*
4766     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4767     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4768     * use the "softfp" ABI, this must be an instruction, not a function call.
4769     *
4770     * For: add-float, sub-float, mul-float, div-float
4771     */
4772    /* floatop vAA, vBB, vCC */
4773    FETCH r0, 1                         @ r0<- CCBB
4774    mov     r9, rINST, lsr #8           @ r9<- AA
4775    mov     r3, r0, lsr #8              @ r3<- CC
4776    and     r2, r0, #255                @ r2<- BB
4777    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
4778    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
4779    flds    s1, [r3]                    @ s1<- vCC
4780    flds    s0, [r2]                    @ s0<- vBB
4781
4782    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4783    fadds   s2, s0, s1                              @ s2<- op
4784    GET_INST_OPCODE ip                  @ extract opcode from rINST
4785    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
4786    fsts    s2, [r9]                    @ vAA<- s2
4787    GOTO_OPCODE ip                      @ jump to next instruction
4788
4789
4790/* ------------------------------ */
4791    .balign 128
4792.L_op_sub_float: /* 0xa7 */
4793/* File: arm/op_sub_float.S */
4794/* File: arm/fbinop.S */
4795    /*
4796     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4797     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4798     * use the "softfp" ABI, this must be an instruction, not a function call.
4799     *
4800     * For: add-float, sub-float, mul-float, div-float
4801     */
4802    /* floatop vAA, vBB, vCC */
4803    FETCH r0, 1                         @ r0<- CCBB
4804    mov     r9, rINST, lsr #8           @ r9<- AA
4805    mov     r3, r0, lsr #8              @ r3<- CC
4806    and     r2, r0, #255                @ r2<- BB
4807    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
4808    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
4809    flds    s1, [r3]                    @ s1<- vCC
4810    flds    s0, [r2]                    @ s0<- vBB
4811
4812    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4813    fsubs   s2, s0, s1                              @ s2<- op
4814    GET_INST_OPCODE ip                  @ extract opcode from rINST
4815    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
4816    fsts    s2, [r9]                    @ vAA<- s2
4817    GOTO_OPCODE ip                      @ jump to next instruction
4818
4819
4820/* ------------------------------ */
4821    .balign 128
4822.L_op_mul_float: /* 0xa8 */
4823/* File: arm/op_mul_float.S */
4824/* File: arm/fbinop.S */
4825    /*
4826     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4827     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4828     * use the "softfp" ABI, this must be an instruction, not a function call.
4829     *
4830     * For: add-float, sub-float, mul-float, div-float
4831     */
4832    /* floatop vAA, vBB, vCC */
4833    FETCH r0, 1                         @ r0<- CCBB
4834    mov     r9, rINST, lsr #8           @ r9<- AA
4835    mov     r3, r0, lsr #8              @ r3<- CC
4836    and     r2, r0, #255                @ r2<- BB
4837    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
4838    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
4839    flds    s1, [r3]                    @ s1<- vCC
4840    flds    s0, [r2]                    @ s0<- vBB
4841
4842    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4843    fmuls   s2, s0, s1                              @ s2<- op
4844    GET_INST_OPCODE ip                  @ extract opcode from rINST
4845    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
4846    fsts    s2, [r9]                    @ vAA<- s2
4847    GOTO_OPCODE ip                      @ jump to next instruction
4848
4849
4850/* ------------------------------ */
4851    .balign 128
4852.L_op_div_float: /* 0xa9 */
4853/* File: arm/op_div_float.S */
4854/* File: arm/fbinop.S */
4855    /*
4856     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4857     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4858     * use the "softfp" ABI, this must be an instruction, not a function call.
4859     *
4860     * For: add-float, sub-float, mul-float, div-float
4861     */
4862    /* floatop vAA, vBB, vCC */
4863    FETCH r0, 1                         @ r0<- CCBB
4864    mov     r9, rINST, lsr #8           @ r9<- AA
4865    mov     r3, r0, lsr #8              @ r3<- CC
4866    and     r2, r0, #255                @ r2<- BB
4867    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
4868    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
4869    flds    s1, [r3]                    @ s1<- vCC
4870    flds    s0, [r2]                    @ s0<- vBB
4871
4872    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4873    fdivs   s2, s0, s1                              @ s2<- op
4874    GET_INST_OPCODE ip                  @ extract opcode from rINST
4875    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
4876    fsts    s2, [r9]                    @ vAA<- s2
4877    GOTO_OPCODE ip                      @ jump to next instruction
4878
4879
4880/* ------------------------------ */
4881    .balign 128
4882.L_op_rem_float: /* 0xaa */
4883/* File: arm/op_rem_float.S */
4884/* EABI doesn't define a float remainder function, but libm does */
4885/* File: arm/binop.S */
4886    /*
4887     * Generic 32-bit binary operation.  Provide an "instr" line that
4888     * specifies an instruction that performs "result = r0 op r1".
4889     * This could be an ARM instruction or a function call.  (If the result
4890     * comes back in a register other than r0, you can override "result".)
4891     *
4892     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4893     * vCC (r1).  Useful for integer division and modulus.  Note that we
4894     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4895     * handles it correctly.
4896     *
4897     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4898     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4899     *      mul-float, div-float, rem-float
4900     */
4901    /* binop vAA, vBB, vCC */
4902    FETCH r0, 1                         @ r0<- CCBB
4903    mov     r9, rINST, lsr #8           @ r9<- AA
4904    mov     r3, r0, lsr #8              @ r3<- CC
4905    and     r2, r0, #255                @ r2<- BB
4906    GET_VREG r1, r3                     @ r1<- vCC
4907    GET_VREG r0, r2                     @ r0<- vBB
4908    .if 0
4909    cmp     r1, #0                      @ is second operand zero?
4910    beq     common_errDivideByZero
4911    .endif
4912
4913    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4914                               @ optional op; may set condition codes
4915    bl      fmodf                              @ r0<- op, r0-r3 changed
4916    GET_INST_OPCODE ip                  @ extract opcode from rINST
4917    SET_VREG r0, r9                @ vAA<- r0
4918    GOTO_OPCODE ip                      @ jump to next instruction
4919    /* 11-14 instructions */
4920
4921
4922/* ------------------------------ */
4923    .balign 128
4924.L_op_add_double: /* 0xab */
4925/* File: arm/op_add_double.S */
4926/* File: arm/fbinopWide.S */
4927    /*
4928     * Generic 64-bit double-precision floating point binary operation.
4929     * Provide an "instr" line that specifies an instruction that performs
4930     * "d2 = d0 op d1".
4931     *
4932     * for: add-double, sub-double, mul-double, div-double
4933     */
4934    /* doubleop vAA, vBB, vCC */
4935    FETCH r0, 1                         @ r0<- CCBB
4936    mov     r9, rINST, lsr #8           @ r9<- AA
4937    mov     r3, r0, lsr #8              @ r3<- CC
4938    and     r2, r0, #255                @ r2<- BB
4939    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
4940    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
4941    fldd    d1, [r3]                    @ d1<- vCC
4942    fldd    d0, [r2]                    @ d0<- vBB
4943    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4944    faddd   d2, d0, d1                              @ s2<- op
4945    CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
4946    GET_INST_OPCODE ip                  @ extract opcode from rINST
4947    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
4948    fstd    d2, [r9]                    @ vAA<- d2
4949    GOTO_OPCODE ip                      @ jump to next instruction
4950
4951
4952/* ------------------------------ */
4953    .balign 128
4954.L_op_sub_double: /* 0xac */
4955/* File: arm/op_sub_double.S */
4956/* File: arm/fbinopWide.S */
4957    /*
4958     * Generic 64-bit double-precision floating point binary operation.
4959     * Provide an "instr" line that specifies an instruction that performs
4960     * "d2 = d0 op d1".
4961     *
4962     * for: add-double, sub-double, mul-double, div-double
4963     */
4964    /* doubleop vAA, vBB, vCC */
4965    FETCH r0, 1                         @ r0<- CCBB
4966    mov     r9, rINST, lsr #8           @ r9<- AA
4967    mov     r3, r0, lsr #8              @ r3<- CC
4968    and     r2, r0, #255                @ r2<- BB
4969    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
4970    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
4971    fldd    d1, [r3]                    @ d1<- vCC
4972    fldd    d0, [r2]                    @ d0<- vBB
4973    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
4974    fsubd   d2, d0, d1                              @ s2<- op
4975    CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
4976    GET_INST_OPCODE ip                  @ extract opcode from rINST
4977    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
4978    fstd    d2, [r9]                    @ vAA<- d2
4979    GOTO_OPCODE ip                      @ jump to next instruction
4980
4981
4982/* ------------------------------ */
4983    .balign 128
4984.L_op_mul_double: /* 0xad */
4985/* File: arm/op_mul_double.S */
4986/* File: arm/fbinopWide.S */
4987    /*
4988     * Generic 64-bit double-precision floating point binary operation.
4989     * Provide an "instr" line that specifies an instruction that performs
4990     * "d2 = d0 op d1".
4991     *
4992     * for: add-double, sub-double, mul-double, div-double
4993     */
4994    /* doubleop vAA, vBB, vCC */
4995    FETCH r0, 1                         @ r0<- CCBB
4996    mov     r9, rINST, lsr #8           @ r9<- AA
4997    mov     r3, r0, lsr #8              @ r3<- CC
4998    and     r2, r0, #255                @ r2<- BB
4999    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
5000    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
5001    fldd    d1, [r3]                    @ d1<- vCC
5002    fldd    d0, [r2]                    @ d0<- vBB
5003    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
5004    fmuld   d2, d0, d1                              @ s2<- op
5005    CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
5006    GET_INST_OPCODE ip                  @ extract opcode from rINST
5007    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
5008    fstd    d2, [r9]                    @ vAA<- d2
5009    GOTO_OPCODE ip                      @ jump to next instruction
5010
5011
5012/* ------------------------------ */
5013    .balign 128
5014.L_op_div_double: /* 0xae */
5015/* File: arm/op_div_double.S */
5016/* File: arm/fbinopWide.S */
5017    /*
5018     * Generic 64-bit double-precision floating point binary operation.
5019     * Provide an "instr" line that specifies an instruction that performs
5020     * "d2 = d0 op d1".
5021     *
5022     * for: add-double, sub-double, mul-double, div-double
5023     */
5024    /* doubleop vAA, vBB, vCC */
5025    FETCH r0, 1                         @ r0<- CCBB
5026    mov     r9, rINST, lsr #8           @ r9<- AA
5027    mov     r3, r0, lsr #8              @ r3<- CC
5028    and     r2, r0, #255                @ r2<- BB
5029    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
5030    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
5031    fldd    d1, [r3]                    @ d1<- vCC
5032    fldd    d0, [r2]                    @ d0<- vBB
5033    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
5034    fdivd   d2, d0, d1                              @ s2<- op
5035    CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
5036    GET_INST_OPCODE ip                  @ extract opcode from rINST
5037    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
5038    fstd    d2, [r9]                    @ vAA<- d2
5039    GOTO_OPCODE ip                      @ jump to next instruction
5040
5041
5042/* ------------------------------ */
5043    .balign 128
5044.L_op_rem_double: /* 0xaf */
5045/* File: arm/op_rem_double.S */
5046/* EABI doesn't define a double remainder function, but libm does */
5047/* File: arm/binopWide.S */
5048    /*
5049     * Generic 64-bit binary operation.  Provide an "instr" line that
5050     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5051     * This could be an ARM instruction or a function call.  (If the result
5052     * comes back in a register other than r0, you can override "result".)
5053     *
5054     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5055     * vCC (r1).  Useful for integer division and modulus.
5056     *
5057     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5058     *      xor-long, add-double, sub-double, mul-double, div-double,
5059     *      rem-double
5060     *
5061     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5062     */
5063    /* binop vAA, vBB, vCC */
5064    FETCH r0, 1                         @ r0<- CCBB
5065    mov     rINST, rINST, lsr #8        @ rINST<- AA
5066    and     r2, r0, #255                @ r2<- BB
5067    mov     r3, r0, lsr #8              @ r3<- CC
5068    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
5069    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
5070    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
5071    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5072    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5073    .if 0
5074    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5075    beq     common_errDivideByZero
5076    .endif
5077    CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
5078    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
5079                               @ optional op; may set condition codes
5080    bl      fmod                              @ result<- op, r0-r3 changed
5081    GET_INST_OPCODE ip                  @ extract opcode from rINST
5082    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5083    GOTO_OPCODE ip                      @ jump to next instruction
5084    /* 14-17 instructions */
5085
5086
5087/* ------------------------------ */
5088    .balign 128
5089.L_op_add_int_2addr: /* 0xb0 */
5090/* File: arm/op_add_int_2addr.S */
5091/* File: arm/binop2addr.S */
5092    /*
5093     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5094     * that specifies an instruction that performs "result = r0 op r1".
5095     * This could be an ARM instruction or a function call.  (If the result
5096     * comes back in a register other than r0, you can override "result".)
5097     *
5098     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5099     * vCC (r1).  Useful for integer division and modulus.
5100     *
5101     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5102     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5103     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5104     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5105     */
5106    /* binop/2addr vA, vB */
5107    mov     r3, rINST, lsr #12          @ r3<- B
5108    ubfx    r9, rINST, #8, #4           @ r9<- A
5109    GET_VREG r1, r3                     @ r1<- vB
5110    GET_VREG r0, r9                     @ r0<- vA
5111    .if 0
5112    cmp     r1, #0                      @ is second operand zero?
5113    beq     common_errDivideByZero
5114    .endif
5115    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5116
5117                               @ optional op; may set condition codes
5118    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5119    GET_INST_OPCODE ip                  @ extract opcode from rINST
5120    SET_VREG r0, r9                @ vAA<- r0
5121    GOTO_OPCODE ip                      @ jump to next instruction
5122    /* 10-13 instructions */
5123
5124
5125/* ------------------------------ */
5126    .balign 128
5127.L_op_sub_int_2addr: /* 0xb1 */
5128/* File: arm/op_sub_int_2addr.S */
5129/* File: arm/binop2addr.S */
5130    /*
5131     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5132     * that specifies an instruction that performs "result = r0 op r1".
5133     * This could be an ARM instruction or a function call.  (If the result
5134     * comes back in a register other than r0, you can override "result".)
5135     *
5136     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5137     * vCC (r1).  Useful for integer division and modulus.
5138     *
5139     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5140     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5141     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5142     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5143     */
5144    /* binop/2addr vA, vB */
5145    mov     r3, rINST, lsr #12          @ r3<- B
5146    ubfx    r9, rINST, #8, #4           @ r9<- A
5147    GET_VREG r1, r3                     @ r1<- vB
5148    GET_VREG r0, r9                     @ r0<- vA
5149    .if 0
5150    cmp     r1, #0                      @ is second operand zero?
5151    beq     common_errDivideByZero
5152    .endif
5153    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5154
5155                               @ optional op; may set condition codes
5156    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5157    GET_INST_OPCODE ip                  @ extract opcode from rINST
5158    SET_VREG r0, r9                @ vAA<- r0
5159    GOTO_OPCODE ip                      @ jump to next instruction
5160    /* 10-13 instructions */
5161
5162
5163/* ------------------------------ */
5164    .balign 128
5165.L_op_mul_int_2addr: /* 0xb2 */
5166/* File: arm/op_mul_int_2addr.S */
5167/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5168/* File: arm/binop2addr.S */
5169    /*
5170     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5171     * that specifies an instruction that performs "result = r0 op r1".
5172     * This could be an ARM instruction or a function call.  (If the result
5173     * comes back in a register other than r0, you can override "result".)
5174     *
5175     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5176     * vCC (r1).  Useful for integer division and modulus.
5177     *
5178     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5179     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5180     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5181     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5182     */
5183    /* binop/2addr vA, vB */
5184    mov     r3, rINST, lsr #12          @ r3<- B
5185    ubfx    r9, rINST, #8, #4           @ r9<- A
5186    GET_VREG r1, r3                     @ r1<- vB
5187    GET_VREG r0, r9                     @ r0<- vA
5188    .if 0
5189    cmp     r1, #0                      @ is second operand zero?
5190    beq     common_errDivideByZero
5191    .endif
5192    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5193
5194                               @ optional op; may set condition codes
5195    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5196    GET_INST_OPCODE ip                  @ extract opcode from rINST
5197    SET_VREG r0, r9                @ vAA<- r0
5198    GOTO_OPCODE ip                      @ jump to next instruction
5199    /* 10-13 instructions */
5200
5201
5202/* ------------------------------ */
5203    .balign 128
5204.L_op_div_int_2addr: /* 0xb3 */
5205/* File: arm/op_div_int_2addr.S */
5206    /*
5207     * Specialized 32-bit binary operation
5208     *
5209     * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
5210     * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5211     * ARMv7 CPUs that have hardware division support).
5212     *
5213     * div-int/2addr
5214     *
5215     */
5216    mov     r3, rINST, lsr #12          @ r3<- B
5217    ubfx    r9, rINST, #8, #4           @ r9<- A
5218    GET_VREG r1, r3                     @ r1<- vB
5219    GET_VREG r0, r9                     @ r0<- vA
5220    cmp     r1, #0                      @ is second operand zero?
5221    beq     common_errDivideByZero
5222    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5223
5224#ifdef __ARM_ARCH_EXT_IDIV__
5225    sdiv    r0, r0, r1                  @ r0<- op
5226#else
5227    bl       __aeabi_idiv               @ r0<- op, r0-r3 changed
5228#endif
5229    GET_INST_OPCODE ip                  @ extract opcode from rINST
5230    SET_VREG r0, r9                     @ vAA<- r0
5231    GOTO_OPCODE ip                      @ jump to next instruction
5232    /* 10-13 instructions */
5233
5234
5235/* ------------------------------ */
5236    .balign 128
5237.L_op_rem_int_2addr: /* 0xb4 */
5238/* File: arm/op_rem_int_2addr.S */
5239    /*
5240     * Specialized 32-bit binary operation
5241     *
5242     * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
5243     * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5244     * ARMv7 CPUs that have hardware division support).
5245     *
5246     * NOTE: idivmod returns quotient in r0 and remainder in r1
5247     *
5248     * rem-int/2addr
5249     *
5250     */
5251    mov     r3, rINST, lsr #12          @ r3<- B
5252    ubfx    r9, rINST, #8, #4           @ r9<- A
5253    GET_VREG r1, r3                     @ r1<- vB
5254    GET_VREG r0, r9                     @ r0<- vA
5255    cmp     r1, #0                      @ is second operand zero?
5256    beq     common_errDivideByZero
5257    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5258
5259#ifdef __ARM_ARCH_EXT_IDIV__
5260    sdiv    r2, r0, r1
5261    mls     r1, r1, r2, r0              @ r1<- op
5262#else
5263    bl      __aeabi_idivmod             @ r1<- op, r0-r3 changed
5264#endif
5265    GET_INST_OPCODE ip                  @ extract opcode from rINST
5266    SET_VREG r1, r9                     @ vAA<- r1
5267    GOTO_OPCODE ip                      @ jump to next instruction
5268    /* 10-13 instructions */
5269
5270
5271/* ------------------------------ */
5272    .balign 128
5273.L_op_and_int_2addr: /* 0xb5 */
5274/* File: arm/op_and_int_2addr.S */
5275/* File: arm/binop2addr.S */
5276    /*
5277     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5278     * that specifies an instruction that performs "result = r0 op r1".
5279     * This could be an ARM instruction or a function call.  (If the result
5280     * comes back in a register other than r0, you can override "result".)
5281     *
5282     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5283     * vCC (r1).  Useful for integer division and modulus.
5284     *
5285     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5286     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5287     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5288     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5289     */
5290    /* binop/2addr vA, vB */
5291    mov     r3, rINST, lsr #12          @ r3<- B
5292    ubfx    r9, rINST, #8, #4           @ r9<- A
5293    GET_VREG r1, r3                     @ r1<- vB
5294    GET_VREG r0, r9                     @ r0<- vA
5295    .if 0
5296    cmp     r1, #0                      @ is second operand zero?
5297    beq     common_errDivideByZero
5298    .endif
5299    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5300
5301                               @ optional op; may set condition codes
5302    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5303    GET_INST_OPCODE ip                  @ extract opcode from rINST
5304    SET_VREG r0, r9                @ vAA<- r0
5305    GOTO_OPCODE ip                      @ jump to next instruction
5306    /* 10-13 instructions */
5307
5308
5309/* ------------------------------ */
5310    .balign 128
5311.L_op_or_int_2addr: /* 0xb6 */
5312/* File: arm/op_or_int_2addr.S */
5313/* File: arm/binop2addr.S */
5314    /*
5315     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5316     * that specifies an instruction that performs "result = r0 op r1".
5317     * This could be an ARM instruction or a function call.  (If the result
5318     * comes back in a register other than r0, you can override "result".)
5319     *
5320     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5321     * vCC (r1).  Useful for integer division and modulus.
5322     *
5323     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5324     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5325     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5326     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5327     */
5328    /* binop/2addr vA, vB */
5329    mov     r3, rINST, lsr #12          @ r3<- B
5330    ubfx    r9, rINST, #8, #4           @ r9<- A
5331    GET_VREG r1, r3                     @ r1<- vB
5332    GET_VREG r0, r9                     @ r0<- vA
5333    .if 0
5334    cmp     r1, #0                      @ is second operand zero?
5335    beq     common_errDivideByZero
5336    .endif
5337    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5338
5339                               @ optional op; may set condition codes
5340    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5341    GET_INST_OPCODE ip                  @ extract opcode from rINST
5342    SET_VREG r0, r9                @ vAA<- r0
5343    GOTO_OPCODE ip                      @ jump to next instruction
5344    /* 10-13 instructions */
5345
5346
5347/* ------------------------------ */
5348    .balign 128
5349.L_op_xor_int_2addr: /* 0xb7 */
5350/* File: arm/op_xor_int_2addr.S */
5351/* File: arm/binop2addr.S */
5352    /*
5353     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5354     * that specifies an instruction that performs "result = r0 op r1".
5355     * This could be an ARM instruction or a function call.  (If the result
5356     * comes back in a register other than r0, you can override "result".)
5357     *
5358     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5359     * vCC (r1).  Useful for integer division and modulus.
5360     *
5361     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5362     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5363     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5364     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5365     */
5366    /* binop/2addr vA, vB */
5367    mov     r3, rINST, lsr #12          @ r3<- B
5368    ubfx    r9, rINST, #8, #4           @ r9<- A
5369    GET_VREG r1, r3                     @ r1<- vB
5370    GET_VREG r0, r9                     @ r0<- vA
5371    .if 0
5372    cmp     r1, #0                      @ is second operand zero?
5373    beq     common_errDivideByZero
5374    .endif
5375    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5376
5377                               @ optional op; may set condition codes
5378    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5379    GET_INST_OPCODE ip                  @ extract opcode from rINST
5380    SET_VREG r0, r9                @ vAA<- r0
5381    GOTO_OPCODE ip                      @ jump to next instruction
5382    /* 10-13 instructions */
5383
5384
5385/* ------------------------------ */
5386    .balign 128
5387.L_op_shl_int_2addr: /* 0xb8 */
5388/* File: arm/op_shl_int_2addr.S */
5389/* File: arm/binop2addr.S */
5390    /*
5391     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5392     * that specifies an instruction that performs "result = r0 op r1".
5393     * This could be an ARM instruction or a function call.  (If the result
5394     * comes back in a register other than r0, you can override "result".)
5395     *
5396     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5397     * vCC (r1).  Useful for integer division and modulus.
5398     *
5399     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5400     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5401     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5402     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5403     */
5404    /* binop/2addr vA, vB */
5405    mov     r3, rINST, lsr #12          @ r3<- B
5406    ubfx    r9, rINST, #8, #4           @ r9<- A
5407    GET_VREG r1, r3                     @ r1<- vB
5408    GET_VREG r0, r9                     @ r0<- vA
5409    .if 0
5410    cmp     r1, #0                      @ is second operand zero?
5411    beq     common_errDivideByZero
5412    .endif
5413    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5414
5415    and     r1, r1, #31                           @ optional op; may set condition codes
5416    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5417    GET_INST_OPCODE ip                  @ extract opcode from rINST
5418    SET_VREG r0, r9                @ vAA<- r0
5419    GOTO_OPCODE ip                      @ jump to next instruction
5420    /* 10-13 instructions */
5421
5422
5423/* ------------------------------ */
5424    .balign 128
5425.L_op_shr_int_2addr: /* 0xb9 */
5426/* File: arm/op_shr_int_2addr.S */
5427/* File: arm/binop2addr.S */
5428    /*
5429     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5430     * that specifies an instruction that performs "result = r0 op r1".
5431     * This could be an ARM instruction or a function call.  (If the result
5432     * comes back in a register other than r0, you can override "result".)
5433     *
5434     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5435     * vCC (r1).  Useful for integer division and modulus.
5436     *
5437     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5438     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5439     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5440     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5441     */
5442    /* binop/2addr vA, vB */
5443    mov     r3, rINST, lsr #12          @ r3<- B
5444    ubfx    r9, rINST, #8, #4           @ r9<- A
5445    GET_VREG r1, r3                     @ r1<- vB
5446    GET_VREG r0, r9                     @ r0<- vA
5447    .if 0
5448    cmp     r1, #0                      @ is second operand zero?
5449    beq     common_errDivideByZero
5450    .endif
5451    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5452
5453    and     r1, r1, #31                           @ optional op; may set condition codes
5454    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5455    GET_INST_OPCODE ip                  @ extract opcode from rINST
5456    SET_VREG r0, r9                @ vAA<- r0
5457    GOTO_OPCODE ip                      @ jump to next instruction
5458    /* 10-13 instructions */
5459
5460
5461/* ------------------------------ */
5462    .balign 128
5463.L_op_ushr_int_2addr: /* 0xba */
5464/* File: arm/op_ushr_int_2addr.S */
5465/* File: arm/binop2addr.S */
5466    /*
5467     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5468     * that specifies an instruction that performs "result = r0 op r1".
5469     * This could be an ARM instruction or a function call.  (If the result
5470     * comes back in a register other than r0, you can override "result".)
5471     *
5472     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5473     * vCC (r1).  Useful for integer division and modulus.
5474     *
5475     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5476     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5477     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5478     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5479     */
5480    /* binop/2addr vA, vB */
5481    mov     r3, rINST, lsr #12          @ r3<- B
5482    ubfx    r9, rINST, #8, #4           @ r9<- A
5483    GET_VREG r1, r3                     @ r1<- vB
5484    GET_VREG r0, r9                     @ r0<- vA
5485    .if 0
5486    cmp     r1, #0                      @ is second operand zero?
5487    beq     common_errDivideByZero
5488    .endif
5489    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5490
5491    and     r1, r1, #31                           @ optional op; may set condition codes
5492    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5493    GET_INST_OPCODE ip                  @ extract opcode from rINST
5494    SET_VREG r0, r9                @ vAA<- r0
5495    GOTO_OPCODE ip                      @ jump to next instruction
5496    /* 10-13 instructions */
5497
5498
5499/* ------------------------------ */
5500    .balign 128
5501.L_op_add_long_2addr: /* 0xbb */
5502/* File: arm/op_add_long_2addr.S */
5503/* File: arm/binopWide2addr.S */
5504    /*
5505     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5506     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5507     * This could be an ARM instruction or a function call.  (If the result
5508     * comes back in a register other than r0, you can override "result".)
5509     *
5510     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5511     * vCC (r1).  Useful for integer division and modulus.
5512     *
5513     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5514     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5515     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5516     *      rem-double/2addr
5517     */
5518    /* binop/2addr vA, vB */
5519    mov     r1, rINST, lsr #12          @ r1<- B
5520    ubfx    rINST, rINST, #8, #4        @ rINST<- A
5521    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
5522    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
5523    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5524    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5525    .if 0
5526    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5527    beq     common_errDivideByZero
5528    .endif
5529    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
5530    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5531    adds    r0, r0, r2                           @ optional op; may set condition codes
5532    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5533    GET_INST_OPCODE ip                  @ extract opcode from rINST
5534    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5535    GOTO_OPCODE ip                      @ jump to next instruction
5536    /* 12-15 instructions */
5537
5538
5539/* ------------------------------ */
5540    .balign 128
5541.L_op_sub_long_2addr: /* 0xbc */
5542/* File: arm/op_sub_long_2addr.S */
5543/* File: arm/binopWide2addr.S */
5544    /*
5545     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5546     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5547     * This could be an ARM instruction or a function call.  (If the result
5548     * comes back in a register other than r0, you can override "result".)
5549     *
5550     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5551     * vCC (r1).  Useful for integer division and modulus.
5552     *
5553     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5554     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5555     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5556     *      rem-double/2addr
5557     */
5558    /* binop/2addr vA, vB */
5559    mov     r1, rINST, lsr #12          @ r1<- B
5560    ubfx    rINST, rINST, #8, #4        @ rINST<- A
5561    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
5562    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
5563    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5564    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5565    .if 0
5566    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5567    beq     common_errDivideByZero
5568    .endif
5569    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
5570    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5571    subs    r0, r0, r2                           @ optional op; may set condition codes
5572    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5573    GET_INST_OPCODE ip                  @ extract opcode from rINST
5574    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5575    GOTO_OPCODE ip                      @ jump to next instruction
5576    /* 12-15 instructions */
5577
5578
5579/* ------------------------------ */
5580    .balign 128
5581.L_op_mul_long_2addr: /* 0xbd */
5582/* File: arm/op_mul_long_2addr.S */
5583    /*
5584     * Signed 64-bit integer multiply, "/2addr" version.
5585     *
5586     * See op_mul_long for an explanation.
5587     *
5588     * We get a little tight on registers, so to avoid looking up &fp[A]
5589     * again we stuff it into rINST.
5590     */
5591    /* mul-long/2addr vA, vB */
5592    mov     r1, rINST, lsr #12          @ r1<- B
5593    ubfx    r9, rINST, #8, #4           @ r9<- A
5594    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
5595    VREG_INDEX_TO_ADDR rINST, r9        @ rINST<- &fp[A]
5596    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5597    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
5598    mul     ip, r2, r1                  @ ip<- ZxW
5599    umull   r1, lr, r2, r0              @ r1/lr <- ZxX
5600    mla     r2, r0, r3, ip              @ r2<- YxX + (ZxW)
5601    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
5602    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5603    add     r2, r2, lr                  @ r2<- r2 + low(ZxW + (YxX))
5604    GET_INST_OPCODE ip                  @ extract opcode from rINST
5605    stmia   r0, {r1-r2}                 @ vAA/vAA+1<- r1/r2
5606    GOTO_OPCODE ip                      @ jump to next instruction
5607
5608/* ------------------------------ */
5609    .balign 128
5610.L_op_div_long_2addr: /* 0xbe */
5611/* File: arm/op_div_long_2addr.S */
5612/* File: arm/binopWide2addr.S */
5613    /*
5614     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5615     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5616     * This could be an ARM instruction or a function call.  (If the result
5617     * comes back in a register other than r0, you can override "result".)
5618     *
5619     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5620     * vCC (r1).  Useful for integer division and modulus.
5621     *
5622     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5623     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5624     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5625     *      rem-double/2addr
5626     */
5627    /* binop/2addr vA, vB */
5628    mov     r1, rINST, lsr #12          @ r1<- B
5629    ubfx    rINST, rINST, #8, #4        @ rINST<- A
5630    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
5631    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
5632    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5633    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5634    .if 1
5635    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5636    beq     common_errDivideByZero
5637    .endif
5638    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
5639    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5640                               @ optional op; may set condition codes
5641    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5642    GET_INST_OPCODE ip                  @ extract opcode from rINST
5643    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5644    GOTO_OPCODE ip                      @ jump to next instruction
5645    /* 12-15 instructions */
5646
5647
5648/* ------------------------------ */
5649    .balign 128
5650.L_op_rem_long_2addr: /* 0xbf */
5651/* File: arm/op_rem_long_2addr.S */
5652/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5653/* File: arm/binopWide2addr.S */
5654    /*
5655     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5656     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5657     * This could be an ARM instruction or a function call.  (If the result
5658     * comes back in a register other than r0, you can override "result".)
5659     *
5660     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5661     * vCC (r1).  Useful for integer division and modulus.
5662     *
5663     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5664     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5665     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5666     *      rem-double/2addr
5667     */
5668    /* binop/2addr vA, vB */
5669    mov     r1, rINST, lsr #12          @ r1<- B
5670    ubfx    rINST, rINST, #8, #4        @ rINST<- A
5671    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
5672    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
5673    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5674    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5675    .if 1
5676    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5677    beq     common_errDivideByZero
5678    .endif
5679    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
5680    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5681                               @ optional op; may set condition codes
5682    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5683    GET_INST_OPCODE ip                  @ extract opcode from rINST
5684    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
5685    GOTO_OPCODE ip                      @ jump to next instruction
5686    /* 12-15 instructions */
5687
5688
5689/* ------------------------------ */
5690    .balign 128
5691.L_op_and_long_2addr: /* 0xc0 */
5692/* File: arm/op_and_long_2addr.S */
5693/* File: arm/binopWide2addr.S */
5694    /*
5695     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5696     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5697     * This could be an ARM instruction or a function call.  (If the result
5698     * comes back in a register other than r0, you can override "result".)
5699     *
5700     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5701     * vCC (r1).  Useful for integer division and modulus.
5702     *
5703     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5704     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5705     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5706     *      rem-double/2addr
5707     */
5708    /* binop/2addr vA, vB */
5709    mov     r1, rINST, lsr #12          @ r1<- B
5710    ubfx    rINST, rINST, #8, #4        @ rINST<- A
5711    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
5712    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
5713    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5714    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5715    .if 0
5716    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5717    beq     common_errDivideByZero
5718    .endif
5719    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
5720    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5721    and     r0, r0, r2                           @ optional op; may set condition codes
5722    and     r1, r1, r3                              @ result<- op, r0-r3 changed
5723    GET_INST_OPCODE ip                  @ extract opcode from rINST
5724    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5725    GOTO_OPCODE ip                      @ jump to next instruction
5726    /* 12-15 instructions */
5727
5728
5729/* ------------------------------ */
5730    .balign 128
5731.L_op_or_long_2addr: /* 0xc1 */
5732/* File: arm/op_or_long_2addr.S */
5733/* File: arm/binopWide2addr.S */
5734    /*
5735     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5736     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5737     * This could be an ARM instruction or a function call.  (If the result
5738     * comes back in a register other than r0, you can override "result".)
5739     *
5740     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5741     * vCC (r1).  Useful for integer division and modulus.
5742     *
5743     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5744     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5745     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5746     *      rem-double/2addr
5747     */
5748    /* binop/2addr vA, vB */
5749    mov     r1, rINST, lsr #12          @ r1<- B
5750    ubfx    rINST, rINST, #8, #4        @ rINST<- A
5751    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
5752    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
5753    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5754    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5755    .if 0
5756    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5757    beq     common_errDivideByZero
5758    .endif
5759    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
5760    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5761    orr     r0, r0, r2                           @ optional op; may set condition codes
5762    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
5763    GET_INST_OPCODE ip                  @ extract opcode from rINST
5764    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5765    GOTO_OPCODE ip                      @ jump to next instruction
5766    /* 12-15 instructions */
5767
5768
5769/* ------------------------------ */
5770    .balign 128
5771.L_op_xor_long_2addr: /* 0xc2 */
5772/* File: arm/op_xor_long_2addr.S */
5773/* File: arm/binopWide2addr.S */
5774    /*
5775     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5776     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5777     * This could be an ARM instruction or a function call.  (If the result
5778     * comes back in a register other than r0, you can override "result".)
5779     *
5780     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5781     * vCC (r1).  Useful for integer division and modulus.
5782     *
5783     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5784     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5785     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5786     *      rem-double/2addr
5787     */
5788    /* binop/2addr vA, vB */
5789    mov     r1, rINST, lsr #12          @ r1<- B
5790    ubfx    rINST, rINST, #8, #4        @ rINST<- A
5791    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
5792    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
5793    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5794    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5795    .if 0
5796    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5797    beq     common_errDivideByZero
5798    .endif
5799    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
5800    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5801    eor     r0, r0, r2                           @ optional op; may set condition codes
5802    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
5803    GET_INST_OPCODE ip                  @ extract opcode from rINST
5804    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5805    GOTO_OPCODE ip                      @ jump to next instruction
5806    /* 12-15 instructions */
5807
5808
5809/* ------------------------------ */
5810    .balign 128
5811.L_op_shl_long_2addr: /* 0xc3 */
5812/* File: arm/op_shl_long_2addr.S */
5813    /*
5814     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5815     * 32-bit shift distance.
5816     */
5817    /* shl-long/2addr vA, vB */
5818    mov     r3, rINST, lsr #12          @ r3<- B
5819    ubfx    r9, rINST, #8, #4           @ r9<- A
5820    GET_VREG r2, r3                     @ r2<- vB
5821    CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
5822    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[A]
5823    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5824    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5825    mov     r1, r1, asl r2              @ r1<- r1 << r2
5826    rsb     r3, r2, #32                 @ r3<- 32 - r2
5827    orr     r1, r1, r0, lsr r3          @ r1<- r1 | (r0 << (32-r2))
5828    subs    ip, r2, #32                 @ ip<- r2 - 32
5829    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5830    movpl   r1, r0, asl ip              @ if r2 >= 32, r1<- r0 << (r2-32)
5831    mov     r0, r0, asl r2              @ r0<- r0 << r2
5832    GET_INST_OPCODE ip                  @ extract opcode from rINST
5833    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
5834    GOTO_OPCODE ip                      @ jump to next instruction
5835
5836/* ------------------------------ */
5837    .balign 128
5838.L_op_shr_long_2addr: /* 0xc4 */
5839/* File: arm/op_shr_long_2addr.S */
5840    /*
5841     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5842     * 32-bit shift distance.
5843     */
5844    /* shr-long/2addr vA, vB */
5845    mov     r3, rINST, lsr #12          @ r3<- B
5846    ubfx    r9, rINST, #8, #4           @ r9<- A
5847    GET_VREG r2, r3                     @ r2<- vB
5848    CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
5849    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[A]
5850    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5851    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5852    mov     r0, r0, lsr r2              @ r0<- r2 >> r2
5853    rsb     r3, r2, #32                 @ r3<- 32 - r2
5854    orr     r0, r0, r1, asl r3          @ r0<- r0 | (r1 << (32-r2))
5855    subs    ip, r2, #32                 @ ip<- r2 - 32
5856    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5857    movpl   r0, r1, asr ip              @ if r2 >= 32, r0<-r1 >> (r2-32)
5858    mov     r1, r1, asr r2              @ r1<- r1 >> r2
5859    GET_INST_OPCODE ip                  @ extract opcode from rINST
5860    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
5861    GOTO_OPCODE ip                      @ jump to next instruction
5862
5863/* ------------------------------ */
5864    .balign 128
5865.L_op_ushr_long_2addr: /* 0xc5 */
5866/* File: arm/op_ushr_long_2addr.S */
5867    /*
5868     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5869     * 32-bit shift distance.
5870     */
5871    /* ushr-long/2addr vA, vB */
5872    mov     r3, rINST, lsr #12          @ r3<- B
5873    ubfx    r9, rINST, #8, #4           @ r9<- A
5874    GET_VREG r2, r3                     @ r2<- vB
5875    CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
5876    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[A]
5877    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5878    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5879    mov     r0, r0, lsr r2              @ r0<- r2 >> r2
5880    rsb     r3, r2, #32                 @ r3<- 32 - r2
5881    orr     r0, r0, r1, asl r3          @ r0<- r0 | (r1 << (32-r2))
5882    subs    ip, r2, #32                 @ ip<- r2 - 32
5883    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5884    movpl   r0, r1, lsr ip              @ if r2 >= 32, r0<-r1 >>> (r2-32)
5885    mov     r1, r1, lsr r2              @ r1<- r1 >>> r2
5886    GET_INST_OPCODE ip                  @ extract opcode from rINST
5887    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
5888    GOTO_OPCODE ip                      @ jump to next instruction
5889
5890/* ------------------------------ */
5891    .balign 128
5892.L_op_add_float_2addr: /* 0xc6 */
5893/* File: arm/op_add_float_2addr.S */
5894/* File: arm/fbinop2addr.S */
5895    /*
5896     * Generic 32-bit floating point "/2addr" binary operation.  Provide
5897     * an "instr" line that specifies an instruction that performs
5898     * "s2 = s0 op s1".
5899     *
5900     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5901     */
5902    /* binop/2addr vA, vB */
5903    mov     r3, rINST, lsr #12          @ r3<- B
5904    ubfx    r9, rINST, #8, #4           @ r9<- A
5905    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
5906    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
5907    flds    s1, [r3]                    @ s1<- vB
5908    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5909    flds    s0, [r9]                    @ s0<- vA
5910    fadds   s2, s0, s1                              @ s2<- op
5911    GET_INST_OPCODE ip                  @ extract opcode from rINST
5912    fsts    s2, [r9]                    @ vAA<- s2
5913    GOTO_OPCODE ip                      @ jump to next instruction
5914
5915
5916/* ------------------------------ */
5917    .balign 128
5918.L_op_sub_float_2addr: /* 0xc7 */
5919/* File: arm/op_sub_float_2addr.S */
5920/* File: arm/fbinop2addr.S */
5921    /*
5922     * Generic 32-bit floating point "/2addr" binary operation.  Provide
5923     * an "instr" line that specifies an instruction that performs
5924     * "s2 = s0 op s1".
5925     *
5926     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5927     */
5928    /* binop/2addr vA, vB */
5929    mov     r3, rINST, lsr #12          @ r3<- B
5930    ubfx    r9, rINST, #8, #4           @ r9<- A
5931    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
5932    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
5933    flds    s1, [r3]                    @ s1<- vB
5934    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5935    flds    s0, [r9]                    @ s0<- vA
5936    fsubs   s2, s0, s1                              @ s2<- op
5937    GET_INST_OPCODE ip                  @ extract opcode from rINST
5938    fsts    s2, [r9]                    @ vAA<- s2
5939    GOTO_OPCODE ip                      @ jump to next instruction
5940
5941
5942/* ------------------------------ */
5943    .balign 128
5944.L_op_mul_float_2addr: /* 0xc8 */
5945/* File: arm/op_mul_float_2addr.S */
5946/* File: arm/fbinop2addr.S */
5947    /*
5948     * Generic 32-bit floating point "/2addr" binary operation.  Provide
5949     * an "instr" line that specifies an instruction that performs
5950     * "s2 = s0 op s1".
5951     *
5952     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5953     */
5954    /* binop/2addr vA, vB */
5955    mov     r3, rINST, lsr #12          @ r3<- B
5956    ubfx    r9, rINST, #8, #4           @ r9<- A
5957    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
5958    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
5959    flds    s1, [r3]                    @ s1<- vB
5960    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5961    flds    s0, [r9]                    @ s0<- vA
5962    fmuls   s2, s0, s1                              @ s2<- op
5963    GET_INST_OPCODE ip                  @ extract opcode from rINST
5964    fsts    s2, [r9]                    @ vAA<- s2
5965    GOTO_OPCODE ip                      @ jump to next instruction
5966
5967
5968/* ------------------------------ */
5969    .balign 128
5970.L_op_div_float_2addr: /* 0xc9 */
5971/* File: arm/op_div_float_2addr.S */
5972/* File: arm/fbinop2addr.S */
5973    /*
5974     * Generic 32-bit floating point "/2addr" binary operation.  Provide
5975     * an "instr" line that specifies an instruction that performs
5976     * "s2 = s0 op s1".
5977     *
5978     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5979     */
5980    /* binop/2addr vA, vB */
5981    mov     r3, rINST, lsr #12          @ r3<- B
5982    ubfx    r9, rINST, #8, #4           @ r9<- A
5983    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
5984    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
5985    flds    s1, [r3]                    @ s1<- vB
5986    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
5987    flds    s0, [r9]                    @ s0<- vA
5988    fdivs   s2, s0, s1                              @ s2<- op
5989    GET_INST_OPCODE ip                  @ extract opcode from rINST
5990    fsts    s2, [r9]                    @ vAA<- s2
5991    GOTO_OPCODE ip                      @ jump to next instruction
5992
5993
5994/* ------------------------------ */
5995    .balign 128
5996.L_op_rem_float_2addr: /* 0xca */
5997/* File: arm/op_rem_float_2addr.S */
5998/* EABI doesn't define a float remainder function, but libm does */
5999/* File: arm/binop2addr.S */
6000    /*
6001     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6002     * that specifies an instruction that performs "result = r0 op r1".
6003     * This could be an ARM instruction or a function call.  (If the result
6004     * comes back in a register other than r0, you can override "result".)
6005     *
6006     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6007     * vCC (r1).  Useful for integer division and modulus.
6008     *
6009     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6010     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6011     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6012     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6013     */
6014    /* binop/2addr vA, vB */
6015    mov     r3, rINST, lsr #12          @ r3<- B
6016    ubfx    r9, rINST, #8, #4           @ r9<- A
6017    GET_VREG r1, r3                     @ r1<- vB
6018    GET_VREG r0, r9                     @ r0<- vA
6019    .if 0
6020    cmp     r1, #0                      @ is second operand zero?
6021    beq     common_errDivideByZero
6022    .endif
6023    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
6024
6025                               @ optional op; may set condition codes
6026    bl      fmodf                              @ r0<- op, r0-r3 changed
6027    GET_INST_OPCODE ip                  @ extract opcode from rINST
6028    SET_VREG r0, r9                @ vAA<- r0
6029    GOTO_OPCODE ip                      @ jump to next instruction
6030    /* 10-13 instructions */
6031
6032
6033/* ------------------------------ */
6034    .balign 128
6035.L_op_add_double_2addr: /* 0xcb */
6036/* File: arm/op_add_double_2addr.S */
6037/* File: arm/fbinopWide2addr.S */
6038    /*
6039     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6040     * an "instr" line that specifies an instruction that performs
6041     * "d2 = d0 op d1".
6042     *
6043     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6044     *      div-double/2addr
6045     */
6046    /* binop/2addr vA, vB */
6047    mov     r3, rINST, lsr #12          @ r3<- B
6048    ubfx    r9, rINST, #8, #4           @ r9<- A
6049    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
6050    CLEAR_SHADOW_PAIR r9, ip, r0        @ Zero out shadow regs
6051    fldd    d1, [r3]                    @ d1<- vB
6052    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
6053    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
6054    fldd    d0, [r9]                    @ d0<- vA
6055    faddd   d2, d0, d1                              @ d2<- op
6056    GET_INST_OPCODE ip                  @ extract opcode from rINST
6057    fstd    d2, [r9]                    @ vAA<- d2
6058    GOTO_OPCODE ip                      @ jump to next instruction
6059
6060
6061/* ------------------------------ */
6062    .balign 128
6063.L_op_sub_double_2addr: /* 0xcc */
6064/* File: arm/op_sub_double_2addr.S */
6065/* File: arm/fbinopWide2addr.S */
6066    /*
6067     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6068     * an "instr" line that specifies an instruction that performs
6069     * "d2 = d0 op d1".
6070     *
6071     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6072     *      div-double/2addr
6073     */
6074    /* binop/2addr vA, vB */
6075    mov     r3, rINST, lsr #12          @ r3<- B
6076    ubfx    r9, rINST, #8, #4           @ r9<- A
6077    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
6078    CLEAR_SHADOW_PAIR r9, ip, r0        @ Zero out shadow regs
6079    fldd    d1, [r3]                    @ d1<- vB
6080    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
6081    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
6082    fldd    d0, [r9]                    @ d0<- vA
6083    fsubd   d2, d0, d1                              @ d2<- op
6084    GET_INST_OPCODE ip                  @ extract opcode from rINST
6085    fstd    d2, [r9]                    @ vAA<- d2
6086    GOTO_OPCODE ip                      @ jump to next instruction
6087
6088
6089/* ------------------------------ */
6090    .balign 128
6091.L_op_mul_double_2addr: /* 0xcd */
6092/* File: arm/op_mul_double_2addr.S */
6093/* File: arm/fbinopWide2addr.S */
6094    /*
6095     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6096     * an "instr" line that specifies an instruction that performs
6097     * "d2 = d0 op d1".
6098     *
6099     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6100     *      div-double/2addr
6101     */
6102    /* binop/2addr vA, vB */
6103    mov     r3, rINST, lsr #12          @ r3<- B
6104    ubfx    r9, rINST, #8, #4           @ r9<- A
6105    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
6106    CLEAR_SHADOW_PAIR r9, ip, r0        @ Zero out shadow regs
6107    fldd    d1, [r3]                    @ d1<- vB
6108    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
6109    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
6110    fldd    d0, [r9]                    @ d0<- vA
6111    fmuld   d2, d0, d1                              @ d2<- op
6112    GET_INST_OPCODE ip                  @ extract opcode from rINST
6113    fstd    d2, [r9]                    @ vAA<- d2
6114    GOTO_OPCODE ip                      @ jump to next instruction
6115
6116
6117/* ------------------------------ */
6118    .balign 128
6119.L_op_div_double_2addr: /* 0xce */
6120/* File: arm/op_div_double_2addr.S */
6121/* File: arm/fbinopWide2addr.S */
6122    /*
6123     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6124     * an "instr" line that specifies an instruction that performs
6125     * "d2 = d0 op d1".
6126     *
6127     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6128     *      div-double/2addr
6129     */
6130    /* binop/2addr vA, vB */
6131    mov     r3, rINST, lsr #12          @ r3<- B
6132    ubfx    r9, rINST, #8, #4           @ r9<- A
6133    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
6134    CLEAR_SHADOW_PAIR r9, ip, r0        @ Zero out shadow regs
6135    fldd    d1, [r3]                    @ d1<- vB
6136    VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
6137    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
6138    fldd    d0, [r9]                    @ d0<- vA
6139    fdivd   d2, d0, d1                              @ d2<- op
6140    GET_INST_OPCODE ip                  @ extract opcode from rINST
6141    fstd    d2, [r9]                    @ vAA<- d2
6142    GOTO_OPCODE ip                      @ jump to next instruction
6143
6144
6145/* ------------------------------ */
6146    .balign 128
6147.L_op_rem_double_2addr: /* 0xcf */
6148/* File: arm/op_rem_double_2addr.S */
6149/* EABI doesn't define a double remainder function, but libm does */
6150/* File: arm/binopWide2addr.S */
6151    /*
6152     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6153     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6154     * This could be an ARM instruction or a function call.  (If the result
6155     * comes back in a register other than r0, you can override "result".)
6156     *
6157     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6158     * vCC (r1).  Useful for integer division and modulus.
6159     *
6160     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6161     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6162     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6163     *      rem-double/2addr
6164     */
6165    /* binop/2addr vA, vB */
6166    mov     r1, rINST, lsr #12          @ r1<- B
6167    ubfx    rINST, rINST, #8, #4        @ rINST<- A
6168    VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
6169    VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
6170    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6171    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6172    .if 0
6173    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6174    beq     common_errDivideByZero
6175    .endif
6176    CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
6177    FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
6178                               @ optional op; may set condition codes
6179    bl      fmod                              @ result<- op, r0-r3 changed
6180    GET_INST_OPCODE ip                  @ extract opcode from rINST
6181    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6182    GOTO_OPCODE ip                      @ jump to next instruction
6183    /* 12-15 instructions */
6184
6185
6186/* ------------------------------ */
6187    .balign 128
6188.L_op_add_int_lit16: /* 0xd0 */
6189/* File: arm/op_add_int_lit16.S */
6190/* File: arm/binopLit16.S */
6191    /*
6192     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6193     * that specifies an instruction that performs "result = r0 op r1".
6194     * This could be an ARM instruction or a function call.  (If the result
6195     * comes back in a register other than r0, you can override "result".)
6196     *
6197     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6198     * vCC (r1).  Useful for integer division and modulus.
6199     *
6200     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6201     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6202     */
6203    /* binop/lit16 vA, vB, #+CCCC */
6204    FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
6205    mov     r2, rINST, lsr #12          @ r2<- B
6206    ubfx    r9, rINST, #8, #4           @ r9<- A
6207    GET_VREG r0, r2                     @ r0<- vB
6208    .if 0
6209    cmp     r1, #0                      @ is second operand zero?
6210    beq     common_errDivideByZero
6211    .endif
6212    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6213
6214    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6215    GET_INST_OPCODE ip                  @ extract opcode from rINST
6216    SET_VREG r0, r9                @ vAA<- r0
6217    GOTO_OPCODE ip                      @ jump to next instruction
6218    /* 10-13 instructions */
6219
6220
6221/* ------------------------------ */
6222    .balign 128
6223.L_op_rsub_int: /* 0xd1 */
6224/* File: arm/op_rsub_int.S */
6225/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6226/* File: arm/binopLit16.S */
6227    /*
6228     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6229     * that specifies an instruction that performs "result = r0 op r1".
6230     * This could be an ARM instruction or a function call.  (If the result
6231     * comes back in a register other than r0, you can override "result".)
6232     *
6233     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6234     * vCC (r1).  Useful for integer division and modulus.
6235     *
6236     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6237     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6238     */
6239    /* binop/lit16 vA, vB, #+CCCC */
6240    FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
6241    mov     r2, rINST, lsr #12          @ r2<- B
6242    ubfx    r9, rINST, #8, #4           @ r9<- A
6243    GET_VREG r0, r2                     @ r0<- vB
6244    .if 0
6245    cmp     r1, #0                      @ is second operand zero?
6246    beq     common_errDivideByZero
6247    .endif
6248    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6249
6250    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6251    GET_INST_OPCODE ip                  @ extract opcode from rINST
6252    SET_VREG r0, r9                @ vAA<- r0
6253    GOTO_OPCODE ip                      @ jump to next instruction
6254    /* 10-13 instructions */
6255
6256
6257/* ------------------------------ */
6258    .balign 128
6259.L_op_mul_int_lit16: /* 0xd2 */
6260/* File: arm/op_mul_int_lit16.S */
6261/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6262/* File: arm/binopLit16.S */
6263    /*
6264     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6265     * that specifies an instruction that performs "result = r0 op r1".
6266     * This could be an ARM instruction or a function call.  (If the result
6267     * comes back in a register other than r0, you can override "result".)
6268     *
6269     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6270     * vCC (r1).  Useful for integer division and modulus.
6271     *
6272     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6273     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6274     */
6275    /* binop/lit16 vA, vB, #+CCCC */
6276    FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
6277    mov     r2, rINST, lsr #12          @ r2<- B
6278    ubfx    r9, rINST, #8, #4           @ r9<- A
6279    GET_VREG r0, r2                     @ r0<- vB
6280    .if 0
6281    cmp     r1, #0                      @ is second operand zero?
6282    beq     common_errDivideByZero
6283    .endif
6284    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6285
6286    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6287    GET_INST_OPCODE ip                  @ extract opcode from rINST
6288    SET_VREG r0, r9                @ vAA<- r0
6289    GOTO_OPCODE ip                      @ jump to next instruction
6290    /* 10-13 instructions */
6291
6292
6293/* ------------------------------ */
6294    .balign 128
6295.L_op_div_int_lit16: /* 0xd3 */
6296/* File: arm/op_div_int_lit16.S */
6297    /*
6298     * Specialized 32-bit binary operation
6299     *
6300     * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6301     * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6302     * ARMv7 CPUs that have hardware division support).
6303     *
6304     * div-int/lit16
6305     *
6306     */
6307    FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
6308    mov     r2, rINST, lsr #12          @ r2<- B
6309    ubfx    r9, rINST, #8, #4           @ r9<- A
6310    GET_VREG r0, r2                     @ r0<- vB
6311    cmp     r1, #0                      @ is second operand zero?
6312    beq     common_errDivideByZero
6313    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6314
6315#ifdef __ARM_ARCH_EXT_IDIV__
6316    sdiv    r0, r0, r1                  @ r0<- op
6317#else
6318    bl       __aeabi_idiv               @ r0<- op, r0-r3 changed
6319#endif
6320    GET_INST_OPCODE ip                  @ extract opcode from rINST
6321    SET_VREG r0, r9                     @ vAA<- r0
6322    GOTO_OPCODE ip                      @ jump to next instruction
6323    /* 10-13 instructions */
6324
6325/* ------------------------------ */
6326    .balign 128
6327.L_op_rem_int_lit16: /* 0xd4 */
6328/* File: arm/op_rem_int_lit16.S */
6329    /*
6330     * Specialized 32-bit binary operation
6331     *
6332     * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6333     * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6334     * ARMv7 CPUs that have hardware division support).
6335     *
6336     * NOTE: idivmod returns quotient in r0 and remainder in r1
6337     *
6338     * rem-int/lit16
6339     *
6340     */
6341    FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
6342    mov     r2, rINST, lsr #12          @ r2<- B
6343    ubfx    r9, rINST, #8, #4           @ r9<- A
6344    GET_VREG r0, r2                     @ r0<- vB
6345    cmp     r1, #0                      @ is second operand zero?
6346    beq     common_errDivideByZero
6347    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6348
6349#ifdef __ARM_ARCH_EXT_IDIV__
6350    sdiv    r2, r0, r1
6351    mls     r1, r1, r2, r0              @ r1<- op
6352#else
6353    bl     __aeabi_idivmod              @ r1<- op, r0-r3 changed
6354#endif
6355    GET_INST_OPCODE ip                  @ extract opcode from rINST
6356    SET_VREG r1, r9                     @ vAA<- r1
6357    GOTO_OPCODE ip                      @ jump to next instruction
6358    /* 10-13 instructions */
6359
6360/* ------------------------------ */
6361    .balign 128
6362.L_op_and_int_lit16: /* 0xd5 */
6363/* File: arm/op_and_int_lit16.S */
6364/* File: arm/binopLit16.S */
6365    /*
6366     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6367     * that specifies an instruction that performs "result = r0 op r1".
6368     * This could be an ARM instruction or a function call.  (If the result
6369     * comes back in a register other than r0, you can override "result".)
6370     *
6371     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6372     * vCC (r1).  Useful for integer division and modulus.
6373     *
6374     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6375     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6376     */
6377    /* binop/lit16 vA, vB, #+CCCC */
6378    FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
6379    mov     r2, rINST, lsr #12          @ r2<- B
6380    ubfx    r9, rINST, #8, #4           @ r9<- A
6381    GET_VREG r0, r2                     @ r0<- vB
6382    .if 0
6383    cmp     r1, #0                      @ is second operand zero?
6384    beq     common_errDivideByZero
6385    .endif
6386    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6387
6388    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6389    GET_INST_OPCODE ip                  @ extract opcode from rINST
6390    SET_VREG r0, r9                @ vAA<- r0
6391    GOTO_OPCODE ip                      @ jump to next instruction
6392    /* 10-13 instructions */
6393
6394
6395/* ------------------------------ */
6396    .balign 128
6397.L_op_or_int_lit16: /* 0xd6 */
6398/* File: arm/op_or_int_lit16.S */
6399/* File: arm/binopLit16.S */
6400    /*
6401     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6402     * that specifies an instruction that performs "result = r0 op r1".
6403     * This could be an ARM instruction or a function call.  (If the result
6404     * comes back in a register other than r0, you can override "result".)
6405     *
6406     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6407     * vCC (r1).  Useful for integer division and modulus.
6408     *
6409     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6410     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6411     */
6412    /* binop/lit16 vA, vB, #+CCCC */
6413    FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
6414    mov     r2, rINST, lsr #12          @ r2<- B
6415    ubfx    r9, rINST, #8, #4           @ r9<- A
6416    GET_VREG r0, r2                     @ r0<- vB
6417    .if 0
6418    cmp     r1, #0                      @ is second operand zero?
6419    beq     common_errDivideByZero
6420    .endif
6421    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6422
6423    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6424    GET_INST_OPCODE ip                  @ extract opcode from rINST
6425    SET_VREG r0, r9                @ vAA<- r0
6426    GOTO_OPCODE ip                      @ jump to next instruction
6427    /* 10-13 instructions */
6428
6429
6430/* ------------------------------ */
6431    .balign 128
6432.L_op_xor_int_lit16: /* 0xd7 */
6433/* File: arm/op_xor_int_lit16.S */
6434/* File: arm/binopLit16.S */
6435    /*
6436     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6437     * that specifies an instruction that performs "result = r0 op r1".
6438     * This could be an ARM instruction or a function call.  (If the result
6439     * comes back in a register other than r0, you can override "result".)
6440     *
6441     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6442     * vCC (r1).  Useful for integer division and modulus.
6443     *
6444     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6445     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6446     */
6447    /* binop/lit16 vA, vB, #+CCCC */
6448    FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
6449    mov     r2, rINST, lsr #12          @ r2<- B
6450    ubfx    r9, rINST, #8, #4           @ r9<- A
6451    GET_VREG r0, r2                     @ r0<- vB
6452    .if 0
6453    cmp     r1, #0                      @ is second operand zero?
6454    beq     common_errDivideByZero
6455    .endif
6456    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6457
6458    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6459    GET_INST_OPCODE ip                  @ extract opcode from rINST
6460    SET_VREG r0, r9                @ vAA<- r0
6461    GOTO_OPCODE ip                      @ jump to next instruction
6462    /* 10-13 instructions */
6463
6464
6465/* ------------------------------ */
6466    .balign 128
6467.L_op_add_int_lit8: /* 0xd8 */
6468/* File: arm/op_add_int_lit8.S */
6469/* File: arm/binopLit8.S */
6470    /*
6471     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6472     * that specifies an instruction that performs "result = r0 op r1".
6473     * This could be an ARM instruction or a function call.  (If the result
6474     * comes back in a register other than r0, you can override "result".)
6475     *
6476     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6477     * vCC (r1).  Useful for integer division and modulus.
6478     *
6479     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6480     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6481     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6482     */
6483    /* binop/lit8 vAA, vBB, #+CC */
6484    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
6485    mov     r9, rINST, lsr #8           @ r9<- AA
6486    and     r2, r3, #255                @ r2<- BB
6487    GET_VREG r0, r2                     @ r0<- vBB
6488    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6489    .if 0
6490    @cmp     r1, #0                     @ is second operand zero?
6491    beq     common_errDivideByZero
6492    .endif
6493    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6494
6495                               @ optional op; may set condition codes
6496    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6497    GET_INST_OPCODE ip                  @ extract opcode from rINST
6498    SET_VREG r0, r9                @ vAA<- r0
6499    GOTO_OPCODE ip                      @ jump to next instruction
6500    /* 10-12 instructions */
6501
6502
6503/* ------------------------------ */
6504    .balign 128
6505.L_op_rsub_int_lit8: /* 0xd9 */
6506/* File: arm/op_rsub_int_lit8.S */
6507/* File: arm/binopLit8.S */
6508    /*
6509     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6510     * that specifies an instruction that performs "result = r0 op r1".
6511     * This could be an ARM instruction or a function call.  (If the result
6512     * comes back in a register other than r0, you can override "result".)
6513     *
6514     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6515     * vCC (r1).  Useful for integer division and modulus.
6516     *
6517     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6518     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6519     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6520     */
6521    /* binop/lit8 vAA, vBB, #+CC */
6522    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
6523    mov     r9, rINST, lsr #8           @ r9<- AA
6524    and     r2, r3, #255                @ r2<- BB
6525    GET_VREG r0, r2                     @ r0<- vBB
6526    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6527    .if 0
6528    @cmp     r1, #0                     @ is second operand zero?
6529    beq     common_errDivideByZero
6530    .endif
6531    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6532
6533                               @ optional op; may set condition codes
6534    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6535    GET_INST_OPCODE ip                  @ extract opcode from rINST
6536    SET_VREG r0, r9                @ vAA<- r0
6537    GOTO_OPCODE ip                      @ jump to next instruction
6538    /* 10-12 instructions */
6539
6540
6541/* ------------------------------ */
6542    .balign 128
6543.L_op_mul_int_lit8: /* 0xda */
6544/* File: arm/op_mul_int_lit8.S */
6545/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6546/* File: arm/binopLit8.S */
6547    /*
6548     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6549     * that specifies an instruction that performs "result = r0 op r1".
6550     * This could be an ARM instruction or a function call.  (If the result
6551     * comes back in a register other than r0, you can override "result".)
6552     *
6553     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6554     * vCC (r1).  Useful for integer division and modulus.
6555     *
6556     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6557     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6558     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6559     */
6560    /* binop/lit8 vAA, vBB, #+CC */
6561    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
6562    mov     r9, rINST, lsr #8           @ r9<- AA
6563    and     r2, r3, #255                @ r2<- BB
6564    GET_VREG r0, r2                     @ r0<- vBB
6565    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6566    .if 0
6567    @cmp     r1, #0                     @ is second operand zero?
6568    beq     common_errDivideByZero
6569    .endif
6570    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6571
6572                               @ optional op; may set condition codes
6573    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6574    GET_INST_OPCODE ip                  @ extract opcode from rINST
6575    SET_VREG r0, r9                @ vAA<- r0
6576    GOTO_OPCODE ip                      @ jump to next instruction
6577    /* 10-12 instructions */
6578
6579
6580/* ------------------------------ */
6581    .balign 128
6582.L_op_div_int_lit8: /* 0xdb */
6583/* File: arm/op_div_int_lit8.S */
6584    /*
6585     * Specialized 32-bit binary operation
6586     *
6587     * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6588     * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6589     * ARMv7 CPUs that have hardware division support).
6590     *
6591     * div-int/lit8
6592     *
6593     */
6594    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC
6595    mov     r9, rINST, lsr #8           @ r9<- AA
6596    and     r2, r3, #255                @ r2<- BB
6597    GET_VREG r0, r2                     @ r0<- vBB
6598    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6599    @cmp     r1, #0                     @ is second operand zero?
6600    beq     common_errDivideByZero
6601    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6602
6603#ifdef __ARM_ARCH_EXT_IDIV__
6604    sdiv    r0, r0, r1                  @ r0<- op
6605#else
6606    bl   __aeabi_idiv                   @ r0<- op, r0-r3 changed
6607#endif
6608    GET_INST_OPCODE ip                  @ extract opcode from rINST
6609    SET_VREG r0, r9                     @ vAA<- r0
6610    GOTO_OPCODE ip                      @ jump to next instruction
6611    /* 10-12 instructions */
6612
6613/* ------------------------------ */
6614    .balign 128
6615.L_op_rem_int_lit8: /* 0xdc */
6616/* File: arm/op_rem_int_lit8.S */
6617    /*
6618     * Specialized 32-bit binary operation
6619     *
6620     * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6621     * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6622     * ARMv7 CPUs that have hardware division support).
6623     *
6624     * NOTE: idivmod returns quotient in r0 and remainder in r1
6625     *
6626     * rem-int/lit8
6627     *
6628     */
6629    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
6630    mov     r9, rINST, lsr #8           @ r9<- AA
6631    and     r2, r3, #255                @ r2<- BB
6632    GET_VREG r0, r2                     @ r0<- vBB
6633    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6634    @cmp     r1, #0                     @ is second operand zero?
6635    beq     common_errDivideByZero
6636    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6637
6638#ifdef __ARM_ARCH_EXT_IDIV__
6639    sdiv    r2, r0, r1
6640    mls     r1, r1, r2, r0              @ r1<- op
6641#else
6642    bl       __aeabi_idivmod            @ r1<- op, r0-r3 changed
6643#endif
6644    GET_INST_OPCODE ip                  @ extract opcode from rINST
6645    SET_VREG r1, r9                     @ vAA<- r1
6646    GOTO_OPCODE ip                      @ jump to next instruction
6647    /* 10-12 instructions */
6648
6649/* ------------------------------ */
6650    .balign 128
6651.L_op_and_int_lit8: /* 0xdd */
6652/* File: arm/op_and_int_lit8.S */
6653/* File: arm/binopLit8.S */
6654    /*
6655     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6656     * that specifies an instruction that performs "result = r0 op r1".
6657     * This could be an ARM instruction or a function call.  (If the result
6658     * comes back in a register other than r0, you can override "result".)
6659     *
6660     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6661     * vCC (r1).  Useful for integer division and modulus.
6662     *
6663     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6664     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6665     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6666     */
6667    /* binop/lit8 vAA, vBB, #+CC */
6668    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
6669    mov     r9, rINST, lsr #8           @ r9<- AA
6670    and     r2, r3, #255                @ r2<- BB
6671    GET_VREG r0, r2                     @ r0<- vBB
6672    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6673    .if 0
6674    @cmp     r1, #0                     @ is second operand zero?
6675    beq     common_errDivideByZero
6676    .endif
6677    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6678
6679                               @ optional op; may set condition codes
6680    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6681    GET_INST_OPCODE ip                  @ extract opcode from rINST
6682    SET_VREG r0, r9                @ vAA<- r0
6683    GOTO_OPCODE ip                      @ jump to next instruction
6684    /* 10-12 instructions */
6685
6686
6687/* ------------------------------ */
6688    .balign 128
6689.L_op_or_int_lit8: /* 0xde */
6690/* File: arm/op_or_int_lit8.S */
6691/* File: arm/binopLit8.S */
6692    /*
6693     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6694     * that specifies an instruction that performs "result = r0 op r1".
6695     * This could be an ARM instruction or a function call.  (If the result
6696     * comes back in a register other than r0, you can override "result".)
6697     *
6698     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6699     * vCC (r1).  Useful for integer division and modulus.
6700     *
6701     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6702     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6703     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6704     */
6705    /* binop/lit8 vAA, vBB, #+CC */
6706    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
6707    mov     r9, rINST, lsr #8           @ r9<- AA
6708    and     r2, r3, #255                @ r2<- BB
6709    GET_VREG r0, r2                     @ r0<- vBB
6710    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6711    .if 0
6712    @cmp     r1, #0                     @ is second operand zero?
6713    beq     common_errDivideByZero
6714    .endif
6715    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6716
6717                               @ optional op; may set condition codes
6718    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6719    GET_INST_OPCODE ip                  @ extract opcode from rINST
6720    SET_VREG r0, r9                @ vAA<- r0
6721    GOTO_OPCODE ip                      @ jump to next instruction
6722    /* 10-12 instructions */
6723
6724
6725/* ------------------------------ */
6726    .balign 128
6727.L_op_xor_int_lit8: /* 0xdf */
6728/* File: arm/op_xor_int_lit8.S */
6729/* File: arm/binopLit8.S */
6730    /*
6731     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6732     * that specifies an instruction that performs "result = r0 op r1".
6733     * This could be an ARM instruction or a function call.  (If the result
6734     * comes back in a register other than r0, you can override "result".)
6735     *
6736     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6737     * vCC (r1).  Useful for integer division and modulus.
6738     *
6739     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6740     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6741     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6742     */
6743    /* binop/lit8 vAA, vBB, #+CC */
6744    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
6745    mov     r9, rINST, lsr #8           @ r9<- AA
6746    and     r2, r3, #255                @ r2<- BB
6747    GET_VREG r0, r2                     @ r0<- vBB
6748    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6749    .if 0
6750    @cmp     r1, #0                     @ is second operand zero?
6751    beq     common_errDivideByZero
6752    .endif
6753    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6754
6755                               @ optional op; may set condition codes
6756    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6757    GET_INST_OPCODE ip                  @ extract opcode from rINST
6758    SET_VREG r0, r9                @ vAA<- r0
6759    GOTO_OPCODE ip                      @ jump to next instruction
6760    /* 10-12 instructions */
6761
6762
6763/* ------------------------------ */
6764    .balign 128
6765.L_op_shl_int_lit8: /* 0xe0 */
6766/* File: arm/op_shl_int_lit8.S */
6767/* File: arm/binopLit8.S */
6768    /*
6769     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6770     * that specifies an instruction that performs "result = r0 op r1".
6771     * This could be an ARM instruction or a function call.  (If the result
6772     * comes back in a register other than r0, you can override "result".)
6773     *
6774     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6775     * vCC (r1).  Useful for integer division and modulus.
6776     *
6777     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6778     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6779     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6780     */
6781    /* binop/lit8 vAA, vBB, #+CC */
6782    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
6783    mov     r9, rINST, lsr #8           @ r9<- AA
6784    and     r2, r3, #255                @ r2<- BB
6785    GET_VREG r0, r2                     @ r0<- vBB
6786    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6787    .if 0
6788    @cmp     r1, #0                     @ is second operand zero?
6789    beq     common_errDivideByZero
6790    .endif
6791    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6792
6793    and     r1, r1, #31                           @ optional op; may set condition codes
6794    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
6795    GET_INST_OPCODE ip                  @ extract opcode from rINST
6796    SET_VREG r0, r9                @ vAA<- r0
6797    GOTO_OPCODE ip                      @ jump to next instruction
6798    /* 10-12 instructions */
6799
6800
6801/* ------------------------------ */
6802    .balign 128
6803.L_op_shr_int_lit8: /* 0xe1 */
6804/* File: arm/op_shr_int_lit8.S */
6805/* File: arm/binopLit8.S */
6806    /*
6807     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6808     * that specifies an instruction that performs "result = r0 op r1".
6809     * This could be an ARM instruction or a function call.  (If the result
6810     * comes back in a register other than r0, you can override "result".)
6811     *
6812     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6813     * vCC (r1).  Useful for integer division and modulus.
6814     *
6815     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6816     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6817     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6818     */
6819    /* binop/lit8 vAA, vBB, #+CC */
6820    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
6821    mov     r9, rINST, lsr #8           @ r9<- AA
6822    and     r2, r3, #255                @ r2<- BB
6823    GET_VREG r0, r2                     @ r0<- vBB
6824    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6825    .if 0
6826    @cmp     r1, #0                     @ is second operand zero?
6827    beq     common_errDivideByZero
6828    .endif
6829    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6830
6831    and     r1, r1, #31                           @ optional op; may set condition codes
6832    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
6833    GET_INST_OPCODE ip                  @ extract opcode from rINST
6834    SET_VREG r0, r9                @ vAA<- r0
6835    GOTO_OPCODE ip                      @ jump to next instruction
6836    /* 10-12 instructions */
6837
6838
6839/* ------------------------------ */
6840    .balign 128
6841.L_op_ushr_int_lit8: /* 0xe2 */
6842/* File: arm/op_ushr_int_lit8.S */
6843/* File: arm/binopLit8.S */
6844    /*
6845     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6846     * that specifies an instruction that performs "result = r0 op r1".
6847     * This could be an ARM instruction or a function call.  (If the result
6848     * comes back in a register other than r0, you can override "result".)
6849     *
6850     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6851     * vCC (r1).  Useful for integer division and modulus.
6852     *
6853     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6854     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6855     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6856     */
6857    /* binop/lit8 vAA, vBB, #+CC */
6858    FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
6859    mov     r9, rINST, lsr #8           @ r9<- AA
6860    and     r2, r3, #255                @ r2<- BB
6861    GET_VREG r0, r2                     @ r0<- vBB
6862    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6863    .if 0
6864    @cmp     r1, #0                     @ is second operand zero?
6865    beq     common_errDivideByZero
6866    .endif
6867    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6868
6869    and     r1, r1, #31                           @ optional op; may set condition codes
6870    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
6871    GET_INST_OPCODE ip                  @ extract opcode from rINST
6872    SET_VREG r0, r9                @ vAA<- r0
6873    GOTO_OPCODE ip                      @ jump to next instruction
6874    /* 10-12 instructions */
6875
6876
6877/* ------------------------------ */
6878    .balign 128
6879.L_op_iget_quick: /* 0xe3 */
6880/* File: arm/op_iget_quick.S */
6881    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6882    /* op vA, vB, offset@CCCC */
6883    mov     r2, rINST, lsr #12          @ r2<- B
6884    FETCH r1, 1                         @ r1<- field byte offset
6885    GET_VREG r3, r2                     @ r3<- object we're operating on
6886    ubfx    r2, rINST, #8, #4           @ r2<- A
6887    cmp     r3, #0                      @ check object for null
6888    beq     common_errNullObject        @ object was null
6889    ldr   r0, [r3, r1]                @ r0<- obj.field
6890    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6891    SET_VREG r0, r2                     @ fp[A]<- r0
6892    GET_INST_OPCODE ip                  @ extract opcode from rINST
6893    GOTO_OPCODE ip                      @ jump to next instruction
6894
6895/* ------------------------------ */
6896    .balign 128
6897.L_op_iget_wide_quick: /* 0xe4 */
6898/* File: arm/op_iget_wide_quick.S */
6899    /* iget-wide-quick vA, vB, offset@CCCC */
6900    mov     r2, rINST, lsr #12          @ r2<- B
6901    FETCH ip, 1                         @ ip<- field byte offset
6902    GET_VREG r3, r2                     @ r3<- object we're operating on
6903    ubfx    r2, rINST, #8, #4           @ r2<- A
6904    cmp     r3, #0                      @ check object for null
6905    beq     common_errNullObject        @ object was null
6906    ldrd    r0, [r3, ip]                @ r0<- obj.field (64 bits, aligned)
6907    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6908    VREG_INDEX_TO_ADDR r3, r2           @ r3<- &fp[A]
6909    CLEAR_SHADOW_PAIR r2, ip, lr        @ Zero out the shadow regs
6910    GET_INST_OPCODE ip                  @ extract opcode from rINST
6911    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
6912    GOTO_OPCODE ip                      @ jump to next instruction
6913
6914/* ------------------------------ */
6915    .balign 128
6916.L_op_iget_object_quick: /* 0xe5 */
6917/* File: arm/op_iget_object_quick.S */
6918    /* For: iget-object-quick */
6919    /* op vA, vB, offset@CCCC */
6920    mov     r2, rINST, lsr #12          @ r2<- B
6921    FETCH r1, 1                         @ r1<- field byte offset
6922    EXPORT_PC
6923    GET_VREG r0, r2                     @ r0<- object we're operating on
6924    bl      artIGetObjectFromMterp      @ (obj, offset)
6925    ldr     r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
6926    ubfx    r2, rINST, #8, #4           @ r2<- A
6927    PREFETCH_INST 2
6928    cmp     r3, #0
6929    bne     MterpPossibleException      @ bail out
6930    SET_VREG_OBJECT r0, r2              @ fp[A]<- r0
6931    ADVANCE 2                           @ advance rPC
6932    GET_INST_OPCODE ip                  @ extract opcode from rINST
6933    GOTO_OPCODE ip                      @ jump to next instruction
6934
6935/* ------------------------------ */
6936    .balign 128
6937.L_op_iput_quick: /* 0xe6 */
6938/* File: arm/op_iput_quick.S */
6939    /* For: iput-quick, iput-object-quick */
6940    /* op vA, vB, offset@CCCC */
6941    mov     r2, rINST, lsr #12          @ r2<- B
6942    FETCH r1, 1                         @ r1<- field byte offset
6943    GET_VREG r3, r2                     @ r3<- fp[B], the object pointer
6944    ubfx    r2, rINST, #8, #4           @ r2<- A
6945    cmp     r3, #0                      @ check object for null
6946    beq     common_errNullObject        @ object was null
6947    GET_VREG r0, r2                     @ r0<- fp[A]
6948    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6949    str     r0, [r3, r1]             @ obj.field<- r0
6950    GET_INST_OPCODE ip                  @ extract opcode from rINST
6951    GOTO_OPCODE ip                      @ jump to next instruction
6952
6953/* ------------------------------ */
6954    .balign 128
6955.L_op_iput_wide_quick: /* 0xe7 */
6956/* File: arm/op_iput_wide_quick.S */
6957    /* iput-wide-quick vA, vB, offset@CCCC */
6958    mov     r2, rINST, lsr #12          @ r2<- B
6959    FETCH r3, 1                         @ r3<- field byte offset
6960    GET_VREG r2, r2                     @ r2<- fp[B], the object pointer
6961    ubfx    r0, rINST, #8, #4           @ r0<- A
6962    cmp     r2, #0                      @ check object for null
6963    beq     common_errNullObject        @ object was null
6964    VREG_INDEX_TO_ADDR r0, r0           @ r0<- &fp[A]
6965    ldmia   r0, {r0-r1}                 @ r0/r1<- fp[A]/fp[A+1]
6966    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6967    strd    r0, [r2, r3]                @ obj.field<- r0/r1
6968    GET_INST_OPCODE ip                  @ extract opcode from rINST
6969    GOTO_OPCODE ip                      @ jump to next instruction
6970
6971/* ------------------------------ */
6972    .balign 128
6973.L_op_iput_object_quick: /* 0xe8 */
6974/* File: arm/op_iput_object_quick.S */
6975    EXPORT_PC
6976    add     r0, rFP, #OFF_FP_SHADOWFRAME
6977    mov     r1, rPC
6978    mov     r2, rINST
6979    bl      MterpIputObjectQuick
6980    cmp     r0, #0
6981    beq     MterpException
6982    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
6983    GET_INST_OPCODE ip                  @ extract opcode from rINST
6984    GOTO_OPCODE ip                      @ jump to next instruction
6985
6986/* ------------------------------ */
6987    .balign 128
6988.L_op_invoke_virtual_quick: /* 0xe9 */
6989/* File: arm/op_invoke_virtual_quick.S */
6990/* File: arm/invoke.S */
6991    /*
6992     * Generic invoke handler wrapper.
6993     */
6994    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6995    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6996    .extern MterpInvokeVirtualQuick
6997    EXPORT_PC
6998    mov     r0, rSELF
6999    add     r1, rFP, #OFF_FP_SHADOWFRAME
7000    mov     r2, rPC
7001    mov     r3, rINST
7002    bl      MterpInvokeVirtualQuick
7003    cmp     r0, #0
7004    beq     MterpException
7005    FETCH_ADVANCE_INST 3
7006    bl      MterpShouldSwitchInterpreters
7007    cmp     r0, #0
7008    bne     MterpFallback
7009    GET_INST_OPCODE ip
7010    GOTO_OPCODE ip
7011
7012
7013
7014/* ------------------------------ */
7015    .balign 128
7016.L_op_invoke_virtual_range_quick: /* 0xea */
7017/* File: arm/op_invoke_virtual_range_quick.S */
7018/* File: arm/invoke.S */
7019    /*
7020     * Generic invoke handler wrapper.
7021     */
7022    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7023    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7024    .extern MterpInvokeVirtualQuickRange
7025    EXPORT_PC
7026    mov     r0, rSELF
7027    add     r1, rFP, #OFF_FP_SHADOWFRAME
7028    mov     r2, rPC
7029    mov     r3, rINST
7030    bl      MterpInvokeVirtualQuickRange
7031    cmp     r0, #0
7032    beq     MterpException
7033    FETCH_ADVANCE_INST 3
7034    bl      MterpShouldSwitchInterpreters
7035    cmp     r0, #0
7036    bne     MterpFallback
7037    GET_INST_OPCODE ip
7038    GOTO_OPCODE ip
7039
7040
7041
7042/* ------------------------------ */
7043    .balign 128
7044.L_op_iput_boolean_quick: /* 0xeb */
7045/* File: arm/op_iput_boolean_quick.S */
7046/* File: arm/op_iput_quick.S */
7047    /* For: iput-quick, iput-object-quick */
7048    /* op vA, vB, offset@CCCC */
7049    mov     r2, rINST, lsr #12          @ r2<- B
7050    FETCH r1, 1                         @ r1<- field byte offset
7051    GET_VREG r3, r2                     @ r3<- fp[B], the object pointer
7052    ubfx    r2, rINST, #8, #4           @ r2<- A
7053    cmp     r3, #0                      @ check object for null
7054    beq     common_errNullObject        @ object was null
7055    GET_VREG r0, r2                     @ r0<- fp[A]
7056    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
7057    strb     r0, [r3, r1]             @ obj.field<- r0
7058    GET_INST_OPCODE ip                  @ extract opcode from rINST
7059    GOTO_OPCODE ip                      @ jump to next instruction
7060
7061
7062/* ------------------------------ */
7063    .balign 128
7064.L_op_iput_byte_quick: /* 0xec */
7065/* File: arm/op_iput_byte_quick.S */
7066/* File: arm/op_iput_quick.S */
7067    /* For: iput-quick, iput-object-quick */
7068    /* op vA, vB, offset@CCCC */
7069    mov     r2, rINST, lsr #12          @ r2<- B
7070    FETCH r1, 1                         @ r1<- field byte offset
7071    GET_VREG r3, r2                     @ r3<- fp[B], the object pointer
7072    ubfx    r2, rINST, #8, #4           @ r2<- A
7073    cmp     r3, #0                      @ check object for null
7074    beq     common_errNullObject        @ object was null
7075    GET_VREG r0, r2                     @ r0<- fp[A]
7076    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
7077    strb     r0, [r3, r1]             @ obj.field<- r0
7078    GET_INST_OPCODE ip                  @ extract opcode from rINST
7079    GOTO_OPCODE ip                      @ jump to next instruction
7080
7081
7082/* ------------------------------ */
7083    .balign 128
7084.L_op_iput_char_quick: /* 0xed */
7085/* File: arm/op_iput_char_quick.S */
7086/* File: arm/op_iput_quick.S */
7087    /* For: iput-quick, iput-object-quick */
7088    /* op vA, vB, offset@CCCC */
7089    mov     r2, rINST, lsr #12          @ r2<- B
7090    FETCH r1, 1                         @ r1<- field byte offset
7091    GET_VREG r3, r2                     @ r3<- fp[B], the object pointer
7092    ubfx    r2, rINST, #8, #4           @ r2<- A
7093    cmp     r3, #0                      @ check object for null
7094    beq     common_errNullObject        @ object was null
7095    GET_VREG r0, r2                     @ r0<- fp[A]
7096    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
7097    strh     r0, [r3, r1]             @ obj.field<- r0
7098    GET_INST_OPCODE ip                  @ extract opcode from rINST
7099    GOTO_OPCODE ip                      @ jump to next instruction
7100
7101
7102/* ------------------------------ */
7103    .balign 128
7104.L_op_iput_short_quick: /* 0xee */
7105/* File: arm/op_iput_short_quick.S */
7106/* File: arm/op_iput_quick.S */
7107    /* For: iput-quick, iput-object-quick */
7108    /* op vA, vB, offset@CCCC */
7109    mov     r2, rINST, lsr #12          @ r2<- B
7110    FETCH r1, 1                         @ r1<- field byte offset
7111    GET_VREG r3, r2                     @ r3<- fp[B], the object pointer
7112    ubfx    r2, rINST, #8, #4           @ r2<- A
7113    cmp     r3, #0                      @ check object for null
7114    beq     common_errNullObject        @ object was null
7115    GET_VREG r0, r2                     @ r0<- fp[A]
7116    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
7117    strh     r0, [r3, r1]             @ obj.field<- r0
7118    GET_INST_OPCODE ip                  @ extract opcode from rINST
7119    GOTO_OPCODE ip                      @ jump to next instruction
7120
7121
7122/* ------------------------------ */
7123    .balign 128
7124.L_op_iget_boolean_quick: /* 0xef */
7125/* File: arm/op_iget_boolean_quick.S */
7126/* File: arm/op_iget_quick.S */
7127    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7128    /* op vA, vB, offset@CCCC */
7129    mov     r2, rINST, lsr #12          @ r2<- B
7130    FETCH r1, 1                         @ r1<- field byte offset
7131    GET_VREG r3, r2                     @ r3<- object we're operating on
7132    ubfx    r2, rINST, #8, #4           @ r2<- A
7133    cmp     r3, #0                      @ check object for null
7134    beq     common_errNullObject        @ object was null
7135    ldrb   r0, [r3, r1]                @ r0<- obj.field
7136    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
7137    SET_VREG r0, r2                     @ fp[A]<- r0
7138    GET_INST_OPCODE ip                  @ extract opcode from rINST
7139    GOTO_OPCODE ip                      @ jump to next instruction
7140
7141
7142/* ------------------------------ */
7143    .balign 128
7144.L_op_iget_byte_quick: /* 0xf0 */
7145/* File: arm/op_iget_byte_quick.S */
7146/* File: arm/op_iget_quick.S */
7147    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7148    /* op vA, vB, offset@CCCC */
7149    mov     r2, rINST, lsr #12          @ r2<- B
7150    FETCH r1, 1                         @ r1<- field byte offset
7151    GET_VREG r3, r2                     @ r3<- object we're operating on
7152    ubfx    r2, rINST, #8, #4           @ r2<- A
7153    cmp     r3, #0                      @ check object for null
7154    beq     common_errNullObject        @ object was null
7155    ldrsb   r0, [r3, r1]                @ r0<- obj.field
7156    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
7157    SET_VREG r0, r2                     @ fp[A]<- r0
7158    GET_INST_OPCODE ip                  @ extract opcode from rINST
7159    GOTO_OPCODE ip                      @ jump to next instruction
7160
7161
7162/* ------------------------------ */
7163    .balign 128
7164.L_op_iget_char_quick: /* 0xf1 */
7165/* File: arm/op_iget_char_quick.S */
7166/* File: arm/op_iget_quick.S */
7167    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7168    /* op vA, vB, offset@CCCC */
7169    mov     r2, rINST, lsr #12          @ r2<- B
7170    FETCH r1, 1                         @ r1<- field byte offset
7171    GET_VREG r3, r2                     @ r3<- object we're operating on
7172    ubfx    r2, rINST, #8, #4           @ r2<- A
7173    cmp     r3, #0                      @ check object for null
7174    beq     common_errNullObject        @ object was null
7175    ldrh   r0, [r3, r1]                @ r0<- obj.field
7176    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
7177    SET_VREG r0, r2                     @ fp[A]<- r0
7178    GET_INST_OPCODE ip                  @ extract opcode from rINST
7179    GOTO_OPCODE ip                      @ jump to next instruction
7180
7181
7182/* ------------------------------ */
7183    .balign 128
7184.L_op_iget_short_quick: /* 0xf2 */
7185/* File: arm/op_iget_short_quick.S */
7186/* File: arm/op_iget_quick.S */
7187    /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
7188    /* op vA, vB, offset@CCCC */
7189    mov     r2, rINST, lsr #12          @ r2<- B
7190    FETCH r1, 1                         @ r1<- field byte offset
7191    GET_VREG r3, r2                     @ r3<- object we're operating on
7192    ubfx    r2, rINST, #8, #4           @ r2<- A
7193    cmp     r3, #0                      @ check object for null
7194    beq     common_errNullObject        @ object was null
7195    ldrsh   r0, [r3, r1]                @ r0<- obj.field
7196    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
7197    SET_VREG r0, r2                     @ fp[A]<- r0
7198    GET_INST_OPCODE ip                  @ extract opcode from rINST
7199    GOTO_OPCODE ip                      @ jump to next instruction
7200
7201
7202/* ------------------------------ */
7203    .balign 128
7204.L_op_invoke_lambda: /* 0xf3 */
7205/* Transfer stub to alternate interpreter */
7206    b    MterpFallback
7207
7208
7209/* ------------------------------ */
7210    .balign 128
7211.L_op_unused_f4: /* 0xf4 */
7212/* File: arm/op_unused_f4.S */
7213/* File: arm/unused.S */
7214/*
7215 * Bail to reference interpreter to throw.
7216 */
7217  b MterpFallback
7218
7219
7220/* ------------------------------ */
7221    .balign 128
7222.L_op_capture_variable: /* 0xf5 */
7223/* Transfer stub to alternate interpreter */
7224    b    MterpFallback
7225
7226
7227/* ------------------------------ */
7228    .balign 128
7229.L_op_create_lambda: /* 0xf6 */
7230/* Transfer stub to alternate interpreter */
7231    b    MterpFallback
7232
7233
7234/* ------------------------------ */
7235    .balign 128
7236.L_op_liberate_variable: /* 0xf7 */
7237/* Transfer stub to alternate interpreter */
7238    b    MterpFallback
7239
7240
7241/* ------------------------------ */
7242    .balign 128
7243.L_op_box_lambda: /* 0xf8 */
7244/* Transfer stub to alternate interpreter */
7245    b    MterpFallback
7246
7247
7248/* ------------------------------ */
7249    .balign 128
7250.L_op_unbox_lambda: /* 0xf9 */
7251/* Transfer stub to alternate interpreter */
7252    b    MterpFallback
7253
7254
7255/* ------------------------------ */
7256    .balign 128
7257.L_op_unused_fa: /* 0xfa */
7258/* File: arm/op_unused_fa.S */
7259/* File: arm/unused.S */
7260/*
7261 * Bail to reference interpreter to throw.
7262 */
7263  b MterpFallback
7264
7265
7266/* ------------------------------ */
7267    .balign 128
7268.L_op_unused_fb: /* 0xfb */
7269/* File: arm/op_unused_fb.S */
7270/* File: arm/unused.S */
7271/*
7272 * Bail to reference interpreter to throw.
7273 */
7274  b MterpFallback
7275
7276
7277/* ------------------------------ */
7278    .balign 128
7279.L_op_unused_fc: /* 0xfc */
7280/* File: arm/op_unused_fc.S */
7281/* File: arm/unused.S */
7282/*
7283 * Bail to reference interpreter to throw.
7284 */
7285  b MterpFallback
7286
7287
7288/* ------------------------------ */
7289    .balign 128
7290.L_op_unused_fd: /* 0xfd */
7291/* File: arm/op_unused_fd.S */
7292/* File: arm/unused.S */
7293/*
7294 * Bail to reference interpreter to throw.
7295 */
7296  b MterpFallback
7297
7298
7299/* ------------------------------ */
7300    .balign 128
7301.L_op_unused_fe: /* 0xfe */
7302/* File: arm/op_unused_fe.S */
7303/* File: arm/unused.S */
7304/*
7305 * Bail to reference interpreter to throw.
7306 */
7307  b MterpFallback
7308
7309
7310/* ------------------------------ */
7311    .balign 128
7312.L_op_unused_ff: /* 0xff */
7313/* File: arm/op_unused_ff.S */
7314/* File: arm/unused.S */
7315/*
7316 * Bail to reference interpreter to throw.
7317 */
7318  b MterpFallback
7319
7320
7321    .balign 128
7322    .size   artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7323    .global artMterpAsmInstructionEnd
7324artMterpAsmInstructionEnd:
7325
7326/*
7327 * ===========================================================================
7328 *  Sister implementations
7329 * ===========================================================================
7330 */
7331    .global artMterpAsmSisterStart
7332    .type   artMterpAsmSisterStart, %function
7333    .text
7334    .balign 4
7335artMterpAsmSisterStart:
7336
7337/* continuation for op_float_to_long */
7338/*
7339 * Convert the float in r0 to a long in r0/r1.
7340 *
7341 * We have to clip values to long min/max per the specification.  The
7342 * expected common case is a "reasonable" value that converts directly
7343 * to modest integer.  The EABI convert function isn't doing this for us.
7344 */
7345f2l_doconv:
7346    stmfd   sp!, {r4, lr}
7347    mov     r1, #0x5f000000             @ (float)maxlong
7348    mov     r4, r0
7349    bl      __aeabi_fcmpge              @ is arg >= maxlong?
7350    cmp     r0, #0                      @ nonzero == yes
7351    mvnne   r0, #0                      @ return maxlong (7fffffff)
7352    mvnne   r1, #0x80000000
7353    popne   {r4, pc}
7354
7355    mov     r0, r4                      @ recover arg
7356    mov     r1, #0xdf000000             @ (float)minlong
7357    bl      __aeabi_fcmple              @ is arg <= minlong?
7358    cmp     r0, #0                      @ nonzero == yes
7359    movne   r0, #0                      @ return minlong (80000000)
7360    movne   r1, #0x80000000
7361    popne   {r4, pc}
7362
7363    mov     r0, r4                      @ recover arg
7364    mov     r1, r4
7365    bl      __aeabi_fcmpeq              @ is arg == self?
7366    cmp     r0, #0                      @ zero == no
7367    moveq   r1, #0                      @ return zero for NaN
7368    popeq   {r4, pc}
7369
7370    mov     r0, r4                      @ recover arg
7371    bl      __aeabi_f2lz                @ convert float to long
7372    ldmfd   sp!, {r4, pc}
7373
7374/* continuation for op_double_to_long */
7375/*
7376 * Convert the double in r0/r1 to a long in r0/r1.
7377 *
7378 * We have to clip values to long min/max per the specification.  The
7379 * expected common case is a "reasonable" value that converts directly
7380 * to modest integer.  The EABI convert function isn't doing this for us.
7381 */
7382d2l_doconv:
7383    stmfd   sp!, {r4, r5, lr}           @ save regs
7384    mov     r3, #0x43000000             @ maxlong, as a double (high word)
7385    add     r3, #0x00e00000             @  0x43e00000
7386    mov     r2, #0                      @ maxlong, as a double (low word)
7387    sub     sp, sp, #4                  @ align for EABI
7388    mov     r4, r0                      @ save a copy of r0
7389    mov     r5, r1                      @  and r1
7390    bl      __aeabi_dcmpge              @ is arg >= maxlong?
7391    cmp     r0, #0                      @ nonzero == yes
7392    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
7393    mvnne   r1, #0x80000000
7394    bne     1f
7395
7396    mov     r0, r4                      @ recover arg
7397    mov     r1, r5
7398    mov     r3, #0xc3000000             @ minlong, as a double (high word)
7399    add     r3, #0x00e00000             @  0xc3e00000
7400    mov     r2, #0                      @ minlong, as a double (low word)
7401    bl      __aeabi_dcmple              @ is arg <= minlong?
7402    cmp     r0, #0                      @ nonzero == yes
7403    movne   r0, #0                      @ return minlong (8000000000000000)
7404    movne   r1, #0x80000000
7405    bne     1f
7406
7407    mov     r0, r4                      @ recover arg
7408    mov     r1, r5
7409    mov     r2, r4                      @ compare against self
7410    mov     r3, r5
7411    bl      __aeabi_dcmpeq              @ is arg == self?
7412    cmp     r0, #0                      @ zero == no
7413    moveq   r1, #0                      @ return zero for NaN
7414    beq     1f
7415
7416    mov     r0, r4                      @ recover arg
7417    mov     r1, r5
7418    bl      __aeabi_d2lz                @ convert double to long
7419
74201:
7421    add     sp, sp, #4
7422    ldmfd   sp!, {r4, r5, pc}
7423
7424    .size   artMterpAsmSisterStart, .-artMterpAsmSisterStart
7425    .global artMterpAsmSisterEnd
7426artMterpAsmSisterEnd:
7427
7428
7429    .global artMterpAsmAltInstructionStart
7430    .type   artMterpAsmAltInstructionStart, %function
7431    .text
7432
7433artMterpAsmAltInstructionStart = .L_ALT_op_nop
7434/* ------------------------------ */
7435    .balign 128
7436.L_ALT_op_nop: /* 0x00 */
7437/* File: arm/alt_stub.S */
7438/*
7439 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7440 * any interesting requests and then jump to the real instruction
7441 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7442 */
7443    .extern MterpCheckBefore
7444    EXPORT_PC
7445    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7446    adrl   lr, artMterpAsmInstructionStart + (0 * 128)       @ Addr of primary handler.
7447    mov    r0, rSELF
7448    add    r1, rFP, #OFF_FP_SHADOWFRAME
7449    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7450
7451/* ------------------------------ */
7452    .balign 128
7453.L_ALT_op_move: /* 0x01 */
7454/* File: arm/alt_stub.S */
7455/*
7456 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7457 * any interesting requests and then jump to the real instruction
7458 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7459 */
7460    .extern MterpCheckBefore
7461    EXPORT_PC
7462    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7463    adrl   lr, artMterpAsmInstructionStart + (1 * 128)       @ Addr of primary handler.
7464    mov    r0, rSELF
7465    add    r1, rFP, #OFF_FP_SHADOWFRAME
7466    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7467
7468/* ------------------------------ */
7469    .balign 128
7470.L_ALT_op_move_from16: /* 0x02 */
7471/* File: arm/alt_stub.S */
7472/*
7473 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7474 * any interesting requests and then jump to the real instruction
7475 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7476 */
7477    .extern MterpCheckBefore
7478    EXPORT_PC
7479    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7480    adrl   lr, artMterpAsmInstructionStart + (2 * 128)       @ Addr of primary handler.
7481    mov    r0, rSELF
7482    add    r1, rFP, #OFF_FP_SHADOWFRAME
7483    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7484
7485/* ------------------------------ */
7486    .balign 128
7487.L_ALT_op_move_16: /* 0x03 */
7488/* File: arm/alt_stub.S */
7489/*
7490 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7491 * any interesting requests and then jump to the real instruction
7492 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7493 */
7494    .extern MterpCheckBefore
7495    EXPORT_PC
7496    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7497    adrl   lr, artMterpAsmInstructionStart + (3 * 128)       @ Addr of primary handler.
7498    mov    r0, rSELF
7499    add    r1, rFP, #OFF_FP_SHADOWFRAME
7500    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7501
7502/* ------------------------------ */
7503    .balign 128
7504.L_ALT_op_move_wide: /* 0x04 */
7505/* File: arm/alt_stub.S */
7506/*
7507 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7508 * any interesting requests and then jump to the real instruction
7509 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7510 */
7511    .extern MterpCheckBefore
7512    EXPORT_PC
7513    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7514    adrl   lr, artMterpAsmInstructionStart + (4 * 128)       @ Addr of primary handler.
7515    mov    r0, rSELF
7516    add    r1, rFP, #OFF_FP_SHADOWFRAME
7517    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7518
7519/* ------------------------------ */
7520    .balign 128
7521.L_ALT_op_move_wide_from16: /* 0x05 */
7522/* File: arm/alt_stub.S */
7523/*
7524 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7525 * any interesting requests and then jump to the real instruction
7526 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7527 */
7528    .extern MterpCheckBefore
7529    EXPORT_PC
7530    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7531    adrl   lr, artMterpAsmInstructionStart + (5 * 128)       @ Addr of primary handler.
7532    mov    r0, rSELF
7533    add    r1, rFP, #OFF_FP_SHADOWFRAME
7534    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7535
7536/* ------------------------------ */
7537    .balign 128
7538.L_ALT_op_move_wide_16: /* 0x06 */
7539/* File: arm/alt_stub.S */
7540/*
7541 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7542 * any interesting requests and then jump to the real instruction
7543 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7544 */
7545    .extern MterpCheckBefore
7546    EXPORT_PC
7547    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7548    adrl   lr, artMterpAsmInstructionStart + (6 * 128)       @ Addr of primary handler.
7549    mov    r0, rSELF
7550    add    r1, rFP, #OFF_FP_SHADOWFRAME
7551    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7552
7553/* ------------------------------ */
7554    .balign 128
7555.L_ALT_op_move_object: /* 0x07 */
7556/* File: arm/alt_stub.S */
7557/*
7558 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7559 * any interesting requests and then jump to the real instruction
7560 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7561 */
7562    .extern MterpCheckBefore
7563    EXPORT_PC
7564    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7565    adrl   lr, artMterpAsmInstructionStart + (7 * 128)       @ Addr of primary handler.
7566    mov    r0, rSELF
7567    add    r1, rFP, #OFF_FP_SHADOWFRAME
7568    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7569
7570/* ------------------------------ */
7571    .balign 128
7572.L_ALT_op_move_object_from16: /* 0x08 */
7573/* File: arm/alt_stub.S */
7574/*
7575 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7576 * any interesting requests and then jump to the real instruction
7577 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7578 */
7579    .extern MterpCheckBefore
7580    EXPORT_PC
7581    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7582    adrl   lr, artMterpAsmInstructionStart + (8 * 128)       @ Addr of primary handler.
7583    mov    r0, rSELF
7584    add    r1, rFP, #OFF_FP_SHADOWFRAME
7585    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7586
7587/* ------------------------------ */
7588    .balign 128
7589.L_ALT_op_move_object_16: /* 0x09 */
7590/* File: arm/alt_stub.S */
7591/*
7592 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7593 * any interesting requests and then jump to the real instruction
7594 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7595 */
7596    .extern MterpCheckBefore
7597    EXPORT_PC
7598    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7599    adrl   lr, artMterpAsmInstructionStart + (9 * 128)       @ Addr of primary handler.
7600    mov    r0, rSELF
7601    add    r1, rFP, #OFF_FP_SHADOWFRAME
7602    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7603
7604/* ------------------------------ */
7605    .balign 128
7606.L_ALT_op_move_result: /* 0x0a */
7607/* File: arm/alt_stub.S */
7608/*
7609 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7610 * any interesting requests and then jump to the real instruction
7611 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7612 */
7613    .extern MterpCheckBefore
7614    EXPORT_PC
7615    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7616    adrl   lr, artMterpAsmInstructionStart + (10 * 128)       @ Addr of primary handler.
7617    mov    r0, rSELF
7618    add    r1, rFP, #OFF_FP_SHADOWFRAME
7619    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7620
7621/* ------------------------------ */
7622    .balign 128
7623.L_ALT_op_move_result_wide: /* 0x0b */
7624/* File: arm/alt_stub.S */
7625/*
7626 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7627 * any interesting requests and then jump to the real instruction
7628 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7629 */
7630    .extern MterpCheckBefore
7631    EXPORT_PC
7632    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7633    adrl   lr, artMterpAsmInstructionStart + (11 * 128)       @ Addr of primary handler.
7634    mov    r0, rSELF
7635    add    r1, rFP, #OFF_FP_SHADOWFRAME
7636    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7637
7638/* ------------------------------ */
7639    .balign 128
7640.L_ALT_op_move_result_object: /* 0x0c */
7641/* File: arm/alt_stub.S */
7642/*
7643 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7644 * any interesting requests and then jump to the real instruction
7645 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7646 */
7647    .extern MterpCheckBefore
7648    EXPORT_PC
7649    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7650    adrl   lr, artMterpAsmInstructionStart + (12 * 128)       @ Addr of primary handler.
7651    mov    r0, rSELF
7652    add    r1, rFP, #OFF_FP_SHADOWFRAME
7653    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7654
7655/* ------------------------------ */
7656    .balign 128
7657.L_ALT_op_move_exception: /* 0x0d */
7658/* File: arm/alt_stub.S */
7659/*
7660 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7661 * any interesting requests and then jump to the real instruction
7662 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7663 */
7664    .extern MterpCheckBefore
7665    EXPORT_PC
7666    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7667    adrl   lr, artMterpAsmInstructionStart + (13 * 128)       @ Addr of primary handler.
7668    mov    r0, rSELF
7669    add    r1, rFP, #OFF_FP_SHADOWFRAME
7670    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7671
7672/* ------------------------------ */
7673    .balign 128
7674.L_ALT_op_return_void: /* 0x0e */
7675/* File: arm/alt_stub.S */
7676/*
7677 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7678 * any interesting requests and then jump to the real instruction
7679 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7680 */
7681    .extern MterpCheckBefore
7682    EXPORT_PC
7683    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7684    adrl   lr, artMterpAsmInstructionStart + (14 * 128)       @ Addr of primary handler.
7685    mov    r0, rSELF
7686    add    r1, rFP, #OFF_FP_SHADOWFRAME
7687    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7688
7689/* ------------------------------ */
7690    .balign 128
7691.L_ALT_op_return: /* 0x0f */
7692/* File: arm/alt_stub.S */
7693/*
7694 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7695 * any interesting requests and then jump to the real instruction
7696 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7697 */
7698    .extern MterpCheckBefore
7699    EXPORT_PC
7700    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7701    adrl   lr, artMterpAsmInstructionStart + (15 * 128)       @ Addr of primary handler.
7702    mov    r0, rSELF
7703    add    r1, rFP, #OFF_FP_SHADOWFRAME
7704    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7705
7706/* ------------------------------ */
7707    .balign 128
7708.L_ALT_op_return_wide: /* 0x10 */
7709/* File: arm/alt_stub.S */
7710/*
7711 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7712 * any interesting requests and then jump to the real instruction
7713 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7714 */
7715    .extern MterpCheckBefore
7716    EXPORT_PC
7717    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7718    adrl   lr, artMterpAsmInstructionStart + (16 * 128)       @ Addr of primary handler.
7719    mov    r0, rSELF
7720    add    r1, rFP, #OFF_FP_SHADOWFRAME
7721    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7722
7723/* ------------------------------ */
7724    .balign 128
7725.L_ALT_op_return_object: /* 0x11 */
7726/* File: arm/alt_stub.S */
7727/*
7728 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7729 * any interesting requests and then jump to the real instruction
7730 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7731 */
7732    .extern MterpCheckBefore
7733    EXPORT_PC
7734    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7735    adrl   lr, artMterpAsmInstructionStart + (17 * 128)       @ Addr of primary handler.
7736    mov    r0, rSELF
7737    add    r1, rFP, #OFF_FP_SHADOWFRAME
7738    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7739
7740/* ------------------------------ */
7741    .balign 128
7742.L_ALT_op_const_4: /* 0x12 */
7743/* File: arm/alt_stub.S */
7744/*
7745 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7746 * any interesting requests and then jump to the real instruction
7747 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7748 */
7749    .extern MterpCheckBefore
7750    EXPORT_PC
7751    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7752    adrl   lr, artMterpAsmInstructionStart + (18 * 128)       @ Addr of primary handler.
7753    mov    r0, rSELF
7754    add    r1, rFP, #OFF_FP_SHADOWFRAME
7755    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7756
7757/* ------------------------------ */
7758    .balign 128
7759.L_ALT_op_const_16: /* 0x13 */
7760/* File: arm/alt_stub.S */
7761/*
7762 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7763 * any interesting requests and then jump to the real instruction
7764 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7765 */
7766    .extern MterpCheckBefore
7767    EXPORT_PC
7768    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7769    adrl   lr, artMterpAsmInstructionStart + (19 * 128)       @ Addr of primary handler.
7770    mov    r0, rSELF
7771    add    r1, rFP, #OFF_FP_SHADOWFRAME
7772    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7773
7774/* ------------------------------ */
7775    .balign 128
7776.L_ALT_op_const: /* 0x14 */
7777/* File: arm/alt_stub.S */
7778/*
7779 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7780 * any interesting requests and then jump to the real instruction
7781 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7782 */
7783    .extern MterpCheckBefore
7784    EXPORT_PC
7785    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7786    adrl   lr, artMterpAsmInstructionStart + (20 * 128)       @ Addr of primary handler.
7787    mov    r0, rSELF
7788    add    r1, rFP, #OFF_FP_SHADOWFRAME
7789    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7790
7791/* ------------------------------ */
7792    .balign 128
7793.L_ALT_op_const_high16: /* 0x15 */
7794/* File: arm/alt_stub.S */
7795/*
7796 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7797 * any interesting requests and then jump to the real instruction
7798 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7799 */
7800    .extern MterpCheckBefore
7801    EXPORT_PC
7802    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7803    adrl   lr, artMterpAsmInstructionStart + (21 * 128)       @ Addr of primary handler.
7804    mov    r0, rSELF
7805    add    r1, rFP, #OFF_FP_SHADOWFRAME
7806    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7807
7808/* ------------------------------ */
7809    .balign 128
7810.L_ALT_op_const_wide_16: /* 0x16 */
7811/* File: arm/alt_stub.S */
7812/*
7813 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7814 * any interesting requests and then jump to the real instruction
7815 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7816 */
7817    .extern MterpCheckBefore
7818    EXPORT_PC
7819    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7820    adrl   lr, artMterpAsmInstructionStart + (22 * 128)       @ Addr of primary handler.
7821    mov    r0, rSELF
7822    add    r1, rFP, #OFF_FP_SHADOWFRAME
7823    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7824
7825/* ------------------------------ */
7826    .balign 128
7827.L_ALT_op_const_wide_32: /* 0x17 */
7828/* File: arm/alt_stub.S */
7829/*
7830 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7831 * any interesting requests and then jump to the real instruction
7832 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7833 */
7834    .extern MterpCheckBefore
7835    EXPORT_PC
7836    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7837    adrl   lr, artMterpAsmInstructionStart + (23 * 128)       @ Addr of primary handler.
7838    mov    r0, rSELF
7839    add    r1, rFP, #OFF_FP_SHADOWFRAME
7840    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7841
7842/* ------------------------------ */
7843    .balign 128
7844.L_ALT_op_const_wide: /* 0x18 */
7845/* File: arm/alt_stub.S */
7846/*
7847 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7848 * any interesting requests and then jump to the real instruction
7849 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7850 */
7851    .extern MterpCheckBefore
7852    EXPORT_PC
7853    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7854    adrl   lr, artMterpAsmInstructionStart + (24 * 128)       @ Addr of primary handler.
7855    mov    r0, rSELF
7856    add    r1, rFP, #OFF_FP_SHADOWFRAME
7857    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7858
7859/* ------------------------------ */
7860    .balign 128
7861.L_ALT_op_const_wide_high16: /* 0x19 */
7862/* File: arm/alt_stub.S */
7863/*
7864 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7865 * any interesting requests and then jump to the real instruction
7866 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7867 */
7868    .extern MterpCheckBefore
7869    EXPORT_PC
7870    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7871    adrl   lr, artMterpAsmInstructionStart + (25 * 128)       @ Addr of primary handler.
7872    mov    r0, rSELF
7873    add    r1, rFP, #OFF_FP_SHADOWFRAME
7874    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7875
7876/* ------------------------------ */
7877    .balign 128
7878.L_ALT_op_const_string: /* 0x1a */
7879/* File: arm/alt_stub.S */
7880/*
7881 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7882 * any interesting requests and then jump to the real instruction
7883 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7884 */
7885    .extern MterpCheckBefore
7886    EXPORT_PC
7887    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7888    adrl   lr, artMterpAsmInstructionStart + (26 * 128)       @ Addr of primary handler.
7889    mov    r0, rSELF
7890    add    r1, rFP, #OFF_FP_SHADOWFRAME
7891    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7892
7893/* ------------------------------ */
7894    .balign 128
7895.L_ALT_op_const_string_jumbo: /* 0x1b */
7896/* File: arm/alt_stub.S */
7897/*
7898 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7899 * any interesting requests and then jump to the real instruction
7900 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7901 */
7902    .extern MterpCheckBefore
7903    EXPORT_PC
7904    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7905    adrl   lr, artMterpAsmInstructionStart + (27 * 128)       @ Addr of primary handler.
7906    mov    r0, rSELF
7907    add    r1, rFP, #OFF_FP_SHADOWFRAME
7908    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7909
7910/* ------------------------------ */
7911    .balign 128
7912.L_ALT_op_const_class: /* 0x1c */
7913/* File: arm/alt_stub.S */
7914/*
7915 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7916 * any interesting requests and then jump to the real instruction
7917 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7918 */
7919    .extern MterpCheckBefore
7920    EXPORT_PC
7921    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7922    adrl   lr, artMterpAsmInstructionStart + (28 * 128)       @ Addr of primary handler.
7923    mov    r0, rSELF
7924    add    r1, rFP, #OFF_FP_SHADOWFRAME
7925    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7926
7927/* ------------------------------ */
7928    .balign 128
7929.L_ALT_op_monitor_enter: /* 0x1d */
7930/* File: arm/alt_stub.S */
7931/*
7932 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7933 * any interesting requests and then jump to the real instruction
7934 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7935 */
7936    .extern MterpCheckBefore
7937    EXPORT_PC
7938    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7939    adrl   lr, artMterpAsmInstructionStart + (29 * 128)       @ Addr of primary handler.
7940    mov    r0, rSELF
7941    add    r1, rFP, #OFF_FP_SHADOWFRAME
7942    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7943
7944/* ------------------------------ */
7945    .balign 128
7946.L_ALT_op_monitor_exit: /* 0x1e */
7947/* File: arm/alt_stub.S */
7948/*
7949 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7950 * any interesting requests and then jump to the real instruction
7951 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7952 */
7953    .extern MterpCheckBefore
7954    EXPORT_PC
7955    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7956    adrl   lr, artMterpAsmInstructionStart + (30 * 128)       @ Addr of primary handler.
7957    mov    r0, rSELF
7958    add    r1, rFP, #OFF_FP_SHADOWFRAME
7959    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7960
7961/* ------------------------------ */
7962    .balign 128
7963.L_ALT_op_check_cast: /* 0x1f */
7964/* File: arm/alt_stub.S */
7965/*
7966 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7967 * any interesting requests and then jump to the real instruction
7968 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7969 */
7970    .extern MterpCheckBefore
7971    EXPORT_PC
7972    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7973    adrl   lr, artMterpAsmInstructionStart + (31 * 128)       @ Addr of primary handler.
7974    mov    r0, rSELF
7975    add    r1, rFP, #OFF_FP_SHADOWFRAME
7976    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7977
7978/* ------------------------------ */
7979    .balign 128
7980.L_ALT_op_instance_of: /* 0x20 */
7981/* File: arm/alt_stub.S */
7982/*
7983 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
7984 * any interesting requests and then jump to the real instruction
7985 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
7986 */
7987    .extern MterpCheckBefore
7988    EXPORT_PC
7989    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
7990    adrl   lr, artMterpAsmInstructionStart + (32 * 128)       @ Addr of primary handler.
7991    mov    r0, rSELF
7992    add    r1, rFP, #OFF_FP_SHADOWFRAME
7993    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
7994
7995/* ------------------------------ */
7996    .balign 128
7997.L_ALT_op_array_length: /* 0x21 */
7998/* File: arm/alt_stub.S */
7999/*
8000 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8001 * any interesting requests and then jump to the real instruction
8002 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8003 */
8004    .extern MterpCheckBefore
8005    EXPORT_PC
8006    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8007    adrl   lr, artMterpAsmInstructionStart + (33 * 128)       @ Addr of primary handler.
8008    mov    r0, rSELF
8009    add    r1, rFP, #OFF_FP_SHADOWFRAME
8010    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8011
8012/* ------------------------------ */
8013    .balign 128
8014.L_ALT_op_new_instance: /* 0x22 */
8015/* File: arm/alt_stub.S */
8016/*
8017 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8018 * any interesting requests and then jump to the real instruction
8019 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8020 */
8021    .extern MterpCheckBefore
8022    EXPORT_PC
8023    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8024    adrl   lr, artMterpAsmInstructionStart + (34 * 128)       @ Addr of primary handler.
8025    mov    r0, rSELF
8026    add    r1, rFP, #OFF_FP_SHADOWFRAME
8027    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8028
8029/* ------------------------------ */
8030    .balign 128
8031.L_ALT_op_new_array: /* 0x23 */
8032/* File: arm/alt_stub.S */
8033/*
8034 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8035 * any interesting requests and then jump to the real instruction
8036 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8037 */
8038    .extern MterpCheckBefore
8039    EXPORT_PC
8040    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8041    adrl   lr, artMterpAsmInstructionStart + (35 * 128)       @ Addr of primary handler.
8042    mov    r0, rSELF
8043    add    r1, rFP, #OFF_FP_SHADOWFRAME
8044    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8045
8046/* ------------------------------ */
8047    .balign 128
8048.L_ALT_op_filled_new_array: /* 0x24 */
8049/* File: arm/alt_stub.S */
8050/*
8051 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8052 * any interesting requests and then jump to the real instruction
8053 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8054 */
8055    .extern MterpCheckBefore
8056    EXPORT_PC
8057    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8058    adrl   lr, artMterpAsmInstructionStart + (36 * 128)       @ Addr of primary handler.
8059    mov    r0, rSELF
8060    add    r1, rFP, #OFF_FP_SHADOWFRAME
8061    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8062
8063/* ------------------------------ */
8064    .balign 128
8065.L_ALT_op_filled_new_array_range: /* 0x25 */
8066/* File: arm/alt_stub.S */
8067/*
8068 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8069 * any interesting requests and then jump to the real instruction
8070 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8071 */
8072    .extern MterpCheckBefore
8073    EXPORT_PC
8074    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8075    adrl   lr, artMterpAsmInstructionStart + (37 * 128)       @ Addr of primary handler.
8076    mov    r0, rSELF
8077    add    r1, rFP, #OFF_FP_SHADOWFRAME
8078    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8079
8080/* ------------------------------ */
8081    .balign 128
8082.L_ALT_op_fill_array_data: /* 0x26 */
8083/* File: arm/alt_stub.S */
8084/*
8085 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8086 * any interesting requests and then jump to the real instruction
8087 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8088 */
8089    .extern MterpCheckBefore
8090    EXPORT_PC
8091    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8092    adrl   lr, artMterpAsmInstructionStart + (38 * 128)       @ Addr of primary handler.
8093    mov    r0, rSELF
8094    add    r1, rFP, #OFF_FP_SHADOWFRAME
8095    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8096
8097/* ------------------------------ */
8098    .balign 128
8099.L_ALT_op_throw: /* 0x27 */
8100/* File: arm/alt_stub.S */
8101/*
8102 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8103 * any interesting requests and then jump to the real instruction
8104 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8105 */
8106    .extern MterpCheckBefore
8107    EXPORT_PC
8108    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8109    adrl   lr, artMterpAsmInstructionStart + (39 * 128)       @ Addr of primary handler.
8110    mov    r0, rSELF
8111    add    r1, rFP, #OFF_FP_SHADOWFRAME
8112    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8113
8114/* ------------------------------ */
8115    .balign 128
8116.L_ALT_op_goto: /* 0x28 */
8117/* File: arm/alt_stub.S */
8118/*
8119 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8120 * any interesting requests and then jump to the real instruction
8121 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8122 */
8123    .extern MterpCheckBefore
8124    EXPORT_PC
8125    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8126    adrl   lr, artMterpAsmInstructionStart + (40 * 128)       @ Addr of primary handler.
8127    mov    r0, rSELF
8128    add    r1, rFP, #OFF_FP_SHADOWFRAME
8129    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8130
8131/* ------------------------------ */
8132    .balign 128
8133.L_ALT_op_goto_16: /* 0x29 */
8134/* File: arm/alt_stub.S */
8135/*
8136 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8137 * any interesting requests and then jump to the real instruction
8138 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8139 */
8140    .extern MterpCheckBefore
8141    EXPORT_PC
8142    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8143    adrl   lr, artMterpAsmInstructionStart + (41 * 128)       @ Addr of primary handler.
8144    mov    r0, rSELF
8145    add    r1, rFP, #OFF_FP_SHADOWFRAME
8146    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8147
8148/* ------------------------------ */
8149    .balign 128
8150.L_ALT_op_goto_32: /* 0x2a */
8151/* File: arm/alt_stub.S */
8152/*
8153 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8154 * any interesting requests and then jump to the real instruction
8155 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8156 */
8157    .extern MterpCheckBefore
8158    EXPORT_PC
8159    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8160    adrl   lr, artMterpAsmInstructionStart + (42 * 128)       @ Addr of primary handler.
8161    mov    r0, rSELF
8162    add    r1, rFP, #OFF_FP_SHADOWFRAME
8163    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8164
8165/* ------------------------------ */
8166    .balign 128
8167.L_ALT_op_packed_switch: /* 0x2b */
8168/* File: arm/alt_stub.S */
8169/*
8170 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8171 * any interesting requests and then jump to the real instruction
8172 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8173 */
8174    .extern MterpCheckBefore
8175    EXPORT_PC
8176    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8177    adrl   lr, artMterpAsmInstructionStart + (43 * 128)       @ Addr of primary handler.
8178    mov    r0, rSELF
8179    add    r1, rFP, #OFF_FP_SHADOWFRAME
8180    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8181
8182/* ------------------------------ */
8183    .balign 128
8184.L_ALT_op_sparse_switch: /* 0x2c */
8185/* File: arm/alt_stub.S */
8186/*
8187 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8188 * any interesting requests and then jump to the real instruction
8189 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8190 */
8191    .extern MterpCheckBefore
8192    EXPORT_PC
8193    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8194    adrl   lr, artMterpAsmInstructionStart + (44 * 128)       @ Addr of primary handler.
8195    mov    r0, rSELF
8196    add    r1, rFP, #OFF_FP_SHADOWFRAME
8197    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8198
8199/* ------------------------------ */
8200    .balign 128
8201.L_ALT_op_cmpl_float: /* 0x2d */
8202/* File: arm/alt_stub.S */
8203/*
8204 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8205 * any interesting requests and then jump to the real instruction
8206 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8207 */
8208    .extern MterpCheckBefore
8209    EXPORT_PC
8210    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8211    adrl   lr, artMterpAsmInstructionStart + (45 * 128)       @ Addr of primary handler.
8212    mov    r0, rSELF
8213    add    r1, rFP, #OFF_FP_SHADOWFRAME
8214    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8215
8216/* ------------------------------ */
8217    .balign 128
8218.L_ALT_op_cmpg_float: /* 0x2e */
8219/* File: arm/alt_stub.S */
8220/*
8221 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8222 * any interesting requests and then jump to the real instruction
8223 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8224 */
8225    .extern MterpCheckBefore
8226    EXPORT_PC
8227    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8228    adrl   lr, artMterpAsmInstructionStart + (46 * 128)       @ Addr of primary handler.
8229    mov    r0, rSELF
8230    add    r1, rFP, #OFF_FP_SHADOWFRAME
8231    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8232
8233/* ------------------------------ */
8234    .balign 128
8235.L_ALT_op_cmpl_double: /* 0x2f */
8236/* File: arm/alt_stub.S */
8237/*
8238 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8239 * any interesting requests and then jump to the real instruction
8240 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8241 */
8242    .extern MterpCheckBefore
8243    EXPORT_PC
8244    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8245    adrl   lr, artMterpAsmInstructionStart + (47 * 128)       @ Addr of primary handler.
8246    mov    r0, rSELF
8247    add    r1, rFP, #OFF_FP_SHADOWFRAME
8248    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8249
8250/* ------------------------------ */
8251    .balign 128
8252.L_ALT_op_cmpg_double: /* 0x30 */
8253/* File: arm/alt_stub.S */
8254/*
8255 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8256 * any interesting requests and then jump to the real instruction
8257 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8258 */
8259    .extern MterpCheckBefore
8260    EXPORT_PC
8261    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8262    adrl   lr, artMterpAsmInstructionStart + (48 * 128)       @ Addr of primary handler.
8263    mov    r0, rSELF
8264    add    r1, rFP, #OFF_FP_SHADOWFRAME
8265    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8266
8267/* ------------------------------ */
8268    .balign 128
8269.L_ALT_op_cmp_long: /* 0x31 */
8270/* File: arm/alt_stub.S */
8271/*
8272 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8273 * any interesting requests and then jump to the real instruction
8274 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8275 */
8276    .extern MterpCheckBefore
8277    EXPORT_PC
8278    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8279    adrl   lr, artMterpAsmInstructionStart + (49 * 128)       @ Addr of primary handler.
8280    mov    r0, rSELF
8281    add    r1, rFP, #OFF_FP_SHADOWFRAME
8282    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8283
8284/* ------------------------------ */
8285    .balign 128
8286.L_ALT_op_if_eq: /* 0x32 */
8287/* File: arm/alt_stub.S */
8288/*
8289 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8290 * any interesting requests and then jump to the real instruction
8291 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8292 */
8293    .extern MterpCheckBefore
8294    EXPORT_PC
8295    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8296    adrl   lr, artMterpAsmInstructionStart + (50 * 128)       @ Addr of primary handler.
8297    mov    r0, rSELF
8298    add    r1, rFP, #OFF_FP_SHADOWFRAME
8299    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8300
8301/* ------------------------------ */
8302    .balign 128
8303.L_ALT_op_if_ne: /* 0x33 */
8304/* File: arm/alt_stub.S */
8305/*
8306 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8307 * any interesting requests and then jump to the real instruction
8308 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8309 */
8310    .extern MterpCheckBefore
8311    EXPORT_PC
8312    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8313    adrl   lr, artMterpAsmInstructionStart + (51 * 128)       @ Addr of primary handler.
8314    mov    r0, rSELF
8315    add    r1, rFP, #OFF_FP_SHADOWFRAME
8316    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8317
8318/* ------------------------------ */
8319    .balign 128
8320.L_ALT_op_if_lt: /* 0x34 */
8321/* File: arm/alt_stub.S */
8322/*
8323 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8324 * any interesting requests and then jump to the real instruction
8325 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8326 */
8327    .extern MterpCheckBefore
8328    EXPORT_PC
8329    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8330    adrl   lr, artMterpAsmInstructionStart + (52 * 128)       @ Addr of primary handler.
8331    mov    r0, rSELF
8332    add    r1, rFP, #OFF_FP_SHADOWFRAME
8333    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8334
8335/* ------------------------------ */
8336    .balign 128
8337.L_ALT_op_if_ge: /* 0x35 */
8338/* File: arm/alt_stub.S */
8339/*
8340 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8341 * any interesting requests and then jump to the real instruction
8342 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8343 */
8344    .extern MterpCheckBefore
8345    EXPORT_PC
8346    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8347    adrl   lr, artMterpAsmInstructionStart + (53 * 128)       @ Addr of primary handler.
8348    mov    r0, rSELF
8349    add    r1, rFP, #OFF_FP_SHADOWFRAME
8350    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8351
8352/* ------------------------------ */
8353    .balign 128
8354.L_ALT_op_if_gt: /* 0x36 */
8355/* File: arm/alt_stub.S */
8356/*
8357 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8358 * any interesting requests and then jump to the real instruction
8359 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8360 */
8361    .extern MterpCheckBefore
8362    EXPORT_PC
8363    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8364    adrl   lr, artMterpAsmInstructionStart + (54 * 128)       @ Addr of primary handler.
8365    mov    r0, rSELF
8366    add    r1, rFP, #OFF_FP_SHADOWFRAME
8367    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8368
8369/* ------------------------------ */
8370    .balign 128
8371.L_ALT_op_if_le: /* 0x37 */
8372/* File: arm/alt_stub.S */
8373/*
8374 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8375 * any interesting requests and then jump to the real instruction
8376 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8377 */
8378    .extern MterpCheckBefore
8379    EXPORT_PC
8380    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8381    adrl   lr, artMterpAsmInstructionStart + (55 * 128)       @ Addr of primary handler.
8382    mov    r0, rSELF
8383    add    r1, rFP, #OFF_FP_SHADOWFRAME
8384    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8385
8386/* ------------------------------ */
8387    .balign 128
8388.L_ALT_op_if_eqz: /* 0x38 */
8389/* File: arm/alt_stub.S */
8390/*
8391 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8392 * any interesting requests and then jump to the real instruction
8393 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8394 */
8395    .extern MterpCheckBefore
8396    EXPORT_PC
8397    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8398    adrl   lr, artMterpAsmInstructionStart + (56 * 128)       @ Addr of primary handler.
8399    mov    r0, rSELF
8400    add    r1, rFP, #OFF_FP_SHADOWFRAME
8401    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8402
8403/* ------------------------------ */
8404    .balign 128
8405.L_ALT_op_if_nez: /* 0x39 */
8406/* File: arm/alt_stub.S */
8407/*
8408 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8409 * any interesting requests and then jump to the real instruction
8410 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8411 */
8412    .extern MterpCheckBefore
8413    EXPORT_PC
8414    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8415    adrl   lr, artMterpAsmInstructionStart + (57 * 128)       @ Addr of primary handler.
8416    mov    r0, rSELF
8417    add    r1, rFP, #OFF_FP_SHADOWFRAME
8418    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8419
8420/* ------------------------------ */
8421    .balign 128
8422.L_ALT_op_if_ltz: /* 0x3a */
8423/* File: arm/alt_stub.S */
8424/*
8425 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8426 * any interesting requests and then jump to the real instruction
8427 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8428 */
8429    .extern MterpCheckBefore
8430    EXPORT_PC
8431    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8432    adrl   lr, artMterpAsmInstructionStart + (58 * 128)       @ Addr of primary handler.
8433    mov    r0, rSELF
8434    add    r1, rFP, #OFF_FP_SHADOWFRAME
8435    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8436
8437/* ------------------------------ */
8438    .balign 128
8439.L_ALT_op_if_gez: /* 0x3b */
8440/* File: arm/alt_stub.S */
8441/*
8442 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8443 * any interesting requests and then jump to the real instruction
8444 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8445 */
8446    .extern MterpCheckBefore
8447    EXPORT_PC
8448    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8449    adrl   lr, artMterpAsmInstructionStart + (59 * 128)       @ Addr of primary handler.
8450    mov    r0, rSELF
8451    add    r1, rFP, #OFF_FP_SHADOWFRAME
8452    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8453
8454/* ------------------------------ */
8455    .balign 128
8456.L_ALT_op_if_gtz: /* 0x3c */
8457/* File: arm/alt_stub.S */
8458/*
8459 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8460 * any interesting requests and then jump to the real instruction
8461 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8462 */
8463    .extern MterpCheckBefore
8464    EXPORT_PC
8465    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8466    adrl   lr, artMterpAsmInstructionStart + (60 * 128)       @ Addr of primary handler.
8467    mov    r0, rSELF
8468    add    r1, rFP, #OFF_FP_SHADOWFRAME
8469    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8470
8471/* ------------------------------ */
8472    .balign 128
8473.L_ALT_op_if_lez: /* 0x3d */
8474/* File: arm/alt_stub.S */
8475/*
8476 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8477 * any interesting requests and then jump to the real instruction
8478 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8479 */
8480    .extern MterpCheckBefore
8481    EXPORT_PC
8482    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8483    adrl   lr, artMterpAsmInstructionStart + (61 * 128)       @ Addr of primary handler.
8484    mov    r0, rSELF
8485    add    r1, rFP, #OFF_FP_SHADOWFRAME
8486    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8487
8488/* ------------------------------ */
8489    .balign 128
8490.L_ALT_op_unused_3e: /* 0x3e */
8491/* File: arm/alt_stub.S */
8492/*
8493 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8494 * any interesting requests and then jump to the real instruction
8495 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8496 */
8497    .extern MterpCheckBefore
8498    EXPORT_PC
8499    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8500    adrl   lr, artMterpAsmInstructionStart + (62 * 128)       @ Addr of primary handler.
8501    mov    r0, rSELF
8502    add    r1, rFP, #OFF_FP_SHADOWFRAME
8503    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8504
8505/* ------------------------------ */
8506    .balign 128
8507.L_ALT_op_unused_3f: /* 0x3f */
8508/* File: arm/alt_stub.S */
8509/*
8510 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8511 * any interesting requests and then jump to the real instruction
8512 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8513 */
8514    .extern MterpCheckBefore
8515    EXPORT_PC
8516    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8517    adrl   lr, artMterpAsmInstructionStart + (63 * 128)       @ Addr of primary handler.
8518    mov    r0, rSELF
8519    add    r1, rFP, #OFF_FP_SHADOWFRAME
8520    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8521
8522/* ------------------------------ */
8523    .balign 128
8524.L_ALT_op_unused_40: /* 0x40 */
8525/* File: arm/alt_stub.S */
8526/*
8527 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8528 * any interesting requests and then jump to the real instruction
8529 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8530 */
8531    .extern MterpCheckBefore
8532    EXPORT_PC
8533    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8534    adrl   lr, artMterpAsmInstructionStart + (64 * 128)       @ Addr of primary handler.
8535    mov    r0, rSELF
8536    add    r1, rFP, #OFF_FP_SHADOWFRAME
8537    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8538
8539/* ------------------------------ */
8540    .balign 128
8541.L_ALT_op_unused_41: /* 0x41 */
8542/* File: arm/alt_stub.S */
8543/*
8544 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8545 * any interesting requests and then jump to the real instruction
8546 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8547 */
8548    .extern MterpCheckBefore
8549    EXPORT_PC
8550    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8551    adrl   lr, artMterpAsmInstructionStart + (65 * 128)       @ Addr of primary handler.
8552    mov    r0, rSELF
8553    add    r1, rFP, #OFF_FP_SHADOWFRAME
8554    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8555
8556/* ------------------------------ */
8557    .balign 128
8558.L_ALT_op_unused_42: /* 0x42 */
8559/* File: arm/alt_stub.S */
8560/*
8561 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8562 * any interesting requests and then jump to the real instruction
8563 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8564 */
8565    .extern MterpCheckBefore
8566    EXPORT_PC
8567    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8568    adrl   lr, artMterpAsmInstructionStart + (66 * 128)       @ Addr of primary handler.
8569    mov    r0, rSELF
8570    add    r1, rFP, #OFF_FP_SHADOWFRAME
8571    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8572
8573/* ------------------------------ */
8574    .balign 128
8575.L_ALT_op_unused_43: /* 0x43 */
8576/* File: arm/alt_stub.S */
8577/*
8578 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8579 * any interesting requests and then jump to the real instruction
8580 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8581 */
8582    .extern MterpCheckBefore
8583    EXPORT_PC
8584    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8585    adrl   lr, artMterpAsmInstructionStart + (67 * 128)       @ Addr of primary handler.
8586    mov    r0, rSELF
8587    add    r1, rFP, #OFF_FP_SHADOWFRAME
8588    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8589
8590/* ------------------------------ */
8591    .balign 128
8592.L_ALT_op_aget: /* 0x44 */
8593/* File: arm/alt_stub.S */
8594/*
8595 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8596 * any interesting requests and then jump to the real instruction
8597 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8598 */
8599    .extern MterpCheckBefore
8600    EXPORT_PC
8601    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8602    adrl   lr, artMterpAsmInstructionStart + (68 * 128)       @ Addr of primary handler.
8603    mov    r0, rSELF
8604    add    r1, rFP, #OFF_FP_SHADOWFRAME
8605    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8606
8607/* ------------------------------ */
8608    .balign 128
8609.L_ALT_op_aget_wide: /* 0x45 */
8610/* File: arm/alt_stub.S */
8611/*
8612 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8613 * any interesting requests and then jump to the real instruction
8614 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8615 */
8616    .extern MterpCheckBefore
8617    EXPORT_PC
8618    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8619    adrl   lr, artMterpAsmInstructionStart + (69 * 128)       @ Addr of primary handler.
8620    mov    r0, rSELF
8621    add    r1, rFP, #OFF_FP_SHADOWFRAME
8622    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8623
8624/* ------------------------------ */
8625    .balign 128
8626.L_ALT_op_aget_object: /* 0x46 */
8627/* File: arm/alt_stub.S */
8628/*
8629 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8630 * any interesting requests and then jump to the real instruction
8631 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8632 */
8633    .extern MterpCheckBefore
8634    EXPORT_PC
8635    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8636    adrl   lr, artMterpAsmInstructionStart + (70 * 128)       @ Addr of primary handler.
8637    mov    r0, rSELF
8638    add    r1, rFP, #OFF_FP_SHADOWFRAME
8639    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8640
8641/* ------------------------------ */
8642    .balign 128
8643.L_ALT_op_aget_boolean: /* 0x47 */
8644/* File: arm/alt_stub.S */
8645/*
8646 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8647 * any interesting requests and then jump to the real instruction
8648 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8649 */
8650    .extern MterpCheckBefore
8651    EXPORT_PC
8652    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8653    adrl   lr, artMterpAsmInstructionStart + (71 * 128)       @ Addr of primary handler.
8654    mov    r0, rSELF
8655    add    r1, rFP, #OFF_FP_SHADOWFRAME
8656    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8657
8658/* ------------------------------ */
8659    .balign 128
8660.L_ALT_op_aget_byte: /* 0x48 */
8661/* File: arm/alt_stub.S */
8662/*
8663 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8664 * any interesting requests and then jump to the real instruction
8665 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8666 */
8667    .extern MterpCheckBefore
8668    EXPORT_PC
8669    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8670    adrl   lr, artMterpAsmInstructionStart + (72 * 128)       @ Addr of primary handler.
8671    mov    r0, rSELF
8672    add    r1, rFP, #OFF_FP_SHADOWFRAME
8673    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8674
8675/* ------------------------------ */
8676    .balign 128
8677.L_ALT_op_aget_char: /* 0x49 */
8678/* File: arm/alt_stub.S */
8679/*
8680 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8681 * any interesting requests and then jump to the real instruction
8682 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8683 */
8684    .extern MterpCheckBefore
8685    EXPORT_PC
8686    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8687    adrl   lr, artMterpAsmInstructionStart + (73 * 128)       @ Addr of primary handler.
8688    mov    r0, rSELF
8689    add    r1, rFP, #OFF_FP_SHADOWFRAME
8690    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8691
8692/* ------------------------------ */
8693    .balign 128
8694.L_ALT_op_aget_short: /* 0x4a */
8695/* File: arm/alt_stub.S */
8696/*
8697 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8698 * any interesting requests and then jump to the real instruction
8699 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8700 */
8701    .extern MterpCheckBefore
8702    EXPORT_PC
8703    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8704    adrl   lr, artMterpAsmInstructionStart + (74 * 128)       @ Addr of primary handler.
8705    mov    r0, rSELF
8706    add    r1, rFP, #OFF_FP_SHADOWFRAME
8707    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8708
8709/* ------------------------------ */
8710    .balign 128
8711.L_ALT_op_aput: /* 0x4b */
8712/* File: arm/alt_stub.S */
8713/*
8714 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8715 * any interesting requests and then jump to the real instruction
8716 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8717 */
8718    .extern MterpCheckBefore
8719    EXPORT_PC
8720    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8721    adrl   lr, artMterpAsmInstructionStart + (75 * 128)       @ Addr of primary handler.
8722    mov    r0, rSELF
8723    add    r1, rFP, #OFF_FP_SHADOWFRAME
8724    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8725
8726/* ------------------------------ */
8727    .balign 128
8728.L_ALT_op_aput_wide: /* 0x4c */
8729/* File: arm/alt_stub.S */
8730/*
8731 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8732 * any interesting requests and then jump to the real instruction
8733 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8734 */
8735    .extern MterpCheckBefore
8736    EXPORT_PC
8737    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8738    adrl   lr, artMterpAsmInstructionStart + (76 * 128)       @ Addr of primary handler.
8739    mov    r0, rSELF
8740    add    r1, rFP, #OFF_FP_SHADOWFRAME
8741    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8742
8743/* ------------------------------ */
8744    .balign 128
8745.L_ALT_op_aput_object: /* 0x4d */
8746/* File: arm/alt_stub.S */
8747/*
8748 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8749 * any interesting requests and then jump to the real instruction
8750 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8751 */
8752    .extern MterpCheckBefore
8753    EXPORT_PC
8754    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8755    adrl   lr, artMterpAsmInstructionStart + (77 * 128)       @ Addr of primary handler.
8756    mov    r0, rSELF
8757    add    r1, rFP, #OFF_FP_SHADOWFRAME
8758    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8759
8760/* ------------------------------ */
8761    .balign 128
8762.L_ALT_op_aput_boolean: /* 0x4e */
8763/* File: arm/alt_stub.S */
8764/*
8765 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8766 * any interesting requests and then jump to the real instruction
8767 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8768 */
8769    .extern MterpCheckBefore
8770    EXPORT_PC
8771    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8772    adrl   lr, artMterpAsmInstructionStart + (78 * 128)       @ Addr of primary handler.
8773    mov    r0, rSELF
8774    add    r1, rFP, #OFF_FP_SHADOWFRAME
8775    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8776
8777/* ------------------------------ */
8778    .balign 128
8779.L_ALT_op_aput_byte: /* 0x4f */
8780/* File: arm/alt_stub.S */
8781/*
8782 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8783 * any interesting requests and then jump to the real instruction
8784 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8785 */
8786    .extern MterpCheckBefore
8787    EXPORT_PC
8788    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8789    adrl   lr, artMterpAsmInstructionStart + (79 * 128)       @ Addr of primary handler.
8790    mov    r0, rSELF
8791    add    r1, rFP, #OFF_FP_SHADOWFRAME
8792    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8793
8794/* ------------------------------ */
8795    .balign 128
8796.L_ALT_op_aput_char: /* 0x50 */
8797/* File: arm/alt_stub.S */
8798/*
8799 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8800 * any interesting requests and then jump to the real instruction
8801 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8802 */
8803    .extern MterpCheckBefore
8804    EXPORT_PC
8805    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8806    adrl   lr, artMterpAsmInstructionStart + (80 * 128)       @ Addr of primary handler.
8807    mov    r0, rSELF
8808    add    r1, rFP, #OFF_FP_SHADOWFRAME
8809    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8810
8811/* ------------------------------ */
8812    .balign 128
8813.L_ALT_op_aput_short: /* 0x51 */
8814/* File: arm/alt_stub.S */
8815/*
8816 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8817 * any interesting requests and then jump to the real instruction
8818 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8819 */
8820    .extern MterpCheckBefore
8821    EXPORT_PC
8822    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8823    adrl   lr, artMterpAsmInstructionStart + (81 * 128)       @ Addr of primary handler.
8824    mov    r0, rSELF
8825    add    r1, rFP, #OFF_FP_SHADOWFRAME
8826    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8827
8828/* ------------------------------ */
8829    .balign 128
8830.L_ALT_op_iget: /* 0x52 */
8831/* File: arm/alt_stub.S */
8832/*
8833 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8834 * any interesting requests and then jump to the real instruction
8835 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8836 */
8837    .extern MterpCheckBefore
8838    EXPORT_PC
8839    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8840    adrl   lr, artMterpAsmInstructionStart + (82 * 128)       @ Addr of primary handler.
8841    mov    r0, rSELF
8842    add    r1, rFP, #OFF_FP_SHADOWFRAME
8843    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8844
8845/* ------------------------------ */
8846    .balign 128
8847.L_ALT_op_iget_wide: /* 0x53 */
8848/* File: arm/alt_stub.S */
8849/*
8850 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8851 * any interesting requests and then jump to the real instruction
8852 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8853 */
8854    .extern MterpCheckBefore
8855    EXPORT_PC
8856    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8857    adrl   lr, artMterpAsmInstructionStart + (83 * 128)       @ Addr of primary handler.
8858    mov    r0, rSELF
8859    add    r1, rFP, #OFF_FP_SHADOWFRAME
8860    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8861
8862/* ------------------------------ */
8863    .balign 128
8864.L_ALT_op_iget_object: /* 0x54 */
8865/* File: arm/alt_stub.S */
8866/*
8867 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8868 * any interesting requests and then jump to the real instruction
8869 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8870 */
8871    .extern MterpCheckBefore
8872    EXPORT_PC
8873    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8874    adrl   lr, artMterpAsmInstructionStart + (84 * 128)       @ Addr of primary handler.
8875    mov    r0, rSELF
8876    add    r1, rFP, #OFF_FP_SHADOWFRAME
8877    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8878
8879/* ------------------------------ */
8880    .balign 128
8881.L_ALT_op_iget_boolean: /* 0x55 */
8882/* File: arm/alt_stub.S */
8883/*
8884 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8885 * any interesting requests and then jump to the real instruction
8886 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8887 */
8888    .extern MterpCheckBefore
8889    EXPORT_PC
8890    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8891    adrl   lr, artMterpAsmInstructionStart + (85 * 128)       @ Addr of primary handler.
8892    mov    r0, rSELF
8893    add    r1, rFP, #OFF_FP_SHADOWFRAME
8894    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8895
8896/* ------------------------------ */
8897    .balign 128
8898.L_ALT_op_iget_byte: /* 0x56 */
8899/* File: arm/alt_stub.S */
8900/*
8901 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8902 * any interesting requests and then jump to the real instruction
8903 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8904 */
8905    .extern MterpCheckBefore
8906    EXPORT_PC
8907    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8908    adrl   lr, artMterpAsmInstructionStart + (86 * 128)       @ Addr of primary handler.
8909    mov    r0, rSELF
8910    add    r1, rFP, #OFF_FP_SHADOWFRAME
8911    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8912
8913/* ------------------------------ */
8914    .balign 128
8915.L_ALT_op_iget_char: /* 0x57 */
8916/* File: arm/alt_stub.S */
8917/*
8918 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8919 * any interesting requests and then jump to the real instruction
8920 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8921 */
8922    .extern MterpCheckBefore
8923    EXPORT_PC
8924    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8925    adrl   lr, artMterpAsmInstructionStart + (87 * 128)       @ Addr of primary handler.
8926    mov    r0, rSELF
8927    add    r1, rFP, #OFF_FP_SHADOWFRAME
8928    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8929
8930/* ------------------------------ */
8931    .balign 128
8932.L_ALT_op_iget_short: /* 0x58 */
8933/* File: arm/alt_stub.S */
8934/*
8935 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8936 * any interesting requests and then jump to the real instruction
8937 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8938 */
8939    .extern MterpCheckBefore
8940    EXPORT_PC
8941    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8942    adrl   lr, artMterpAsmInstructionStart + (88 * 128)       @ Addr of primary handler.
8943    mov    r0, rSELF
8944    add    r1, rFP, #OFF_FP_SHADOWFRAME
8945    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8946
8947/* ------------------------------ */
8948    .balign 128
8949.L_ALT_op_iput: /* 0x59 */
8950/* File: arm/alt_stub.S */
8951/*
8952 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8953 * any interesting requests and then jump to the real instruction
8954 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8955 */
8956    .extern MterpCheckBefore
8957    EXPORT_PC
8958    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8959    adrl   lr, artMterpAsmInstructionStart + (89 * 128)       @ Addr of primary handler.
8960    mov    r0, rSELF
8961    add    r1, rFP, #OFF_FP_SHADOWFRAME
8962    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8963
8964/* ------------------------------ */
8965    .balign 128
8966.L_ALT_op_iput_wide: /* 0x5a */
8967/* File: arm/alt_stub.S */
8968/*
8969 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8970 * any interesting requests and then jump to the real instruction
8971 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8972 */
8973    .extern MterpCheckBefore
8974    EXPORT_PC
8975    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8976    adrl   lr, artMterpAsmInstructionStart + (90 * 128)       @ Addr of primary handler.
8977    mov    r0, rSELF
8978    add    r1, rFP, #OFF_FP_SHADOWFRAME
8979    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8980
8981/* ------------------------------ */
8982    .balign 128
8983.L_ALT_op_iput_object: /* 0x5b */
8984/* File: arm/alt_stub.S */
8985/*
8986 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
8987 * any interesting requests and then jump to the real instruction
8988 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
8989 */
8990    .extern MterpCheckBefore
8991    EXPORT_PC
8992    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
8993    adrl   lr, artMterpAsmInstructionStart + (91 * 128)       @ Addr of primary handler.
8994    mov    r0, rSELF
8995    add    r1, rFP, #OFF_FP_SHADOWFRAME
8996    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
8997
8998/* ------------------------------ */
8999    .balign 128
9000.L_ALT_op_iput_boolean: /* 0x5c */
9001/* File: arm/alt_stub.S */
9002/*
9003 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9004 * any interesting requests and then jump to the real instruction
9005 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9006 */
9007    .extern MterpCheckBefore
9008    EXPORT_PC
9009    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9010    adrl   lr, artMterpAsmInstructionStart + (92 * 128)       @ Addr of primary handler.
9011    mov    r0, rSELF
9012    add    r1, rFP, #OFF_FP_SHADOWFRAME
9013    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9014
9015/* ------------------------------ */
9016    .balign 128
9017.L_ALT_op_iput_byte: /* 0x5d */
9018/* File: arm/alt_stub.S */
9019/*
9020 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9021 * any interesting requests and then jump to the real instruction
9022 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9023 */
9024    .extern MterpCheckBefore
9025    EXPORT_PC
9026    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9027    adrl   lr, artMterpAsmInstructionStart + (93 * 128)       @ Addr of primary handler.
9028    mov    r0, rSELF
9029    add    r1, rFP, #OFF_FP_SHADOWFRAME
9030    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9031
9032/* ------------------------------ */
9033    .balign 128
9034.L_ALT_op_iput_char: /* 0x5e */
9035/* File: arm/alt_stub.S */
9036/*
9037 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9038 * any interesting requests and then jump to the real instruction
9039 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9040 */
9041    .extern MterpCheckBefore
9042    EXPORT_PC
9043    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9044    adrl   lr, artMterpAsmInstructionStart + (94 * 128)       @ Addr of primary handler.
9045    mov    r0, rSELF
9046    add    r1, rFP, #OFF_FP_SHADOWFRAME
9047    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9048
9049/* ------------------------------ */
9050    .balign 128
9051.L_ALT_op_iput_short: /* 0x5f */
9052/* File: arm/alt_stub.S */
9053/*
9054 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9055 * any interesting requests and then jump to the real instruction
9056 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9057 */
9058    .extern MterpCheckBefore
9059    EXPORT_PC
9060    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9061    adrl   lr, artMterpAsmInstructionStart + (95 * 128)       @ Addr of primary handler.
9062    mov    r0, rSELF
9063    add    r1, rFP, #OFF_FP_SHADOWFRAME
9064    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9065
9066/* ------------------------------ */
9067    .balign 128
9068.L_ALT_op_sget: /* 0x60 */
9069/* File: arm/alt_stub.S */
9070/*
9071 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9072 * any interesting requests and then jump to the real instruction
9073 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9074 */
9075    .extern MterpCheckBefore
9076    EXPORT_PC
9077    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9078    adrl   lr, artMterpAsmInstructionStart + (96 * 128)       @ Addr of primary handler.
9079    mov    r0, rSELF
9080    add    r1, rFP, #OFF_FP_SHADOWFRAME
9081    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9082
9083/* ------------------------------ */
9084    .balign 128
9085.L_ALT_op_sget_wide: /* 0x61 */
9086/* File: arm/alt_stub.S */
9087/*
9088 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9089 * any interesting requests and then jump to the real instruction
9090 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9091 */
9092    .extern MterpCheckBefore
9093    EXPORT_PC
9094    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9095    adrl   lr, artMterpAsmInstructionStart + (97 * 128)       @ Addr of primary handler.
9096    mov    r0, rSELF
9097    add    r1, rFP, #OFF_FP_SHADOWFRAME
9098    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9099
9100/* ------------------------------ */
9101    .balign 128
9102.L_ALT_op_sget_object: /* 0x62 */
9103/* File: arm/alt_stub.S */
9104/*
9105 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9106 * any interesting requests and then jump to the real instruction
9107 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9108 */
9109    .extern MterpCheckBefore
9110    EXPORT_PC
9111    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9112    adrl   lr, artMterpAsmInstructionStart + (98 * 128)       @ Addr of primary handler.
9113    mov    r0, rSELF
9114    add    r1, rFP, #OFF_FP_SHADOWFRAME
9115    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9116
9117/* ------------------------------ */
9118    .balign 128
9119.L_ALT_op_sget_boolean: /* 0x63 */
9120/* File: arm/alt_stub.S */
9121/*
9122 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9123 * any interesting requests and then jump to the real instruction
9124 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9125 */
9126    .extern MterpCheckBefore
9127    EXPORT_PC
9128    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9129    adrl   lr, artMterpAsmInstructionStart + (99 * 128)       @ Addr of primary handler.
9130    mov    r0, rSELF
9131    add    r1, rFP, #OFF_FP_SHADOWFRAME
9132    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9133
9134/* ------------------------------ */
9135    .balign 128
9136.L_ALT_op_sget_byte: /* 0x64 */
9137/* File: arm/alt_stub.S */
9138/*
9139 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9140 * any interesting requests and then jump to the real instruction
9141 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9142 */
9143    .extern MterpCheckBefore
9144    EXPORT_PC
9145    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9146    adrl   lr, artMterpAsmInstructionStart + (100 * 128)       @ Addr of primary handler.
9147    mov    r0, rSELF
9148    add    r1, rFP, #OFF_FP_SHADOWFRAME
9149    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9150
9151/* ------------------------------ */
9152    .balign 128
9153.L_ALT_op_sget_char: /* 0x65 */
9154/* File: arm/alt_stub.S */
9155/*
9156 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9157 * any interesting requests and then jump to the real instruction
9158 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9159 */
9160    .extern MterpCheckBefore
9161    EXPORT_PC
9162    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9163    adrl   lr, artMterpAsmInstructionStart + (101 * 128)       @ Addr of primary handler.
9164    mov    r0, rSELF
9165    add    r1, rFP, #OFF_FP_SHADOWFRAME
9166    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9167
9168/* ------------------------------ */
9169    .balign 128
9170.L_ALT_op_sget_short: /* 0x66 */
9171/* File: arm/alt_stub.S */
9172/*
9173 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9174 * any interesting requests and then jump to the real instruction
9175 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9176 */
9177    .extern MterpCheckBefore
9178    EXPORT_PC
9179    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9180    adrl   lr, artMterpAsmInstructionStart + (102 * 128)       @ Addr of primary handler.
9181    mov    r0, rSELF
9182    add    r1, rFP, #OFF_FP_SHADOWFRAME
9183    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9184
9185/* ------------------------------ */
9186    .balign 128
9187.L_ALT_op_sput: /* 0x67 */
9188/* File: arm/alt_stub.S */
9189/*
9190 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9191 * any interesting requests and then jump to the real instruction
9192 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9193 */
9194    .extern MterpCheckBefore
9195    EXPORT_PC
9196    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9197    adrl   lr, artMterpAsmInstructionStart + (103 * 128)       @ Addr of primary handler.
9198    mov    r0, rSELF
9199    add    r1, rFP, #OFF_FP_SHADOWFRAME
9200    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9201
9202/* ------------------------------ */
9203    .balign 128
9204.L_ALT_op_sput_wide: /* 0x68 */
9205/* File: arm/alt_stub.S */
9206/*
9207 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9208 * any interesting requests and then jump to the real instruction
9209 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9210 */
9211    .extern MterpCheckBefore
9212    EXPORT_PC
9213    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9214    adrl   lr, artMterpAsmInstructionStart + (104 * 128)       @ Addr of primary handler.
9215    mov    r0, rSELF
9216    add    r1, rFP, #OFF_FP_SHADOWFRAME
9217    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9218
9219/* ------------------------------ */
9220    .balign 128
9221.L_ALT_op_sput_object: /* 0x69 */
9222/* File: arm/alt_stub.S */
9223/*
9224 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9225 * any interesting requests and then jump to the real instruction
9226 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9227 */
9228    .extern MterpCheckBefore
9229    EXPORT_PC
9230    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9231    adrl   lr, artMterpAsmInstructionStart + (105 * 128)       @ Addr of primary handler.
9232    mov    r0, rSELF
9233    add    r1, rFP, #OFF_FP_SHADOWFRAME
9234    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9235
9236/* ------------------------------ */
9237    .balign 128
9238.L_ALT_op_sput_boolean: /* 0x6a */
9239/* File: arm/alt_stub.S */
9240/*
9241 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9242 * any interesting requests and then jump to the real instruction
9243 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9244 */
9245    .extern MterpCheckBefore
9246    EXPORT_PC
9247    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9248    adrl   lr, artMterpAsmInstructionStart + (106 * 128)       @ Addr of primary handler.
9249    mov    r0, rSELF
9250    add    r1, rFP, #OFF_FP_SHADOWFRAME
9251    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9252
9253/* ------------------------------ */
9254    .balign 128
9255.L_ALT_op_sput_byte: /* 0x6b */
9256/* File: arm/alt_stub.S */
9257/*
9258 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9259 * any interesting requests and then jump to the real instruction
9260 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9261 */
9262    .extern MterpCheckBefore
9263    EXPORT_PC
9264    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9265    adrl   lr, artMterpAsmInstructionStart + (107 * 128)       @ Addr of primary handler.
9266    mov    r0, rSELF
9267    add    r1, rFP, #OFF_FP_SHADOWFRAME
9268    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9269
9270/* ------------------------------ */
9271    .balign 128
9272.L_ALT_op_sput_char: /* 0x6c */
9273/* File: arm/alt_stub.S */
9274/*
9275 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9276 * any interesting requests and then jump to the real instruction
9277 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9278 */
9279    .extern MterpCheckBefore
9280    EXPORT_PC
9281    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9282    adrl   lr, artMterpAsmInstructionStart + (108 * 128)       @ Addr of primary handler.
9283    mov    r0, rSELF
9284    add    r1, rFP, #OFF_FP_SHADOWFRAME
9285    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9286
9287/* ------------------------------ */
9288    .balign 128
9289.L_ALT_op_sput_short: /* 0x6d */
9290/* File: arm/alt_stub.S */
9291/*
9292 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9293 * any interesting requests and then jump to the real instruction
9294 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9295 */
9296    .extern MterpCheckBefore
9297    EXPORT_PC
9298    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9299    adrl   lr, artMterpAsmInstructionStart + (109 * 128)       @ Addr of primary handler.
9300    mov    r0, rSELF
9301    add    r1, rFP, #OFF_FP_SHADOWFRAME
9302    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9303
9304/* ------------------------------ */
9305    .balign 128
9306.L_ALT_op_invoke_virtual: /* 0x6e */
9307/* File: arm/alt_stub.S */
9308/*
9309 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9310 * any interesting requests and then jump to the real instruction
9311 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9312 */
9313    .extern MterpCheckBefore
9314    EXPORT_PC
9315    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9316    adrl   lr, artMterpAsmInstructionStart + (110 * 128)       @ Addr of primary handler.
9317    mov    r0, rSELF
9318    add    r1, rFP, #OFF_FP_SHADOWFRAME
9319    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9320
9321/* ------------------------------ */
9322    .balign 128
9323.L_ALT_op_invoke_super: /* 0x6f */
9324/* File: arm/alt_stub.S */
9325/*
9326 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9327 * any interesting requests and then jump to the real instruction
9328 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9329 */
9330    .extern MterpCheckBefore
9331    EXPORT_PC
9332    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9333    adrl   lr, artMterpAsmInstructionStart + (111 * 128)       @ Addr of primary handler.
9334    mov    r0, rSELF
9335    add    r1, rFP, #OFF_FP_SHADOWFRAME
9336    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9337
9338/* ------------------------------ */
9339    .balign 128
9340.L_ALT_op_invoke_direct: /* 0x70 */
9341/* File: arm/alt_stub.S */
9342/*
9343 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9344 * any interesting requests and then jump to the real instruction
9345 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9346 */
9347    .extern MterpCheckBefore
9348    EXPORT_PC
9349    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9350    adrl   lr, artMterpAsmInstructionStart + (112 * 128)       @ Addr of primary handler.
9351    mov    r0, rSELF
9352    add    r1, rFP, #OFF_FP_SHADOWFRAME
9353    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9354
9355/* ------------------------------ */
9356    .balign 128
9357.L_ALT_op_invoke_static: /* 0x71 */
9358/* File: arm/alt_stub.S */
9359/*
9360 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9361 * any interesting requests and then jump to the real instruction
9362 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9363 */
9364    .extern MterpCheckBefore
9365    EXPORT_PC
9366    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9367    adrl   lr, artMterpAsmInstructionStart + (113 * 128)       @ Addr of primary handler.
9368    mov    r0, rSELF
9369    add    r1, rFP, #OFF_FP_SHADOWFRAME
9370    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9371
9372/* ------------------------------ */
9373    .balign 128
9374.L_ALT_op_invoke_interface: /* 0x72 */
9375/* File: arm/alt_stub.S */
9376/*
9377 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9378 * any interesting requests and then jump to the real instruction
9379 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9380 */
9381    .extern MterpCheckBefore
9382    EXPORT_PC
9383    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9384    adrl   lr, artMterpAsmInstructionStart + (114 * 128)       @ Addr of primary handler.
9385    mov    r0, rSELF
9386    add    r1, rFP, #OFF_FP_SHADOWFRAME
9387    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9388
9389/* ------------------------------ */
9390    .balign 128
9391.L_ALT_op_return_void_no_barrier: /* 0x73 */
9392/* File: arm/alt_stub.S */
9393/*
9394 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9395 * any interesting requests and then jump to the real instruction
9396 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9397 */
9398    .extern MterpCheckBefore
9399    EXPORT_PC
9400    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9401    adrl   lr, artMterpAsmInstructionStart + (115 * 128)       @ Addr of primary handler.
9402    mov    r0, rSELF
9403    add    r1, rFP, #OFF_FP_SHADOWFRAME
9404    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9405
9406/* ------------------------------ */
9407    .balign 128
9408.L_ALT_op_invoke_virtual_range: /* 0x74 */
9409/* File: arm/alt_stub.S */
9410/*
9411 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9412 * any interesting requests and then jump to the real instruction
9413 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9414 */
9415    .extern MterpCheckBefore
9416    EXPORT_PC
9417    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9418    adrl   lr, artMterpAsmInstructionStart + (116 * 128)       @ Addr of primary handler.
9419    mov    r0, rSELF
9420    add    r1, rFP, #OFF_FP_SHADOWFRAME
9421    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9422
9423/* ------------------------------ */
9424    .balign 128
9425.L_ALT_op_invoke_super_range: /* 0x75 */
9426/* File: arm/alt_stub.S */
9427/*
9428 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9429 * any interesting requests and then jump to the real instruction
9430 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9431 */
9432    .extern MterpCheckBefore
9433    EXPORT_PC
9434    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9435    adrl   lr, artMterpAsmInstructionStart + (117 * 128)       @ Addr of primary handler.
9436    mov    r0, rSELF
9437    add    r1, rFP, #OFF_FP_SHADOWFRAME
9438    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9439
9440/* ------------------------------ */
9441    .balign 128
9442.L_ALT_op_invoke_direct_range: /* 0x76 */
9443/* File: arm/alt_stub.S */
9444/*
9445 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9446 * any interesting requests and then jump to the real instruction
9447 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9448 */
9449    .extern MterpCheckBefore
9450    EXPORT_PC
9451    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9452    adrl   lr, artMterpAsmInstructionStart + (118 * 128)       @ Addr of primary handler.
9453    mov    r0, rSELF
9454    add    r1, rFP, #OFF_FP_SHADOWFRAME
9455    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9456
9457/* ------------------------------ */
9458    .balign 128
9459.L_ALT_op_invoke_static_range: /* 0x77 */
9460/* File: arm/alt_stub.S */
9461/*
9462 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9463 * any interesting requests and then jump to the real instruction
9464 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9465 */
9466    .extern MterpCheckBefore
9467    EXPORT_PC
9468    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9469    adrl   lr, artMterpAsmInstructionStart + (119 * 128)       @ Addr of primary handler.
9470    mov    r0, rSELF
9471    add    r1, rFP, #OFF_FP_SHADOWFRAME
9472    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9473
9474/* ------------------------------ */
9475    .balign 128
9476.L_ALT_op_invoke_interface_range: /* 0x78 */
9477/* File: arm/alt_stub.S */
9478/*
9479 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9480 * any interesting requests and then jump to the real instruction
9481 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9482 */
9483    .extern MterpCheckBefore
9484    EXPORT_PC
9485    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9486    adrl   lr, artMterpAsmInstructionStart + (120 * 128)       @ Addr of primary handler.
9487    mov    r0, rSELF
9488    add    r1, rFP, #OFF_FP_SHADOWFRAME
9489    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9490
9491/* ------------------------------ */
9492    .balign 128
9493.L_ALT_op_unused_79: /* 0x79 */
9494/* File: arm/alt_stub.S */
9495/*
9496 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9497 * any interesting requests and then jump to the real instruction
9498 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9499 */
9500    .extern MterpCheckBefore
9501    EXPORT_PC
9502    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9503    adrl   lr, artMterpAsmInstructionStart + (121 * 128)       @ Addr of primary handler.
9504    mov    r0, rSELF
9505    add    r1, rFP, #OFF_FP_SHADOWFRAME
9506    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9507
9508/* ------------------------------ */
9509    .balign 128
9510.L_ALT_op_unused_7a: /* 0x7a */
9511/* File: arm/alt_stub.S */
9512/*
9513 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9514 * any interesting requests and then jump to the real instruction
9515 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9516 */
9517    .extern MterpCheckBefore
9518    EXPORT_PC
9519    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9520    adrl   lr, artMterpAsmInstructionStart + (122 * 128)       @ Addr of primary handler.
9521    mov    r0, rSELF
9522    add    r1, rFP, #OFF_FP_SHADOWFRAME
9523    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9524
9525/* ------------------------------ */
9526    .balign 128
9527.L_ALT_op_neg_int: /* 0x7b */
9528/* File: arm/alt_stub.S */
9529/*
9530 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9531 * any interesting requests and then jump to the real instruction
9532 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9533 */
9534    .extern MterpCheckBefore
9535    EXPORT_PC
9536    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9537    adrl   lr, artMterpAsmInstructionStart + (123 * 128)       @ Addr of primary handler.
9538    mov    r0, rSELF
9539    add    r1, rFP, #OFF_FP_SHADOWFRAME
9540    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9541
9542/* ------------------------------ */
9543    .balign 128
9544.L_ALT_op_not_int: /* 0x7c */
9545/* File: arm/alt_stub.S */
9546/*
9547 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9548 * any interesting requests and then jump to the real instruction
9549 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9550 */
9551    .extern MterpCheckBefore
9552    EXPORT_PC
9553    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9554    adrl   lr, artMterpAsmInstructionStart + (124 * 128)       @ Addr of primary handler.
9555    mov    r0, rSELF
9556    add    r1, rFP, #OFF_FP_SHADOWFRAME
9557    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9558
9559/* ------------------------------ */
9560    .balign 128
9561.L_ALT_op_neg_long: /* 0x7d */
9562/* File: arm/alt_stub.S */
9563/*
9564 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9565 * any interesting requests and then jump to the real instruction
9566 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9567 */
9568    .extern MterpCheckBefore
9569    EXPORT_PC
9570    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9571    adrl   lr, artMterpAsmInstructionStart + (125 * 128)       @ Addr of primary handler.
9572    mov    r0, rSELF
9573    add    r1, rFP, #OFF_FP_SHADOWFRAME
9574    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9575
9576/* ------------------------------ */
9577    .balign 128
9578.L_ALT_op_not_long: /* 0x7e */
9579/* File: arm/alt_stub.S */
9580/*
9581 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9582 * any interesting requests and then jump to the real instruction
9583 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9584 */
9585    .extern MterpCheckBefore
9586    EXPORT_PC
9587    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9588    adrl   lr, artMterpAsmInstructionStart + (126 * 128)       @ Addr of primary handler.
9589    mov    r0, rSELF
9590    add    r1, rFP, #OFF_FP_SHADOWFRAME
9591    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9592
9593/* ------------------------------ */
9594    .balign 128
9595.L_ALT_op_neg_float: /* 0x7f */
9596/* File: arm/alt_stub.S */
9597/*
9598 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9599 * any interesting requests and then jump to the real instruction
9600 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9601 */
9602    .extern MterpCheckBefore
9603    EXPORT_PC
9604    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9605    adrl   lr, artMterpAsmInstructionStart + (127 * 128)       @ Addr of primary handler.
9606    mov    r0, rSELF
9607    add    r1, rFP, #OFF_FP_SHADOWFRAME
9608    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9609
9610/* ------------------------------ */
9611    .balign 128
9612.L_ALT_op_neg_double: /* 0x80 */
9613/* File: arm/alt_stub.S */
9614/*
9615 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9616 * any interesting requests and then jump to the real instruction
9617 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9618 */
9619    .extern MterpCheckBefore
9620    EXPORT_PC
9621    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9622    adrl   lr, artMterpAsmInstructionStart + (128 * 128)       @ Addr of primary handler.
9623    mov    r0, rSELF
9624    add    r1, rFP, #OFF_FP_SHADOWFRAME
9625    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9626
9627/* ------------------------------ */
9628    .balign 128
9629.L_ALT_op_int_to_long: /* 0x81 */
9630/* File: arm/alt_stub.S */
9631/*
9632 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9633 * any interesting requests and then jump to the real instruction
9634 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9635 */
9636    .extern MterpCheckBefore
9637    EXPORT_PC
9638    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9639    adrl   lr, artMterpAsmInstructionStart + (129 * 128)       @ Addr of primary handler.
9640    mov    r0, rSELF
9641    add    r1, rFP, #OFF_FP_SHADOWFRAME
9642    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9643
9644/* ------------------------------ */
9645    .balign 128
9646.L_ALT_op_int_to_float: /* 0x82 */
9647/* File: arm/alt_stub.S */
9648/*
9649 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9650 * any interesting requests and then jump to the real instruction
9651 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9652 */
9653    .extern MterpCheckBefore
9654    EXPORT_PC
9655    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9656    adrl   lr, artMterpAsmInstructionStart + (130 * 128)       @ Addr of primary handler.
9657    mov    r0, rSELF
9658    add    r1, rFP, #OFF_FP_SHADOWFRAME
9659    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9660
9661/* ------------------------------ */
9662    .balign 128
9663.L_ALT_op_int_to_double: /* 0x83 */
9664/* File: arm/alt_stub.S */
9665/*
9666 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9667 * any interesting requests and then jump to the real instruction
9668 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9669 */
9670    .extern MterpCheckBefore
9671    EXPORT_PC
9672    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9673    adrl   lr, artMterpAsmInstructionStart + (131 * 128)       @ Addr of primary handler.
9674    mov    r0, rSELF
9675    add    r1, rFP, #OFF_FP_SHADOWFRAME
9676    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9677
9678/* ------------------------------ */
9679    .balign 128
9680.L_ALT_op_long_to_int: /* 0x84 */
9681/* File: arm/alt_stub.S */
9682/*
9683 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9684 * any interesting requests and then jump to the real instruction
9685 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9686 */
9687    .extern MterpCheckBefore
9688    EXPORT_PC
9689    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9690    adrl   lr, artMterpAsmInstructionStart + (132 * 128)       @ Addr of primary handler.
9691    mov    r0, rSELF
9692    add    r1, rFP, #OFF_FP_SHADOWFRAME
9693    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9694
9695/* ------------------------------ */
9696    .balign 128
9697.L_ALT_op_long_to_float: /* 0x85 */
9698/* File: arm/alt_stub.S */
9699/*
9700 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9701 * any interesting requests and then jump to the real instruction
9702 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9703 */
9704    .extern MterpCheckBefore
9705    EXPORT_PC
9706    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9707    adrl   lr, artMterpAsmInstructionStart + (133 * 128)       @ Addr of primary handler.
9708    mov    r0, rSELF
9709    add    r1, rFP, #OFF_FP_SHADOWFRAME
9710    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9711
9712/* ------------------------------ */
9713    .balign 128
9714.L_ALT_op_long_to_double: /* 0x86 */
9715/* File: arm/alt_stub.S */
9716/*
9717 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9718 * any interesting requests and then jump to the real instruction
9719 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9720 */
9721    .extern MterpCheckBefore
9722    EXPORT_PC
9723    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9724    adrl   lr, artMterpAsmInstructionStart + (134 * 128)       @ Addr of primary handler.
9725    mov    r0, rSELF
9726    add    r1, rFP, #OFF_FP_SHADOWFRAME
9727    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9728
9729/* ------------------------------ */
9730    .balign 128
9731.L_ALT_op_float_to_int: /* 0x87 */
9732/* File: arm/alt_stub.S */
9733/*
9734 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9735 * any interesting requests and then jump to the real instruction
9736 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9737 */
9738    .extern MterpCheckBefore
9739    EXPORT_PC
9740    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9741    adrl   lr, artMterpAsmInstructionStart + (135 * 128)       @ Addr of primary handler.
9742    mov    r0, rSELF
9743    add    r1, rFP, #OFF_FP_SHADOWFRAME
9744    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9745
9746/* ------------------------------ */
9747    .balign 128
9748.L_ALT_op_float_to_long: /* 0x88 */
9749/* File: arm/alt_stub.S */
9750/*
9751 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9752 * any interesting requests and then jump to the real instruction
9753 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9754 */
9755    .extern MterpCheckBefore
9756    EXPORT_PC
9757    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9758    adrl   lr, artMterpAsmInstructionStart + (136 * 128)       @ Addr of primary handler.
9759    mov    r0, rSELF
9760    add    r1, rFP, #OFF_FP_SHADOWFRAME
9761    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9762
9763/* ------------------------------ */
9764    .balign 128
9765.L_ALT_op_float_to_double: /* 0x89 */
9766/* File: arm/alt_stub.S */
9767/*
9768 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9769 * any interesting requests and then jump to the real instruction
9770 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9771 */
9772    .extern MterpCheckBefore
9773    EXPORT_PC
9774    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9775    adrl   lr, artMterpAsmInstructionStart + (137 * 128)       @ Addr of primary handler.
9776    mov    r0, rSELF
9777    add    r1, rFP, #OFF_FP_SHADOWFRAME
9778    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9779
9780/* ------------------------------ */
9781    .balign 128
9782.L_ALT_op_double_to_int: /* 0x8a */
9783/* File: arm/alt_stub.S */
9784/*
9785 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9786 * any interesting requests and then jump to the real instruction
9787 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9788 */
9789    .extern MterpCheckBefore
9790    EXPORT_PC
9791    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9792    adrl   lr, artMterpAsmInstructionStart + (138 * 128)       @ Addr of primary handler.
9793    mov    r0, rSELF
9794    add    r1, rFP, #OFF_FP_SHADOWFRAME
9795    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9796
9797/* ------------------------------ */
9798    .balign 128
9799.L_ALT_op_double_to_long: /* 0x8b */
9800/* File: arm/alt_stub.S */
9801/*
9802 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9803 * any interesting requests and then jump to the real instruction
9804 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9805 */
9806    .extern MterpCheckBefore
9807    EXPORT_PC
9808    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9809    adrl   lr, artMterpAsmInstructionStart + (139 * 128)       @ Addr of primary handler.
9810    mov    r0, rSELF
9811    add    r1, rFP, #OFF_FP_SHADOWFRAME
9812    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9813
9814/* ------------------------------ */
9815    .balign 128
9816.L_ALT_op_double_to_float: /* 0x8c */
9817/* File: arm/alt_stub.S */
9818/*
9819 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9820 * any interesting requests and then jump to the real instruction
9821 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9822 */
9823    .extern MterpCheckBefore
9824    EXPORT_PC
9825    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9826    adrl   lr, artMterpAsmInstructionStart + (140 * 128)       @ Addr of primary handler.
9827    mov    r0, rSELF
9828    add    r1, rFP, #OFF_FP_SHADOWFRAME
9829    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9830
9831/* ------------------------------ */
9832    .balign 128
9833.L_ALT_op_int_to_byte: /* 0x8d */
9834/* File: arm/alt_stub.S */
9835/*
9836 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9837 * any interesting requests and then jump to the real instruction
9838 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9839 */
9840    .extern MterpCheckBefore
9841    EXPORT_PC
9842    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9843    adrl   lr, artMterpAsmInstructionStart + (141 * 128)       @ Addr of primary handler.
9844    mov    r0, rSELF
9845    add    r1, rFP, #OFF_FP_SHADOWFRAME
9846    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9847
9848/* ------------------------------ */
9849    .balign 128
9850.L_ALT_op_int_to_char: /* 0x8e */
9851/* File: arm/alt_stub.S */
9852/*
9853 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9854 * any interesting requests and then jump to the real instruction
9855 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9856 */
9857    .extern MterpCheckBefore
9858    EXPORT_PC
9859    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9860    adrl   lr, artMterpAsmInstructionStart + (142 * 128)       @ Addr of primary handler.
9861    mov    r0, rSELF
9862    add    r1, rFP, #OFF_FP_SHADOWFRAME
9863    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9864
9865/* ------------------------------ */
9866    .balign 128
9867.L_ALT_op_int_to_short: /* 0x8f */
9868/* File: arm/alt_stub.S */
9869/*
9870 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9871 * any interesting requests and then jump to the real instruction
9872 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9873 */
9874    .extern MterpCheckBefore
9875    EXPORT_PC
9876    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9877    adrl   lr, artMterpAsmInstructionStart + (143 * 128)       @ Addr of primary handler.
9878    mov    r0, rSELF
9879    add    r1, rFP, #OFF_FP_SHADOWFRAME
9880    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9881
9882/* ------------------------------ */
9883    .balign 128
9884.L_ALT_op_add_int: /* 0x90 */
9885/* File: arm/alt_stub.S */
9886/*
9887 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9888 * any interesting requests and then jump to the real instruction
9889 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9890 */
9891    .extern MterpCheckBefore
9892    EXPORT_PC
9893    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9894    adrl   lr, artMterpAsmInstructionStart + (144 * 128)       @ Addr of primary handler.
9895    mov    r0, rSELF
9896    add    r1, rFP, #OFF_FP_SHADOWFRAME
9897    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9898
9899/* ------------------------------ */
9900    .balign 128
9901.L_ALT_op_sub_int: /* 0x91 */
9902/* File: arm/alt_stub.S */
9903/*
9904 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9905 * any interesting requests and then jump to the real instruction
9906 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9907 */
9908    .extern MterpCheckBefore
9909    EXPORT_PC
9910    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9911    adrl   lr, artMterpAsmInstructionStart + (145 * 128)       @ Addr of primary handler.
9912    mov    r0, rSELF
9913    add    r1, rFP, #OFF_FP_SHADOWFRAME
9914    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9915
9916/* ------------------------------ */
9917    .balign 128
9918.L_ALT_op_mul_int: /* 0x92 */
9919/* File: arm/alt_stub.S */
9920/*
9921 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9922 * any interesting requests and then jump to the real instruction
9923 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9924 */
9925    .extern MterpCheckBefore
9926    EXPORT_PC
9927    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9928    adrl   lr, artMterpAsmInstructionStart + (146 * 128)       @ Addr of primary handler.
9929    mov    r0, rSELF
9930    add    r1, rFP, #OFF_FP_SHADOWFRAME
9931    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9932
9933/* ------------------------------ */
9934    .balign 128
9935.L_ALT_op_div_int: /* 0x93 */
9936/* File: arm/alt_stub.S */
9937/*
9938 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9939 * any interesting requests and then jump to the real instruction
9940 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9941 */
9942    .extern MterpCheckBefore
9943    EXPORT_PC
9944    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9945    adrl   lr, artMterpAsmInstructionStart + (147 * 128)       @ Addr of primary handler.
9946    mov    r0, rSELF
9947    add    r1, rFP, #OFF_FP_SHADOWFRAME
9948    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9949
9950/* ------------------------------ */
9951    .balign 128
9952.L_ALT_op_rem_int: /* 0x94 */
9953/* File: arm/alt_stub.S */
9954/*
9955 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9956 * any interesting requests and then jump to the real instruction
9957 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9958 */
9959    .extern MterpCheckBefore
9960    EXPORT_PC
9961    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9962    adrl   lr, artMterpAsmInstructionStart + (148 * 128)       @ Addr of primary handler.
9963    mov    r0, rSELF
9964    add    r1, rFP, #OFF_FP_SHADOWFRAME
9965    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9966
9967/* ------------------------------ */
9968    .balign 128
9969.L_ALT_op_and_int: /* 0x95 */
9970/* File: arm/alt_stub.S */
9971/*
9972 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9973 * any interesting requests and then jump to the real instruction
9974 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9975 */
9976    .extern MterpCheckBefore
9977    EXPORT_PC
9978    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9979    adrl   lr, artMterpAsmInstructionStart + (149 * 128)       @ Addr of primary handler.
9980    mov    r0, rSELF
9981    add    r1, rFP, #OFF_FP_SHADOWFRAME
9982    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
9983
9984/* ------------------------------ */
9985    .balign 128
9986.L_ALT_op_or_int: /* 0x96 */
9987/* File: arm/alt_stub.S */
9988/*
9989 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
9990 * any interesting requests and then jump to the real instruction
9991 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
9992 */
9993    .extern MterpCheckBefore
9994    EXPORT_PC
9995    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
9996    adrl   lr, artMterpAsmInstructionStart + (150 * 128)       @ Addr of primary handler.
9997    mov    r0, rSELF
9998    add    r1, rFP, #OFF_FP_SHADOWFRAME
9999    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10000
10001/* ------------------------------ */
10002    .balign 128
10003.L_ALT_op_xor_int: /* 0x97 */
10004/* File: arm/alt_stub.S */
10005/*
10006 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10007 * any interesting requests and then jump to the real instruction
10008 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10009 */
10010    .extern MterpCheckBefore
10011    EXPORT_PC
10012    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10013    adrl   lr, artMterpAsmInstructionStart + (151 * 128)       @ Addr of primary handler.
10014    mov    r0, rSELF
10015    add    r1, rFP, #OFF_FP_SHADOWFRAME
10016    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10017
10018/* ------------------------------ */
10019    .balign 128
10020.L_ALT_op_shl_int: /* 0x98 */
10021/* File: arm/alt_stub.S */
10022/*
10023 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10024 * any interesting requests and then jump to the real instruction
10025 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10026 */
10027    .extern MterpCheckBefore
10028    EXPORT_PC
10029    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10030    adrl   lr, artMterpAsmInstructionStart + (152 * 128)       @ Addr of primary handler.
10031    mov    r0, rSELF
10032    add    r1, rFP, #OFF_FP_SHADOWFRAME
10033    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10034
10035/* ------------------------------ */
10036    .balign 128
10037.L_ALT_op_shr_int: /* 0x99 */
10038/* File: arm/alt_stub.S */
10039/*
10040 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10041 * any interesting requests and then jump to the real instruction
10042 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10043 */
10044    .extern MterpCheckBefore
10045    EXPORT_PC
10046    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10047    adrl   lr, artMterpAsmInstructionStart + (153 * 128)       @ Addr of primary handler.
10048    mov    r0, rSELF
10049    add    r1, rFP, #OFF_FP_SHADOWFRAME
10050    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10051
10052/* ------------------------------ */
10053    .balign 128
10054.L_ALT_op_ushr_int: /* 0x9a */
10055/* File: arm/alt_stub.S */
10056/*
10057 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10058 * any interesting requests and then jump to the real instruction
10059 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10060 */
10061    .extern MterpCheckBefore
10062    EXPORT_PC
10063    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10064    adrl   lr, artMterpAsmInstructionStart + (154 * 128)       @ Addr of primary handler.
10065    mov    r0, rSELF
10066    add    r1, rFP, #OFF_FP_SHADOWFRAME
10067    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10068
10069/* ------------------------------ */
10070    .balign 128
10071.L_ALT_op_add_long: /* 0x9b */
10072/* File: arm/alt_stub.S */
10073/*
10074 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10075 * any interesting requests and then jump to the real instruction
10076 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10077 */
10078    .extern MterpCheckBefore
10079    EXPORT_PC
10080    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10081    adrl   lr, artMterpAsmInstructionStart + (155 * 128)       @ Addr of primary handler.
10082    mov    r0, rSELF
10083    add    r1, rFP, #OFF_FP_SHADOWFRAME
10084    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10085
10086/* ------------------------------ */
10087    .balign 128
10088.L_ALT_op_sub_long: /* 0x9c */
10089/* File: arm/alt_stub.S */
10090/*
10091 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10092 * any interesting requests and then jump to the real instruction
10093 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10094 */
10095    .extern MterpCheckBefore
10096    EXPORT_PC
10097    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10098    adrl   lr, artMterpAsmInstructionStart + (156 * 128)       @ Addr of primary handler.
10099    mov    r0, rSELF
10100    add    r1, rFP, #OFF_FP_SHADOWFRAME
10101    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10102
10103/* ------------------------------ */
10104    .balign 128
10105.L_ALT_op_mul_long: /* 0x9d */
10106/* File: arm/alt_stub.S */
10107/*
10108 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10109 * any interesting requests and then jump to the real instruction
10110 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10111 */
10112    .extern MterpCheckBefore
10113    EXPORT_PC
10114    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10115    adrl   lr, artMterpAsmInstructionStart + (157 * 128)       @ Addr of primary handler.
10116    mov    r0, rSELF
10117    add    r1, rFP, #OFF_FP_SHADOWFRAME
10118    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10119
10120/* ------------------------------ */
10121    .balign 128
10122.L_ALT_op_div_long: /* 0x9e */
10123/* File: arm/alt_stub.S */
10124/*
10125 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10126 * any interesting requests and then jump to the real instruction
10127 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10128 */
10129    .extern MterpCheckBefore
10130    EXPORT_PC
10131    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10132    adrl   lr, artMterpAsmInstructionStart + (158 * 128)       @ Addr of primary handler.
10133    mov    r0, rSELF
10134    add    r1, rFP, #OFF_FP_SHADOWFRAME
10135    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10136
10137/* ------------------------------ */
10138    .balign 128
10139.L_ALT_op_rem_long: /* 0x9f */
10140/* File: arm/alt_stub.S */
10141/*
10142 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10143 * any interesting requests and then jump to the real instruction
10144 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10145 */
10146    .extern MterpCheckBefore
10147    EXPORT_PC
10148    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10149    adrl   lr, artMterpAsmInstructionStart + (159 * 128)       @ Addr of primary handler.
10150    mov    r0, rSELF
10151    add    r1, rFP, #OFF_FP_SHADOWFRAME
10152    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10153
10154/* ------------------------------ */
10155    .balign 128
10156.L_ALT_op_and_long: /* 0xa0 */
10157/* File: arm/alt_stub.S */
10158/*
10159 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10160 * any interesting requests and then jump to the real instruction
10161 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10162 */
10163    .extern MterpCheckBefore
10164    EXPORT_PC
10165    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10166    adrl   lr, artMterpAsmInstructionStart + (160 * 128)       @ Addr of primary handler.
10167    mov    r0, rSELF
10168    add    r1, rFP, #OFF_FP_SHADOWFRAME
10169    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10170
10171/* ------------------------------ */
10172    .balign 128
10173.L_ALT_op_or_long: /* 0xa1 */
10174/* File: arm/alt_stub.S */
10175/*
10176 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10177 * any interesting requests and then jump to the real instruction
10178 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10179 */
10180    .extern MterpCheckBefore
10181    EXPORT_PC
10182    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10183    adrl   lr, artMterpAsmInstructionStart + (161 * 128)       @ Addr of primary handler.
10184    mov    r0, rSELF
10185    add    r1, rFP, #OFF_FP_SHADOWFRAME
10186    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10187
10188/* ------------------------------ */
10189    .balign 128
10190.L_ALT_op_xor_long: /* 0xa2 */
10191/* File: arm/alt_stub.S */
10192/*
10193 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10194 * any interesting requests and then jump to the real instruction
10195 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10196 */
10197    .extern MterpCheckBefore
10198    EXPORT_PC
10199    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10200    adrl   lr, artMterpAsmInstructionStart + (162 * 128)       @ Addr of primary handler.
10201    mov    r0, rSELF
10202    add    r1, rFP, #OFF_FP_SHADOWFRAME
10203    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10204
10205/* ------------------------------ */
10206    .balign 128
10207.L_ALT_op_shl_long: /* 0xa3 */
10208/* File: arm/alt_stub.S */
10209/*
10210 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10211 * any interesting requests and then jump to the real instruction
10212 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10213 */
10214    .extern MterpCheckBefore
10215    EXPORT_PC
10216    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10217    adrl   lr, artMterpAsmInstructionStart + (163 * 128)       @ Addr of primary handler.
10218    mov    r0, rSELF
10219    add    r1, rFP, #OFF_FP_SHADOWFRAME
10220    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10221
10222/* ------------------------------ */
10223    .balign 128
10224.L_ALT_op_shr_long: /* 0xa4 */
10225/* File: arm/alt_stub.S */
10226/*
10227 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10228 * any interesting requests and then jump to the real instruction
10229 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10230 */
10231    .extern MterpCheckBefore
10232    EXPORT_PC
10233    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10234    adrl   lr, artMterpAsmInstructionStart + (164 * 128)       @ Addr of primary handler.
10235    mov    r0, rSELF
10236    add    r1, rFP, #OFF_FP_SHADOWFRAME
10237    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10238
10239/* ------------------------------ */
10240    .balign 128
10241.L_ALT_op_ushr_long: /* 0xa5 */
10242/* File: arm/alt_stub.S */
10243/*
10244 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10245 * any interesting requests and then jump to the real instruction
10246 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10247 */
10248    .extern MterpCheckBefore
10249    EXPORT_PC
10250    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10251    adrl   lr, artMterpAsmInstructionStart + (165 * 128)       @ Addr of primary handler.
10252    mov    r0, rSELF
10253    add    r1, rFP, #OFF_FP_SHADOWFRAME
10254    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10255
10256/* ------------------------------ */
10257    .balign 128
10258.L_ALT_op_add_float: /* 0xa6 */
10259/* File: arm/alt_stub.S */
10260/*
10261 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10262 * any interesting requests and then jump to the real instruction
10263 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10264 */
10265    .extern MterpCheckBefore
10266    EXPORT_PC
10267    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10268    adrl   lr, artMterpAsmInstructionStart + (166 * 128)       @ Addr of primary handler.
10269    mov    r0, rSELF
10270    add    r1, rFP, #OFF_FP_SHADOWFRAME
10271    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10272
10273/* ------------------------------ */
10274    .balign 128
10275.L_ALT_op_sub_float: /* 0xa7 */
10276/* File: arm/alt_stub.S */
10277/*
10278 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10279 * any interesting requests and then jump to the real instruction
10280 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10281 */
10282    .extern MterpCheckBefore
10283    EXPORT_PC
10284    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10285    adrl   lr, artMterpAsmInstructionStart + (167 * 128)       @ Addr of primary handler.
10286    mov    r0, rSELF
10287    add    r1, rFP, #OFF_FP_SHADOWFRAME
10288    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10289
10290/* ------------------------------ */
10291    .balign 128
10292.L_ALT_op_mul_float: /* 0xa8 */
10293/* File: arm/alt_stub.S */
10294/*
10295 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10296 * any interesting requests and then jump to the real instruction
10297 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10298 */
10299    .extern MterpCheckBefore
10300    EXPORT_PC
10301    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10302    adrl   lr, artMterpAsmInstructionStart + (168 * 128)       @ Addr of primary handler.
10303    mov    r0, rSELF
10304    add    r1, rFP, #OFF_FP_SHADOWFRAME
10305    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10306
10307/* ------------------------------ */
10308    .balign 128
10309.L_ALT_op_div_float: /* 0xa9 */
10310/* File: arm/alt_stub.S */
10311/*
10312 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10313 * any interesting requests and then jump to the real instruction
10314 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10315 */
10316    .extern MterpCheckBefore
10317    EXPORT_PC
10318    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10319    adrl   lr, artMterpAsmInstructionStart + (169 * 128)       @ Addr of primary handler.
10320    mov    r0, rSELF
10321    add    r1, rFP, #OFF_FP_SHADOWFRAME
10322    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10323
10324/* ------------------------------ */
10325    .balign 128
10326.L_ALT_op_rem_float: /* 0xaa */
10327/* File: arm/alt_stub.S */
10328/*
10329 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10330 * any interesting requests and then jump to the real instruction
10331 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10332 */
10333    .extern MterpCheckBefore
10334    EXPORT_PC
10335    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10336    adrl   lr, artMterpAsmInstructionStart + (170 * 128)       @ Addr of primary handler.
10337    mov    r0, rSELF
10338    add    r1, rFP, #OFF_FP_SHADOWFRAME
10339    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10340
10341/* ------------------------------ */
10342    .balign 128
10343.L_ALT_op_add_double: /* 0xab */
10344/* File: arm/alt_stub.S */
10345/*
10346 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10347 * any interesting requests and then jump to the real instruction
10348 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10349 */
10350    .extern MterpCheckBefore
10351    EXPORT_PC
10352    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10353    adrl   lr, artMterpAsmInstructionStart + (171 * 128)       @ Addr of primary handler.
10354    mov    r0, rSELF
10355    add    r1, rFP, #OFF_FP_SHADOWFRAME
10356    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10357
10358/* ------------------------------ */
10359    .balign 128
10360.L_ALT_op_sub_double: /* 0xac */
10361/* File: arm/alt_stub.S */
10362/*
10363 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10364 * any interesting requests and then jump to the real instruction
10365 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10366 */
10367    .extern MterpCheckBefore
10368    EXPORT_PC
10369    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10370    adrl   lr, artMterpAsmInstructionStart + (172 * 128)       @ Addr of primary handler.
10371    mov    r0, rSELF
10372    add    r1, rFP, #OFF_FP_SHADOWFRAME
10373    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10374
10375/* ------------------------------ */
10376    .balign 128
10377.L_ALT_op_mul_double: /* 0xad */
10378/* File: arm/alt_stub.S */
10379/*
10380 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10381 * any interesting requests and then jump to the real instruction
10382 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10383 */
10384    .extern MterpCheckBefore
10385    EXPORT_PC
10386    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10387    adrl   lr, artMterpAsmInstructionStart + (173 * 128)       @ Addr of primary handler.
10388    mov    r0, rSELF
10389    add    r1, rFP, #OFF_FP_SHADOWFRAME
10390    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10391
10392/* ------------------------------ */
10393    .balign 128
10394.L_ALT_op_div_double: /* 0xae */
10395/* File: arm/alt_stub.S */
10396/*
10397 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10398 * any interesting requests and then jump to the real instruction
10399 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10400 */
10401    .extern MterpCheckBefore
10402    EXPORT_PC
10403    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10404    adrl   lr, artMterpAsmInstructionStart + (174 * 128)       @ Addr of primary handler.
10405    mov    r0, rSELF
10406    add    r1, rFP, #OFF_FP_SHADOWFRAME
10407    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10408
10409/* ------------------------------ */
10410    .balign 128
10411.L_ALT_op_rem_double: /* 0xaf */
10412/* File: arm/alt_stub.S */
10413/*
10414 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10415 * any interesting requests and then jump to the real instruction
10416 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10417 */
10418    .extern MterpCheckBefore
10419    EXPORT_PC
10420    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10421    adrl   lr, artMterpAsmInstructionStart + (175 * 128)       @ Addr of primary handler.
10422    mov    r0, rSELF
10423    add    r1, rFP, #OFF_FP_SHADOWFRAME
10424    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10425
10426/* ------------------------------ */
10427    .balign 128
10428.L_ALT_op_add_int_2addr: /* 0xb0 */
10429/* File: arm/alt_stub.S */
10430/*
10431 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10432 * any interesting requests and then jump to the real instruction
10433 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10434 */
10435    .extern MterpCheckBefore
10436    EXPORT_PC
10437    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10438    adrl   lr, artMterpAsmInstructionStart + (176 * 128)       @ Addr of primary handler.
10439    mov    r0, rSELF
10440    add    r1, rFP, #OFF_FP_SHADOWFRAME
10441    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10442
10443/* ------------------------------ */
10444    .balign 128
10445.L_ALT_op_sub_int_2addr: /* 0xb1 */
10446/* File: arm/alt_stub.S */
10447/*
10448 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10449 * any interesting requests and then jump to the real instruction
10450 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10451 */
10452    .extern MterpCheckBefore
10453    EXPORT_PC
10454    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10455    adrl   lr, artMterpAsmInstructionStart + (177 * 128)       @ Addr of primary handler.
10456    mov    r0, rSELF
10457    add    r1, rFP, #OFF_FP_SHADOWFRAME
10458    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10459
10460/* ------------------------------ */
10461    .balign 128
10462.L_ALT_op_mul_int_2addr: /* 0xb2 */
10463/* File: arm/alt_stub.S */
10464/*
10465 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10466 * any interesting requests and then jump to the real instruction
10467 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10468 */
10469    .extern MterpCheckBefore
10470    EXPORT_PC
10471    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10472    adrl   lr, artMterpAsmInstructionStart + (178 * 128)       @ Addr of primary handler.
10473    mov    r0, rSELF
10474    add    r1, rFP, #OFF_FP_SHADOWFRAME
10475    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10476
10477/* ------------------------------ */
10478    .balign 128
10479.L_ALT_op_div_int_2addr: /* 0xb3 */
10480/* File: arm/alt_stub.S */
10481/*
10482 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10483 * any interesting requests and then jump to the real instruction
10484 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10485 */
10486    .extern MterpCheckBefore
10487    EXPORT_PC
10488    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10489    adrl   lr, artMterpAsmInstructionStart + (179 * 128)       @ Addr of primary handler.
10490    mov    r0, rSELF
10491    add    r1, rFP, #OFF_FP_SHADOWFRAME
10492    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10493
10494/* ------------------------------ */
10495    .balign 128
10496.L_ALT_op_rem_int_2addr: /* 0xb4 */
10497/* File: arm/alt_stub.S */
10498/*
10499 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10500 * any interesting requests and then jump to the real instruction
10501 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10502 */
10503    .extern MterpCheckBefore
10504    EXPORT_PC
10505    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10506    adrl   lr, artMterpAsmInstructionStart + (180 * 128)       @ Addr of primary handler.
10507    mov    r0, rSELF
10508    add    r1, rFP, #OFF_FP_SHADOWFRAME
10509    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10510
10511/* ------------------------------ */
10512    .balign 128
10513.L_ALT_op_and_int_2addr: /* 0xb5 */
10514/* File: arm/alt_stub.S */
10515/*
10516 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10517 * any interesting requests and then jump to the real instruction
10518 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10519 */
10520    .extern MterpCheckBefore
10521    EXPORT_PC
10522    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10523    adrl   lr, artMterpAsmInstructionStart + (181 * 128)       @ Addr of primary handler.
10524    mov    r0, rSELF
10525    add    r1, rFP, #OFF_FP_SHADOWFRAME
10526    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10527
10528/* ------------------------------ */
10529    .balign 128
10530.L_ALT_op_or_int_2addr: /* 0xb6 */
10531/* File: arm/alt_stub.S */
10532/*
10533 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10534 * any interesting requests and then jump to the real instruction
10535 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10536 */
10537    .extern MterpCheckBefore
10538    EXPORT_PC
10539    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10540    adrl   lr, artMterpAsmInstructionStart + (182 * 128)       @ Addr of primary handler.
10541    mov    r0, rSELF
10542    add    r1, rFP, #OFF_FP_SHADOWFRAME
10543    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10544
10545/* ------------------------------ */
10546    .balign 128
10547.L_ALT_op_xor_int_2addr: /* 0xb7 */
10548/* File: arm/alt_stub.S */
10549/*
10550 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10551 * any interesting requests and then jump to the real instruction
10552 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10553 */
10554    .extern MterpCheckBefore
10555    EXPORT_PC
10556    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10557    adrl   lr, artMterpAsmInstructionStart + (183 * 128)       @ Addr of primary handler.
10558    mov    r0, rSELF
10559    add    r1, rFP, #OFF_FP_SHADOWFRAME
10560    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10561
10562/* ------------------------------ */
10563    .balign 128
10564.L_ALT_op_shl_int_2addr: /* 0xb8 */
10565/* File: arm/alt_stub.S */
10566/*
10567 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10568 * any interesting requests and then jump to the real instruction
10569 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10570 */
10571    .extern MterpCheckBefore
10572    EXPORT_PC
10573    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10574    adrl   lr, artMterpAsmInstructionStart + (184 * 128)       @ Addr of primary handler.
10575    mov    r0, rSELF
10576    add    r1, rFP, #OFF_FP_SHADOWFRAME
10577    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10578
10579/* ------------------------------ */
10580    .balign 128
10581.L_ALT_op_shr_int_2addr: /* 0xb9 */
10582/* File: arm/alt_stub.S */
10583/*
10584 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10585 * any interesting requests and then jump to the real instruction
10586 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10587 */
10588    .extern MterpCheckBefore
10589    EXPORT_PC
10590    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10591    adrl   lr, artMterpAsmInstructionStart + (185 * 128)       @ Addr of primary handler.
10592    mov    r0, rSELF
10593    add    r1, rFP, #OFF_FP_SHADOWFRAME
10594    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10595
10596/* ------------------------------ */
10597    .balign 128
10598.L_ALT_op_ushr_int_2addr: /* 0xba */
10599/* File: arm/alt_stub.S */
10600/*
10601 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10602 * any interesting requests and then jump to the real instruction
10603 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10604 */
10605    .extern MterpCheckBefore
10606    EXPORT_PC
10607    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10608    adrl   lr, artMterpAsmInstructionStart + (186 * 128)       @ Addr of primary handler.
10609    mov    r0, rSELF
10610    add    r1, rFP, #OFF_FP_SHADOWFRAME
10611    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10612
10613/* ------------------------------ */
10614    .balign 128
10615.L_ALT_op_add_long_2addr: /* 0xbb */
10616/* File: arm/alt_stub.S */
10617/*
10618 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10619 * any interesting requests and then jump to the real instruction
10620 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10621 */
10622    .extern MterpCheckBefore
10623    EXPORT_PC
10624    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10625    adrl   lr, artMterpAsmInstructionStart + (187 * 128)       @ Addr of primary handler.
10626    mov    r0, rSELF
10627    add    r1, rFP, #OFF_FP_SHADOWFRAME
10628    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10629
10630/* ------------------------------ */
10631    .balign 128
10632.L_ALT_op_sub_long_2addr: /* 0xbc */
10633/* File: arm/alt_stub.S */
10634/*
10635 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10636 * any interesting requests and then jump to the real instruction
10637 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10638 */
10639    .extern MterpCheckBefore
10640    EXPORT_PC
10641    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10642    adrl   lr, artMterpAsmInstructionStart + (188 * 128)       @ Addr of primary handler.
10643    mov    r0, rSELF
10644    add    r1, rFP, #OFF_FP_SHADOWFRAME
10645    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10646
10647/* ------------------------------ */
10648    .balign 128
10649.L_ALT_op_mul_long_2addr: /* 0xbd */
10650/* File: arm/alt_stub.S */
10651/*
10652 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10653 * any interesting requests and then jump to the real instruction
10654 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10655 */
10656    .extern MterpCheckBefore
10657    EXPORT_PC
10658    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10659    adrl   lr, artMterpAsmInstructionStart + (189 * 128)       @ Addr of primary handler.
10660    mov    r0, rSELF
10661    add    r1, rFP, #OFF_FP_SHADOWFRAME
10662    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10663
10664/* ------------------------------ */
10665    .balign 128
10666.L_ALT_op_div_long_2addr: /* 0xbe */
10667/* File: arm/alt_stub.S */
10668/*
10669 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10670 * any interesting requests and then jump to the real instruction
10671 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10672 */
10673    .extern MterpCheckBefore
10674    EXPORT_PC
10675    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10676    adrl   lr, artMterpAsmInstructionStart + (190 * 128)       @ Addr of primary handler.
10677    mov    r0, rSELF
10678    add    r1, rFP, #OFF_FP_SHADOWFRAME
10679    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10680
10681/* ------------------------------ */
10682    .balign 128
10683.L_ALT_op_rem_long_2addr: /* 0xbf */
10684/* File: arm/alt_stub.S */
10685/*
10686 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10687 * any interesting requests and then jump to the real instruction
10688 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10689 */
10690    .extern MterpCheckBefore
10691    EXPORT_PC
10692    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10693    adrl   lr, artMterpAsmInstructionStart + (191 * 128)       @ Addr of primary handler.
10694    mov    r0, rSELF
10695    add    r1, rFP, #OFF_FP_SHADOWFRAME
10696    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10697
10698/* ------------------------------ */
10699    .balign 128
10700.L_ALT_op_and_long_2addr: /* 0xc0 */
10701/* File: arm/alt_stub.S */
10702/*
10703 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10704 * any interesting requests and then jump to the real instruction
10705 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10706 */
10707    .extern MterpCheckBefore
10708    EXPORT_PC
10709    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10710    adrl   lr, artMterpAsmInstructionStart + (192 * 128)       @ Addr of primary handler.
10711    mov    r0, rSELF
10712    add    r1, rFP, #OFF_FP_SHADOWFRAME
10713    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10714
10715/* ------------------------------ */
10716    .balign 128
10717.L_ALT_op_or_long_2addr: /* 0xc1 */
10718/* File: arm/alt_stub.S */
10719/*
10720 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10721 * any interesting requests and then jump to the real instruction
10722 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10723 */
10724    .extern MterpCheckBefore
10725    EXPORT_PC
10726    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10727    adrl   lr, artMterpAsmInstructionStart + (193 * 128)       @ Addr of primary handler.
10728    mov    r0, rSELF
10729    add    r1, rFP, #OFF_FP_SHADOWFRAME
10730    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10731
10732/* ------------------------------ */
10733    .balign 128
10734.L_ALT_op_xor_long_2addr: /* 0xc2 */
10735/* File: arm/alt_stub.S */
10736/*
10737 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10738 * any interesting requests and then jump to the real instruction
10739 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10740 */
10741    .extern MterpCheckBefore
10742    EXPORT_PC
10743    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10744    adrl   lr, artMterpAsmInstructionStart + (194 * 128)       @ Addr of primary handler.
10745    mov    r0, rSELF
10746    add    r1, rFP, #OFF_FP_SHADOWFRAME
10747    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10748
10749/* ------------------------------ */
10750    .balign 128
10751.L_ALT_op_shl_long_2addr: /* 0xc3 */
10752/* File: arm/alt_stub.S */
10753/*
10754 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10755 * any interesting requests and then jump to the real instruction
10756 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10757 */
10758    .extern MterpCheckBefore
10759    EXPORT_PC
10760    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10761    adrl   lr, artMterpAsmInstructionStart + (195 * 128)       @ Addr of primary handler.
10762    mov    r0, rSELF
10763    add    r1, rFP, #OFF_FP_SHADOWFRAME
10764    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10765
10766/* ------------------------------ */
10767    .balign 128
10768.L_ALT_op_shr_long_2addr: /* 0xc4 */
10769/* File: arm/alt_stub.S */
10770/*
10771 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10772 * any interesting requests and then jump to the real instruction
10773 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10774 */
10775    .extern MterpCheckBefore
10776    EXPORT_PC
10777    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10778    adrl   lr, artMterpAsmInstructionStart + (196 * 128)       @ Addr of primary handler.
10779    mov    r0, rSELF
10780    add    r1, rFP, #OFF_FP_SHADOWFRAME
10781    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10782
10783/* ------------------------------ */
10784    .balign 128
10785.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10786/* File: arm/alt_stub.S */
10787/*
10788 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10789 * any interesting requests and then jump to the real instruction
10790 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10791 */
10792    .extern MterpCheckBefore
10793    EXPORT_PC
10794    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10795    adrl   lr, artMterpAsmInstructionStart + (197 * 128)       @ Addr of primary handler.
10796    mov    r0, rSELF
10797    add    r1, rFP, #OFF_FP_SHADOWFRAME
10798    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10799
10800/* ------------------------------ */
10801    .balign 128
10802.L_ALT_op_add_float_2addr: /* 0xc6 */
10803/* File: arm/alt_stub.S */
10804/*
10805 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10806 * any interesting requests and then jump to the real instruction
10807 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10808 */
10809    .extern MterpCheckBefore
10810    EXPORT_PC
10811    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10812    adrl   lr, artMterpAsmInstructionStart + (198 * 128)       @ Addr of primary handler.
10813    mov    r0, rSELF
10814    add    r1, rFP, #OFF_FP_SHADOWFRAME
10815    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10816
10817/* ------------------------------ */
10818    .balign 128
10819.L_ALT_op_sub_float_2addr: /* 0xc7 */
10820/* File: arm/alt_stub.S */
10821/*
10822 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10823 * any interesting requests and then jump to the real instruction
10824 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10825 */
10826    .extern MterpCheckBefore
10827    EXPORT_PC
10828    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10829    adrl   lr, artMterpAsmInstructionStart + (199 * 128)       @ Addr of primary handler.
10830    mov    r0, rSELF
10831    add    r1, rFP, #OFF_FP_SHADOWFRAME
10832    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10833
10834/* ------------------------------ */
10835    .balign 128
10836.L_ALT_op_mul_float_2addr: /* 0xc8 */
10837/* File: arm/alt_stub.S */
10838/*
10839 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10840 * any interesting requests and then jump to the real instruction
10841 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10842 */
10843    .extern MterpCheckBefore
10844    EXPORT_PC
10845    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10846    adrl   lr, artMterpAsmInstructionStart + (200 * 128)       @ Addr of primary handler.
10847    mov    r0, rSELF
10848    add    r1, rFP, #OFF_FP_SHADOWFRAME
10849    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10850
10851/* ------------------------------ */
10852    .balign 128
10853.L_ALT_op_div_float_2addr: /* 0xc9 */
10854/* File: arm/alt_stub.S */
10855/*
10856 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10857 * any interesting requests and then jump to the real instruction
10858 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10859 */
10860    .extern MterpCheckBefore
10861    EXPORT_PC
10862    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10863    adrl   lr, artMterpAsmInstructionStart + (201 * 128)       @ Addr of primary handler.
10864    mov    r0, rSELF
10865    add    r1, rFP, #OFF_FP_SHADOWFRAME
10866    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10867
10868/* ------------------------------ */
10869    .balign 128
10870.L_ALT_op_rem_float_2addr: /* 0xca */
10871/* File: arm/alt_stub.S */
10872/*
10873 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10874 * any interesting requests and then jump to the real instruction
10875 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10876 */
10877    .extern MterpCheckBefore
10878    EXPORT_PC
10879    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10880    adrl   lr, artMterpAsmInstructionStart + (202 * 128)       @ Addr of primary handler.
10881    mov    r0, rSELF
10882    add    r1, rFP, #OFF_FP_SHADOWFRAME
10883    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10884
10885/* ------------------------------ */
10886    .balign 128
10887.L_ALT_op_add_double_2addr: /* 0xcb */
10888/* File: arm/alt_stub.S */
10889/*
10890 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10891 * any interesting requests and then jump to the real instruction
10892 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10893 */
10894    .extern MterpCheckBefore
10895    EXPORT_PC
10896    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10897    adrl   lr, artMterpAsmInstructionStart + (203 * 128)       @ Addr of primary handler.
10898    mov    r0, rSELF
10899    add    r1, rFP, #OFF_FP_SHADOWFRAME
10900    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10901
10902/* ------------------------------ */
10903    .balign 128
10904.L_ALT_op_sub_double_2addr: /* 0xcc */
10905/* File: arm/alt_stub.S */
10906/*
10907 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10908 * any interesting requests and then jump to the real instruction
10909 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10910 */
10911    .extern MterpCheckBefore
10912    EXPORT_PC
10913    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10914    adrl   lr, artMterpAsmInstructionStart + (204 * 128)       @ Addr of primary handler.
10915    mov    r0, rSELF
10916    add    r1, rFP, #OFF_FP_SHADOWFRAME
10917    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10918
10919/* ------------------------------ */
10920    .balign 128
10921.L_ALT_op_mul_double_2addr: /* 0xcd */
10922/* File: arm/alt_stub.S */
10923/*
10924 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10925 * any interesting requests and then jump to the real instruction
10926 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10927 */
10928    .extern MterpCheckBefore
10929    EXPORT_PC
10930    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10931    adrl   lr, artMterpAsmInstructionStart + (205 * 128)       @ Addr of primary handler.
10932    mov    r0, rSELF
10933    add    r1, rFP, #OFF_FP_SHADOWFRAME
10934    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10935
10936/* ------------------------------ */
10937    .balign 128
10938.L_ALT_op_div_double_2addr: /* 0xce */
10939/* File: arm/alt_stub.S */
10940/*
10941 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10942 * any interesting requests and then jump to the real instruction
10943 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10944 */
10945    .extern MterpCheckBefore
10946    EXPORT_PC
10947    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10948    adrl   lr, artMterpAsmInstructionStart + (206 * 128)       @ Addr of primary handler.
10949    mov    r0, rSELF
10950    add    r1, rFP, #OFF_FP_SHADOWFRAME
10951    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10952
10953/* ------------------------------ */
10954    .balign 128
10955.L_ALT_op_rem_double_2addr: /* 0xcf */
10956/* File: arm/alt_stub.S */
10957/*
10958 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10959 * any interesting requests and then jump to the real instruction
10960 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10961 */
10962    .extern MterpCheckBefore
10963    EXPORT_PC
10964    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10965    adrl   lr, artMterpAsmInstructionStart + (207 * 128)       @ Addr of primary handler.
10966    mov    r0, rSELF
10967    add    r1, rFP, #OFF_FP_SHADOWFRAME
10968    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10969
10970/* ------------------------------ */
10971    .balign 128
10972.L_ALT_op_add_int_lit16: /* 0xd0 */
10973/* File: arm/alt_stub.S */
10974/*
10975 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10976 * any interesting requests and then jump to the real instruction
10977 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10978 */
10979    .extern MterpCheckBefore
10980    EXPORT_PC
10981    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10982    adrl   lr, artMterpAsmInstructionStart + (208 * 128)       @ Addr of primary handler.
10983    mov    r0, rSELF
10984    add    r1, rFP, #OFF_FP_SHADOWFRAME
10985    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
10986
10987/* ------------------------------ */
10988    .balign 128
10989.L_ALT_op_rsub_int: /* 0xd1 */
10990/* File: arm/alt_stub.S */
10991/*
10992 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
10993 * any interesting requests and then jump to the real instruction
10994 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
10995 */
10996    .extern MterpCheckBefore
10997    EXPORT_PC
10998    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
10999    adrl   lr, artMterpAsmInstructionStart + (209 * 128)       @ Addr of primary handler.
11000    mov    r0, rSELF
11001    add    r1, rFP, #OFF_FP_SHADOWFRAME
11002    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11003
11004/* ------------------------------ */
11005    .balign 128
11006.L_ALT_op_mul_int_lit16: /* 0xd2 */
11007/* File: arm/alt_stub.S */
11008/*
11009 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11010 * any interesting requests and then jump to the real instruction
11011 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11012 */
11013    .extern MterpCheckBefore
11014    EXPORT_PC
11015    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11016    adrl   lr, artMterpAsmInstructionStart + (210 * 128)       @ Addr of primary handler.
11017    mov    r0, rSELF
11018    add    r1, rFP, #OFF_FP_SHADOWFRAME
11019    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11020
11021/* ------------------------------ */
11022    .balign 128
11023.L_ALT_op_div_int_lit16: /* 0xd3 */
11024/* File: arm/alt_stub.S */
11025/*
11026 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11027 * any interesting requests and then jump to the real instruction
11028 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11029 */
11030    .extern MterpCheckBefore
11031    EXPORT_PC
11032    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11033    adrl   lr, artMterpAsmInstructionStart + (211 * 128)       @ Addr of primary handler.
11034    mov    r0, rSELF
11035    add    r1, rFP, #OFF_FP_SHADOWFRAME
11036    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11037
11038/* ------------------------------ */
11039    .balign 128
11040.L_ALT_op_rem_int_lit16: /* 0xd4 */
11041/* File: arm/alt_stub.S */
11042/*
11043 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11044 * any interesting requests and then jump to the real instruction
11045 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11046 */
11047    .extern MterpCheckBefore
11048    EXPORT_PC
11049    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11050    adrl   lr, artMterpAsmInstructionStart + (212 * 128)       @ Addr of primary handler.
11051    mov    r0, rSELF
11052    add    r1, rFP, #OFF_FP_SHADOWFRAME
11053    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11054
11055/* ------------------------------ */
11056    .balign 128
11057.L_ALT_op_and_int_lit16: /* 0xd5 */
11058/* File: arm/alt_stub.S */
11059/*
11060 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11061 * any interesting requests and then jump to the real instruction
11062 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11063 */
11064    .extern MterpCheckBefore
11065    EXPORT_PC
11066    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11067    adrl   lr, artMterpAsmInstructionStart + (213 * 128)       @ Addr of primary handler.
11068    mov    r0, rSELF
11069    add    r1, rFP, #OFF_FP_SHADOWFRAME
11070    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11071
11072/* ------------------------------ */
11073    .balign 128
11074.L_ALT_op_or_int_lit16: /* 0xd6 */
11075/* File: arm/alt_stub.S */
11076/*
11077 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11078 * any interesting requests and then jump to the real instruction
11079 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11080 */
11081    .extern MterpCheckBefore
11082    EXPORT_PC
11083    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11084    adrl   lr, artMterpAsmInstructionStart + (214 * 128)       @ Addr of primary handler.
11085    mov    r0, rSELF
11086    add    r1, rFP, #OFF_FP_SHADOWFRAME
11087    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11088
11089/* ------------------------------ */
11090    .balign 128
11091.L_ALT_op_xor_int_lit16: /* 0xd7 */
11092/* File: arm/alt_stub.S */
11093/*
11094 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11095 * any interesting requests and then jump to the real instruction
11096 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11097 */
11098    .extern MterpCheckBefore
11099    EXPORT_PC
11100    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11101    adrl   lr, artMterpAsmInstructionStart + (215 * 128)       @ Addr of primary handler.
11102    mov    r0, rSELF
11103    add    r1, rFP, #OFF_FP_SHADOWFRAME
11104    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11105
11106/* ------------------------------ */
11107    .balign 128
11108.L_ALT_op_add_int_lit8: /* 0xd8 */
11109/* File: arm/alt_stub.S */
11110/*
11111 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11112 * any interesting requests and then jump to the real instruction
11113 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11114 */
11115    .extern MterpCheckBefore
11116    EXPORT_PC
11117    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11118    adrl   lr, artMterpAsmInstructionStart + (216 * 128)       @ Addr of primary handler.
11119    mov    r0, rSELF
11120    add    r1, rFP, #OFF_FP_SHADOWFRAME
11121    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11122
11123/* ------------------------------ */
11124    .balign 128
11125.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11126/* File: arm/alt_stub.S */
11127/*
11128 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11129 * any interesting requests and then jump to the real instruction
11130 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11131 */
11132    .extern MterpCheckBefore
11133    EXPORT_PC
11134    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11135    adrl   lr, artMterpAsmInstructionStart + (217 * 128)       @ Addr of primary handler.
11136    mov    r0, rSELF
11137    add    r1, rFP, #OFF_FP_SHADOWFRAME
11138    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11139
11140/* ------------------------------ */
11141    .balign 128
11142.L_ALT_op_mul_int_lit8: /* 0xda */
11143/* File: arm/alt_stub.S */
11144/*
11145 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11146 * any interesting requests and then jump to the real instruction
11147 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11148 */
11149    .extern MterpCheckBefore
11150    EXPORT_PC
11151    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11152    adrl   lr, artMterpAsmInstructionStart + (218 * 128)       @ Addr of primary handler.
11153    mov    r0, rSELF
11154    add    r1, rFP, #OFF_FP_SHADOWFRAME
11155    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11156
11157/* ------------------------------ */
11158    .balign 128
11159.L_ALT_op_div_int_lit8: /* 0xdb */
11160/* File: arm/alt_stub.S */
11161/*
11162 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11163 * any interesting requests and then jump to the real instruction
11164 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11165 */
11166    .extern MterpCheckBefore
11167    EXPORT_PC
11168    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11169    adrl   lr, artMterpAsmInstructionStart + (219 * 128)       @ Addr of primary handler.
11170    mov    r0, rSELF
11171    add    r1, rFP, #OFF_FP_SHADOWFRAME
11172    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11173
11174/* ------------------------------ */
11175    .balign 128
11176.L_ALT_op_rem_int_lit8: /* 0xdc */
11177/* File: arm/alt_stub.S */
11178/*
11179 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11180 * any interesting requests and then jump to the real instruction
11181 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11182 */
11183    .extern MterpCheckBefore
11184    EXPORT_PC
11185    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11186    adrl   lr, artMterpAsmInstructionStart + (220 * 128)       @ Addr of primary handler.
11187    mov    r0, rSELF
11188    add    r1, rFP, #OFF_FP_SHADOWFRAME
11189    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11190
11191/* ------------------------------ */
11192    .balign 128
11193.L_ALT_op_and_int_lit8: /* 0xdd */
11194/* File: arm/alt_stub.S */
11195/*
11196 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11197 * any interesting requests and then jump to the real instruction
11198 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11199 */
11200    .extern MterpCheckBefore
11201    EXPORT_PC
11202    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11203    adrl   lr, artMterpAsmInstructionStart + (221 * 128)       @ Addr of primary handler.
11204    mov    r0, rSELF
11205    add    r1, rFP, #OFF_FP_SHADOWFRAME
11206    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11207
11208/* ------------------------------ */
11209    .balign 128
11210.L_ALT_op_or_int_lit8: /* 0xde */
11211/* File: arm/alt_stub.S */
11212/*
11213 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11214 * any interesting requests and then jump to the real instruction
11215 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11216 */
11217    .extern MterpCheckBefore
11218    EXPORT_PC
11219    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11220    adrl   lr, artMterpAsmInstructionStart + (222 * 128)       @ Addr of primary handler.
11221    mov    r0, rSELF
11222    add    r1, rFP, #OFF_FP_SHADOWFRAME
11223    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11224
11225/* ------------------------------ */
11226    .balign 128
11227.L_ALT_op_xor_int_lit8: /* 0xdf */
11228/* File: arm/alt_stub.S */
11229/*
11230 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11231 * any interesting requests and then jump to the real instruction
11232 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11233 */
11234    .extern MterpCheckBefore
11235    EXPORT_PC
11236    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11237    adrl   lr, artMterpAsmInstructionStart + (223 * 128)       @ Addr of primary handler.
11238    mov    r0, rSELF
11239    add    r1, rFP, #OFF_FP_SHADOWFRAME
11240    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11241
11242/* ------------------------------ */
11243    .balign 128
11244.L_ALT_op_shl_int_lit8: /* 0xe0 */
11245/* File: arm/alt_stub.S */
11246/*
11247 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11248 * any interesting requests and then jump to the real instruction
11249 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11250 */
11251    .extern MterpCheckBefore
11252    EXPORT_PC
11253    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11254    adrl   lr, artMterpAsmInstructionStart + (224 * 128)       @ Addr of primary handler.
11255    mov    r0, rSELF
11256    add    r1, rFP, #OFF_FP_SHADOWFRAME
11257    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11258
11259/* ------------------------------ */
11260    .balign 128
11261.L_ALT_op_shr_int_lit8: /* 0xe1 */
11262/* File: arm/alt_stub.S */
11263/*
11264 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11265 * any interesting requests and then jump to the real instruction
11266 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11267 */
11268    .extern MterpCheckBefore
11269    EXPORT_PC
11270    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11271    adrl   lr, artMterpAsmInstructionStart + (225 * 128)       @ Addr of primary handler.
11272    mov    r0, rSELF
11273    add    r1, rFP, #OFF_FP_SHADOWFRAME
11274    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11275
11276/* ------------------------------ */
11277    .balign 128
11278.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11279/* File: arm/alt_stub.S */
11280/*
11281 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11282 * any interesting requests and then jump to the real instruction
11283 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11284 */
11285    .extern MterpCheckBefore
11286    EXPORT_PC
11287    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11288    adrl   lr, artMterpAsmInstructionStart + (226 * 128)       @ Addr of primary handler.
11289    mov    r0, rSELF
11290    add    r1, rFP, #OFF_FP_SHADOWFRAME
11291    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11292
11293/* ------------------------------ */
11294    .balign 128
11295.L_ALT_op_iget_quick: /* 0xe3 */
11296/* File: arm/alt_stub.S */
11297/*
11298 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11299 * any interesting requests and then jump to the real instruction
11300 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11301 */
11302    .extern MterpCheckBefore
11303    EXPORT_PC
11304    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11305    adrl   lr, artMterpAsmInstructionStart + (227 * 128)       @ Addr of primary handler.
11306    mov    r0, rSELF
11307    add    r1, rFP, #OFF_FP_SHADOWFRAME
11308    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11309
11310/* ------------------------------ */
11311    .balign 128
11312.L_ALT_op_iget_wide_quick: /* 0xe4 */
11313/* File: arm/alt_stub.S */
11314/*
11315 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11316 * any interesting requests and then jump to the real instruction
11317 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11318 */
11319    .extern MterpCheckBefore
11320    EXPORT_PC
11321    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11322    adrl   lr, artMterpAsmInstructionStart + (228 * 128)       @ Addr of primary handler.
11323    mov    r0, rSELF
11324    add    r1, rFP, #OFF_FP_SHADOWFRAME
11325    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11326
11327/* ------------------------------ */
11328    .balign 128
11329.L_ALT_op_iget_object_quick: /* 0xe5 */
11330/* File: arm/alt_stub.S */
11331/*
11332 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11333 * any interesting requests and then jump to the real instruction
11334 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11335 */
11336    .extern MterpCheckBefore
11337    EXPORT_PC
11338    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11339    adrl   lr, artMterpAsmInstructionStart + (229 * 128)       @ Addr of primary handler.
11340    mov    r0, rSELF
11341    add    r1, rFP, #OFF_FP_SHADOWFRAME
11342    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11343
11344/* ------------------------------ */
11345    .balign 128
11346.L_ALT_op_iput_quick: /* 0xe6 */
11347/* File: arm/alt_stub.S */
11348/*
11349 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11350 * any interesting requests and then jump to the real instruction
11351 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11352 */
11353    .extern MterpCheckBefore
11354    EXPORT_PC
11355    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11356    adrl   lr, artMterpAsmInstructionStart + (230 * 128)       @ Addr of primary handler.
11357    mov    r0, rSELF
11358    add    r1, rFP, #OFF_FP_SHADOWFRAME
11359    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11360
11361/* ------------------------------ */
11362    .balign 128
11363.L_ALT_op_iput_wide_quick: /* 0xe7 */
11364/* File: arm/alt_stub.S */
11365/*
11366 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11367 * any interesting requests and then jump to the real instruction
11368 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11369 */
11370    .extern MterpCheckBefore
11371    EXPORT_PC
11372    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11373    adrl   lr, artMterpAsmInstructionStart + (231 * 128)       @ Addr of primary handler.
11374    mov    r0, rSELF
11375    add    r1, rFP, #OFF_FP_SHADOWFRAME
11376    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11377
11378/* ------------------------------ */
11379    .balign 128
11380.L_ALT_op_iput_object_quick: /* 0xe8 */
11381/* File: arm/alt_stub.S */
11382/*
11383 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11384 * any interesting requests and then jump to the real instruction
11385 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11386 */
11387    .extern MterpCheckBefore
11388    EXPORT_PC
11389    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11390    adrl   lr, artMterpAsmInstructionStart + (232 * 128)       @ Addr of primary handler.
11391    mov    r0, rSELF
11392    add    r1, rFP, #OFF_FP_SHADOWFRAME
11393    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11394
11395/* ------------------------------ */
11396    .balign 128
11397.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11398/* File: arm/alt_stub.S */
11399/*
11400 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11401 * any interesting requests and then jump to the real instruction
11402 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11403 */
11404    .extern MterpCheckBefore
11405    EXPORT_PC
11406    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11407    adrl   lr, artMterpAsmInstructionStart + (233 * 128)       @ Addr of primary handler.
11408    mov    r0, rSELF
11409    add    r1, rFP, #OFF_FP_SHADOWFRAME
11410    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11411
11412/* ------------------------------ */
11413    .balign 128
11414.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11415/* File: arm/alt_stub.S */
11416/*
11417 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11418 * any interesting requests and then jump to the real instruction
11419 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11420 */
11421    .extern MterpCheckBefore
11422    EXPORT_PC
11423    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11424    adrl   lr, artMterpAsmInstructionStart + (234 * 128)       @ Addr of primary handler.
11425    mov    r0, rSELF
11426    add    r1, rFP, #OFF_FP_SHADOWFRAME
11427    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11428
11429/* ------------------------------ */
11430    .balign 128
11431.L_ALT_op_iput_boolean_quick: /* 0xeb */
11432/* File: arm/alt_stub.S */
11433/*
11434 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11435 * any interesting requests and then jump to the real instruction
11436 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11437 */
11438    .extern MterpCheckBefore
11439    EXPORT_PC
11440    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11441    adrl   lr, artMterpAsmInstructionStart + (235 * 128)       @ Addr of primary handler.
11442    mov    r0, rSELF
11443    add    r1, rFP, #OFF_FP_SHADOWFRAME
11444    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11445
11446/* ------------------------------ */
11447    .balign 128
11448.L_ALT_op_iput_byte_quick: /* 0xec */
11449/* File: arm/alt_stub.S */
11450/*
11451 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11452 * any interesting requests and then jump to the real instruction
11453 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11454 */
11455    .extern MterpCheckBefore
11456    EXPORT_PC
11457    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11458    adrl   lr, artMterpAsmInstructionStart + (236 * 128)       @ Addr of primary handler.
11459    mov    r0, rSELF
11460    add    r1, rFP, #OFF_FP_SHADOWFRAME
11461    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11462
11463/* ------------------------------ */
11464    .balign 128
11465.L_ALT_op_iput_char_quick: /* 0xed */
11466/* File: arm/alt_stub.S */
11467/*
11468 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11469 * any interesting requests and then jump to the real instruction
11470 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11471 */
11472    .extern MterpCheckBefore
11473    EXPORT_PC
11474    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11475    adrl   lr, artMterpAsmInstructionStart + (237 * 128)       @ Addr of primary handler.
11476    mov    r0, rSELF
11477    add    r1, rFP, #OFF_FP_SHADOWFRAME
11478    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11479
11480/* ------------------------------ */
11481    .balign 128
11482.L_ALT_op_iput_short_quick: /* 0xee */
11483/* File: arm/alt_stub.S */
11484/*
11485 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11486 * any interesting requests and then jump to the real instruction
11487 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11488 */
11489    .extern MterpCheckBefore
11490    EXPORT_PC
11491    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11492    adrl   lr, artMterpAsmInstructionStart + (238 * 128)       @ Addr of primary handler.
11493    mov    r0, rSELF
11494    add    r1, rFP, #OFF_FP_SHADOWFRAME
11495    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11496
11497/* ------------------------------ */
11498    .balign 128
11499.L_ALT_op_iget_boolean_quick: /* 0xef */
11500/* File: arm/alt_stub.S */
11501/*
11502 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11503 * any interesting requests and then jump to the real instruction
11504 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11505 */
11506    .extern MterpCheckBefore
11507    EXPORT_PC
11508    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11509    adrl   lr, artMterpAsmInstructionStart + (239 * 128)       @ Addr of primary handler.
11510    mov    r0, rSELF
11511    add    r1, rFP, #OFF_FP_SHADOWFRAME
11512    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11513
11514/* ------------------------------ */
11515    .balign 128
11516.L_ALT_op_iget_byte_quick: /* 0xf0 */
11517/* File: arm/alt_stub.S */
11518/*
11519 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11520 * any interesting requests and then jump to the real instruction
11521 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11522 */
11523    .extern MterpCheckBefore
11524    EXPORT_PC
11525    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11526    adrl   lr, artMterpAsmInstructionStart + (240 * 128)       @ Addr of primary handler.
11527    mov    r0, rSELF
11528    add    r1, rFP, #OFF_FP_SHADOWFRAME
11529    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11530
11531/* ------------------------------ */
11532    .balign 128
11533.L_ALT_op_iget_char_quick: /* 0xf1 */
11534/* File: arm/alt_stub.S */
11535/*
11536 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11537 * any interesting requests and then jump to the real instruction
11538 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11539 */
11540    .extern MterpCheckBefore
11541    EXPORT_PC
11542    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11543    adrl   lr, artMterpAsmInstructionStart + (241 * 128)       @ Addr of primary handler.
11544    mov    r0, rSELF
11545    add    r1, rFP, #OFF_FP_SHADOWFRAME
11546    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11547
11548/* ------------------------------ */
11549    .balign 128
11550.L_ALT_op_iget_short_quick: /* 0xf2 */
11551/* File: arm/alt_stub.S */
11552/*
11553 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11554 * any interesting requests and then jump to the real instruction
11555 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11556 */
11557    .extern MterpCheckBefore
11558    EXPORT_PC
11559    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11560    adrl   lr, artMterpAsmInstructionStart + (242 * 128)       @ Addr of primary handler.
11561    mov    r0, rSELF
11562    add    r1, rFP, #OFF_FP_SHADOWFRAME
11563    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11564
11565/* ------------------------------ */
11566    .balign 128
11567.L_ALT_op_invoke_lambda: /* 0xf3 */
11568/* File: arm/alt_stub.S */
11569/*
11570 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11571 * any interesting requests and then jump to the real instruction
11572 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11573 */
11574    .extern MterpCheckBefore
11575    EXPORT_PC
11576    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11577    adrl   lr, artMterpAsmInstructionStart + (243 * 128)       @ Addr of primary handler.
11578    mov    r0, rSELF
11579    add    r1, rFP, #OFF_FP_SHADOWFRAME
11580    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11581
11582/* ------------------------------ */
11583    .balign 128
11584.L_ALT_op_unused_f4: /* 0xf4 */
11585/* File: arm/alt_stub.S */
11586/*
11587 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11588 * any interesting requests and then jump to the real instruction
11589 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11590 */
11591    .extern MterpCheckBefore
11592    EXPORT_PC
11593    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11594    adrl   lr, artMterpAsmInstructionStart + (244 * 128)       @ Addr of primary handler.
11595    mov    r0, rSELF
11596    add    r1, rFP, #OFF_FP_SHADOWFRAME
11597    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11598
11599/* ------------------------------ */
11600    .balign 128
11601.L_ALT_op_capture_variable: /* 0xf5 */
11602/* File: arm/alt_stub.S */
11603/*
11604 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11605 * any interesting requests and then jump to the real instruction
11606 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11607 */
11608    .extern MterpCheckBefore
11609    EXPORT_PC
11610    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11611    adrl   lr, artMterpAsmInstructionStart + (245 * 128)       @ Addr of primary handler.
11612    mov    r0, rSELF
11613    add    r1, rFP, #OFF_FP_SHADOWFRAME
11614    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11615
11616/* ------------------------------ */
11617    .balign 128
11618.L_ALT_op_create_lambda: /* 0xf6 */
11619/* File: arm/alt_stub.S */
11620/*
11621 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11622 * any interesting requests and then jump to the real instruction
11623 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11624 */
11625    .extern MterpCheckBefore
11626    EXPORT_PC
11627    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11628    adrl   lr, artMterpAsmInstructionStart + (246 * 128)       @ Addr of primary handler.
11629    mov    r0, rSELF
11630    add    r1, rFP, #OFF_FP_SHADOWFRAME
11631    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11632
11633/* ------------------------------ */
11634    .balign 128
11635.L_ALT_op_liberate_variable: /* 0xf7 */
11636/* File: arm/alt_stub.S */
11637/*
11638 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11639 * any interesting requests and then jump to the real instruction
11640 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11641 */
11642    .extern MterpCheckBefore
11643    EXPORT_PC
11644    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11645    adrl   lr, artMterpAsmInstructionStart + (247 * 128)       @ Addr of primary handler.
11646    mov    r0, rSELF
11647    add    r1, rFP, #OFF_FP_SHADOWFRAME
11648    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11649
11650/* ------------------------------ */
11651    .balign 128
11652.L_ALT_op_box_lambda: /* 0xf8 */
11653/* File: arm/alt_stub.S */
11654/*
11655 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11656 * any interesting requests and then jump to the real instruction
11657 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11658 */
11659    .extern MterpCheckBefore
11660    EXPORT_PC
11661    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11662    adrl   lr, artMterpAsmInstructionStart + (248 * 128)       @ Addr of primary handler.
11663    mov    r0, rSELF
11664    add    r1, rFP, #OFF_FP_SHADOWFRAME
11665    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11666
11667/* ------------------------------ */
11668    .balign 128
11669.L_ALT_op_unbox_lambda: /* 0xf9 */
11670/* File: arm/alt_stub.S */
11671/*
11672 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11673 * any interesting requests and then jump to the real instruction
11674 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11675 */
11676    .extern MterpCheckBefore
11677    EXPORT_PC
11678    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11679    adrl   lr, artMterpAsmInstructionStart + (249 * 128)       @ Addr of primary handler.
11680    mov    r0, rSELF
11681    add    r1, rFP, #OFF_FP_SHADOWFRAME
11682    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11683
11684/* ------------------------------ */
11685    .balign 128
11686.L_ALT_op_unused_fa: /* 0xfa */
11687/* File: arm/alt_stub.S */
11688/*
11689 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11690 * any interesting requests and then jump to the real instruction
11691 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11692 */
11693    .extern MterpCheckBefore
11694    EXPORT_PC
11695    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11696    adrl   lr, artMterpAsmInstructionStart + (250 * 128)       @ Addr of primary handler.
11697    mov    r0, rSELF
11698    add    r1, rFP, #OFF_FP_SHADOWFRAME
11699    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11700
11701/* ------------------------------ */
11702    .balign 128
11703.L_ALT_op_unused_fb: /* 0xfb */
11704/* File: arm/alt_stub.S */
11705/*
11706 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11707 * any interesting requests and then jump to the real instruction
11708 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11709 */
11710    .extern MterpCheckBefore
11711    EXPORT_PC
11712    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11713    adrl   lr, artMterpAsmInstructionStart + (251 * 128)       @ Addr of primary handler.
11714    mov    r0, rSELF
11715    add    r1, rFP, #OFF_FP_SHADOWFRAME
11716    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11717
11718/* ------------------------------ */
11719    .balign 128
11720.L_ALT_op_unused_fc: /* 0xfc */
11721/* File: arm/alt_stub.S */
11722/*
11723 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11724 * any interesting requests and then jump to the real instruction
11725 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11726 */
11727    .extern MterpCheckBefore
11728    EXPORT_PC
11729    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11730    adrl   lr, artMterpAsmInstructionStart + (252 * 128)       @ Addr of primary handler.
11731    mov    r0, rSELF
11732    add    r1, rFP, #OFF_FP_SHADOWFRAME
11733    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11734
11735/* ------------------------------ */
11736    .balign 128
11737.L_ALT_op_unused_fd: /* 0xfd */
11738/* File: arm/alt_stub.S */
11739/*
11740 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11741 * any interesting requests and then jump to the real instruction
11742 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11743 */
11744    .extern MterpCheckBefore
11745    EXPORT_PC
11746    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11747    adrl   lr, artMterpAsmInstructionStart + (253 * 128)       @ Addr of primary handler.
11748    mov    r0, rSELF
11749    add    r1, rFP, #OFF_FP_SHADOWFRAME
11750    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11751
11752/* ------------------------------ */
11753    .balign 128
11754.L_ALT_op_unused_fe: /* 0xfe */
11755/* File: arm/alt_stub.S */
11756/*
11757 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11758 * any interesting requests and then jump to the real instruction
11759 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11760 */
11761    .extern MterpCheckBefore
11762    EXPORT_PC
11763    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11764    adrl   lr, artMterpAsmInstructionStart + (254 * 128)       @ Addr of primary handler.
11765    mov    r0, rSELF
11766    add    r1, rFP, #OFF_FP_SHADOWFRAME
11767    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11768
11769/* ------------------------------ */
11770    .balign 128
11771.L_ALT_op_unused_ff: /* 0xff */
11772/* File: arm/alt_stub.S */
11773/*
11774 * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
11775 * any interesting requests and then jump to the real instruction
11776 * handler.  Note that the call to MterpCheckBefore is done as a tail call.
11777 */
11778    .extern MterpCheckBefore
11779    EXPORT_PC
11780    ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
11781    adrl   lr, artMterpAsmInstructionStart + (255 * 128)       @ Addr of primary handler.
11782    mov    r0, rSELF
11783    add    r1, rFP, #OFF_FP_SHADOWFRAME
11784    b      MterpCheckBefore     @ (self, shadow_frame)              @ Tail call.
11785
11786    .balign 128
11787    .size   artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
11788    .global artMterpAsmAltInstructionEnd
11789artMterpAsmAltInstructionEnd:
11790/* File: arm/footer.S */
11791/*
11792 * ===========================================================================
11793 *  Common subroutines and data
11794 * ===========================================================================
11795 */
11796
11797    .text
11798    .align  2
11799
11800/*
11801 * We've detected a condition that will result in an exception, but the exception
11802 * has not yet been thrown.  Just bail out to the reference interpreter to deal with it.
11803 * TUNING: for consistency, we may want to just go ahead and handle these here.
11804 */
11805common_errDivideByZero:
11806    EXPORT_PC
11807#if MTERP_LOGGING
11808    mov  r0, rSELF
11809    add  r1, rFP, #OFF_FP_SHADOWFRAME
11810    bl MterpLogDivideByZeroException
11811#endif
11812    b MterpCommonFallback
11813
11814common_errArrayIndex:
11815    EXPORT_PC
11816#if MTERP_LOGGING
11817    mov  r0, rSELF
11818    add  r1, rFP, #OFF_FP_SHADOWFRAME
11819    bl MterpLogArrayIndexException
11820#endif
11821    b MterpCommonFallback
11822
11823common_errNegativeArraySize:
11824    EXPORT_PC
11825#if MTERP_LOGGING
11826    mov  r0, rSELF
11827    add  r1, rFP, #OFF_FP_SHADOWFRAME
11828    bl MterpLogNegativeArraySizeException
11829#endif
11830    b MterpCommonFallback
11831
11832common_errNoSuchMethod:
11833    EXPORT_PC
11834#if MTERP_LOGGING
11835    mov  r0, rSELF
11836    add  r1, rFP, #OFF_FP_SHADOWFRAME
11837    bl MterpLogNoSuchMethodException
11838#endif
11839    b MterpCommonFallback
11840
11841common_errNullObject:
11842    EXPORT_PC
11843#if MTERP_LOGGING
11844    mov  r0, rSELF
11845    add  r1, rFP, #OFF_FP_SHADOWFRAME
11846    bl MterpLogNullObjectException
11847#endif
11848    b MterpCommonFallback
11849
11850common_exceptionThrown:
11851    EXPORT_PC
11852#if MTERP_LOGGING
11853    mov  r0, rSELF
11854    add  r1, rFP, #OFF_FP_SHADOWFRAME
11855    bl MterpLogExceptionThrownException
11856#endif
11857    b MterpCommonFallback
11858
11859MterpSuspendFallback:
11860    EXPORT_PC
11861#if MTERP_LOGGING
11862    mov  r0, rSELF
11863    add  r1, rFP, #OFF_FP_SHADOWFRAME
11864    ldr  r2, [rSELF, #THREAD_FLAGS_OFFSET]
11865    bl MterpLogSuspendFallback
11866#endif
11867    b MterpCommonFallback
11868
11869/*
11870 * If we're here, something is out of the ordinary.  If there is a pending
11871 * exception, handle it.  Otherwise, roll back and retry with the reference
11872 * interpreter.
11873 */
11874MterpPossibleException:
11875    ldr     r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
11876    cmp     r0, #0                                  @ Exception pending?
11877    beq     MterpFallback                           @ If not, fall back to reference interpreter.
11878    /* intentional fallthrough - handle pending exception. */
11879/*
11880 * On return from a runtime helper routine, we've found a pending exception.
11881 * Can we handle it here - or need to bail out to caller?
11882 *
11883 */
11884MterpException:
11885    mov     r0, rSELF
11886    add     r1, rFP, #OFF_FP_SHADOWFRAME
11887    bl      MterpHandleException                    @ (self, shadow_frame)
11888    cmp     r0, #0
11889    beq     MterpExceptionReturn                    @ no local catch, back to caller.
11890    ldr     r0, [rFP, #OFF_FP_CODE_ITEM]
11891    ldr     r1, [rFP, #OFF_FP_DEX_PC]
11892    ldr     rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
11893    add     rPC, r0, #CODEITEM_INSNS_OFFSET
11894    add     rPC, rPC, r1, lsl #1                    @ generate new dex_pc_ptr
11895    /* Do we need to switch interpreters? */
11896    bl      MterpShouldSwitchInterpreters
11897    cmp     r0, #0
11898    bne     MterpFallback
11899    /* resume execution at catch block */
11900    EXPORT_PC
11901    FETCH_INST
11902    GET_INST_OPCODE ip
11903    GOTO_OPCODE ip
11904    /* NOTE: no fallthrough */
11905
11906/*
11907 * Common handling for branches with support for Jit profiling.
11908 * On entry:
11909 *    rINST          <= signed offset
11910 *    rPROFILE       <= signed hotness countdown (expanded to 32 bits)
11911 *    condition bits <= set to establish sign of offset (use "NoFlags" entry if not)
11912 *
11913 * We have quite a few different cases for branch profiling, OSR detection and
11914 * suspend check support here.
11915 *
11916 * Taken backward branches:
11917 *    If profiling active, do hotness countdown and report if we hit zero.
11918 *    If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
11919 *    Is there a pending suspend request?  If so, suspend.
11920 *
11921 * Taken forward branches and not-taken backward branches:
11922 *    If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
11923 *
11924 * Our most common case is expected to be a taken backward branch with active jit profiling,
11925 * but no full OSR check and no pending suspend request.
11926 * Next most common case is not-taken branch with no full OSR check.
11927 *
11928 */
11929MterpCommonTakenBranchNoFlags:
11930    cmp     rINST, #0
11931MterpCommonTakenBranch:
11932    bgt     .L_forward_branch           @ don't add forward branches to hotness
11933/*
11934 * We need to subtract 1 from positive values and we should not see 0 here,
11935 * so we may use the result of the comparison with -1.
11936 */
11937#if JIT_CHECK_OSR != -1
11938#  error "JIT_CHECK_OSR must be -1."
11939#endif
11940    cmp     rPROFILE, #JIT_CHECK_OSR
11941    beq     .L_osr_check
11942    subgts  rPROFILE, #1
11943    beq     .L_add_batch                @ counted down to zero - report
11944.L_resume_backward_branch:
11945    ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
11946    REFRESH_IBASE
11947    add     r2, rINST, rINST            @ r2<- byte offset
11948    FETCH_ADVANCE_INST_RB r2            @ update rPC, load rINST
11949    ands    lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11950    bne     .L_suspend_request_pending
11951    GET_INST_OPCODE ip                  @ extract opcode from rINST
11952    GOTO_OPCODE ip                      @ jump to next instruction
11953
11954.L_suspend_request_pending:
11955    EXPORT_PC
11956    mov     r0, rSELF
11957    bl      MterpSuspendCheck           @ (self)
11958    cmp     r0, #0
11959    bne     MterpFallback
11960    REFRESH_IBASE                       @ might have changed during suspend
11961    GET_INST_OPCODE ip                  @ extract opcode from rINST
11962    GOTO_OPCODE ip                      @ jump to next instruction
11963
11964.L_no_count_backwards:
11965    cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
11966    bne     .L_resume_backward_branch
11967.L_osr_check:
11968    mov     r0, rSELF
11969    add     r1, rFP, #OFF_FP_SHADOWFRAME
11970    mov     r2, rINST
11971    EXPORT_PC
11972    bl      MterpMaybeDoOnStackReplacement  @ (self, shadow_frame, offset)
11973    cmp     r0, #0
11974    bne     MterpOnStackReplacement
11975    b       .L_resume_backward_branch
11976
11977.L_forward_branch:
11978    cmp     rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry?
11979    beq     .L_check_osr_forward
11980.L_resume_forward_branch:
11981    add     r2, rINST, rINST            @ r2<- byte offset
11982    FETCH_ADVANCE_INST_RB r2            @ update rPC, load rINST
11983    GET_INST_OPCODE ip                  @ extract opcode from rINST
11984    GOTO_OPCODE ip                      @ jump to next instruction
11985
11986.L_check_osr_forward:
11987    mov     r0, rSELF
11988    add     r1, rFP, #OFF_FP_SHADOWFRAME
11989    mov     r2, rINST
11990    EXPORT_PC
11991    bl      MterpMaybeDoOnStackReplacement  @ (self, shadow_frame, offset)
11992    cmp     r0, #0
11993    bne     MterpOnStackReplacement
11994    b       .L_resume_forward_branch
11995
11996.L_add_batch:
11997    add     r1, rFP, #OFF_FP_SHADOWFRAME
11998    strh    rPROFILE, [r1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
11999    ldr     r0, [rFP, #OFF_FP_METHOD]
12000    mov     r2, rSELF
12001    bl      MterpAddHotnessBatch        @ (method, shadow_frame, self)
12002    mov     rPROFILE, r0                @ restore new hotness countdown to rPROFILE
12003    b       .L_no_count_backwards
12004
12005/*
12006 * Entered from the conditional branch handlers when OSR check request active on
12007 * not-taken path.  All Dalvik not-taken conditional branch offsets are 2.
12008 */
12009.L_check_not_taken_osr:
12010    mov     r0, rSELF
12011    add     r1, rFP, #OFF_FP_SHADOWFRAME
12012    mov     r2, #2
12013    EXPORT_PC
12014    bl      MterpMaybeDoOnStackReplacement  @ (self, shadow_frame, offset)
12015    cmp     r0, #0
12016    bne     MterpOnStackReplacement
12017    FETCH_ADVANCE_INST 2
12018    GET_INST_OPCODE ip                  @ extract opcode from rINST
12019    GOTO_OPCODE ip                      @ jump to next instruction
12020
12021/*
12022 * On-stack replacement has happened, and now we've returned from the compiled method.
12023 */
12024MterpOnStackReplacement:
12025#if MTERP_LOGGING
12026    mov r0, rSELF
12027    add r1, rFP, #OFF_FP_SHADOWFRAME
12028    mov r2, rINST
12029    bl MterpLogOSR
12030#endif
12031    mov r0, #1                          @ Signal normal return
12032    b MterpDone
12033
12034/*
12035 * Bail out to reference interpreter.
12036 */
12037MterpFallback:
12038    EXPORT_PC
12039#if MTERP_LOGGING
12040    mov  r0, rSELF
12041    add  r1, rFP, #OFF_FP_SHADOWFRAME
12042    bl MterpLogFallback
12043#endif
12044MterpCommonFallback:
12045    mov     r0, #0                                  @ signal retry with reference interpreter.
12046    b       MterpDone
12047
12048/*
12049 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12050 * SP and LR.  Here we restore SP, restore the registers, and then restore
12051 * LR to PC.
12052 *
12053 * On entry:
12054 *  uint32_t* rFP  (should still be live, pointer to base of vregs)
12055 */
12056MterpExceptionReturn:
12057    mov     r0, #1                                  @ signal return to caller.
12058    b MterpDone
12059MterpReturn:
12060    ldr     r2, [rFP, #OFF_FP_RESULT_REGISTER]
12061    str     r0, [r2]
12062    str     r1, [r2, #4]
12063    mov     r0, #1                                  @ signal return to caller.
12064MterpDone:
12065/*
12066 * At this point, we expect rPROFILE to be non-zero.  If negative, hotness is disabled or we're
12067 * checking for OSR.  If greater than zero, we might have unreported hotness to register
12068 * (the difference between the ending rPROFILE and the cached hotness counter).  rPROFILE
12069 * should only reach zero immediately after a hotness decrement, and is then reset to either
12070 * a negative special state or the new non-zero countdown value.
12071 */
12072    cmp     rPROFILE, #0
12073    bgt     MterpProfileActive                      @ if > 0, we may have some counts to report.
12074    ldmfd   sp!, {r3-r10,fp,pc}                     @ restore 10 regs and return
12075
12076MterpProfileActive:
12077    mov     rINST, r0                               @ stash return value
12078    /* Report cached hotness counts */
12079    ldr     r0, [rFP, #OFF_FP_METHOD]
12080    add     r1, rFP, #OFF_FP_SHADOWFRAME
12081    mov     r2, rSELF
12082    strh    rPROFILE, [r1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
12083    bl      MterpAddHotnessBatch                    @ (method, shadow_frame, self)
12084    mov     r0, rINST                               @ restore return value
12085    ldmfd   sp!, {r3-r10,fp,pc}                     @ restore 10 regs and return
12086
12087    .fnend
12088    .size   ExecuteMterpImpl, .-ExecuteMterpImpl
12089
12090
12091