Home | History | Annotate | Download | only in out
      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 /*
     42 ARM EABI general notes:
     43 
     44 r0-r3 hold first 4 args to a method; they are not preserved across method calls
     45 r4-r8 are available for general use
     46 r9 is given special treatment in some situations, but not for us
     47 r10 (sl) seems to be generally available
     48 r11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
     49 r12 (ip) is scratch -- not preserved across method calls
     50 r13 (sp) should be managed carefully in case a signal arrives
     51 r14 (lr) must be preserved
     52 r15 (pc) can be tinkered with directly
     53 
     54 r0 holds returns of <= 4 bytes
     55 r0-r1 hold returns of 8 bytes, low word in r0
     56 
     57 Callee must save/restore r4+ (except r12) if it modifies them.  If VFP
     58 is present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
     59 s0-s15 (d0-d7, q0-a3) do not need to be.
     60 
     61 Stack is "full descending".  Only the arguments that don't fit in the first 4
     62 registers are placed on the stack.  "sp" points at the first stacked argument
     63 (i.e. the 5th arg).
     64 
     65 VFP: single-precision results in s0, double-precision results in d0.
     66 
     67 In the EABI, "sp" must be 64-bit aligned on entry to a function, and any
     68 64-bit quantities (long long, double) must be 64-bit aligned.
     69 */
     70 
     71 /*
     72 Mterp and ARM notes:
     73 
     74 The 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 
     85 Macros are provided for common operations.  Each macro MUST emit only
     86 one instruction to make instruction-counting easier.  They MUST NOT alter
     87 unspecified 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 /*
    299  * cfi support macros.
    300  */
    301 .macro ENTRY name
    302     .arm
    303     .type \name, #function
    304     .hidden \name  // Hide this as a global symbol, so we do not incur plt calls.
    305     .global \name
    306     /* Cache alignment for function entry */
    307     .balign 16
    308 \name:
    309     .cfi_startproc
    310     .fnstart
    311 .endm
    312 
    313 .macro END name
    314     .fnend
    315     .cfi_endproc
    316     .size \name, .-\name
    317 .endm
    318 
    319 /* File: arm/entry.S */
    320 /*
    321  * Copyright (C) 2016 The Android Open Source Project
    322  *
    323  * Licensed under the Apache License, Version 2.0 (the "License");
    324  * you may not use this file except in compliance with the License.
    325  * You may obtain a copy of the License at
    326  *
    327  *      http://www.apache.org/licenses/LICENSE-2.0
    328  *
    329  * Unless required by applicable law or agreed to in writing, software
    330  * distributed under the License is distributed on an "AS IS" BASIS,
    331  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    332  * See the License for the specific language governing permissions and
    333  * limitations under the License.
    334  */
    335 /*
    336  * Interpreter entry point.
    337  */
    338 
    339     .text
    340     .align  2
    341     .global ExecuteMterpImpl
    342     .type   ExecuteMterpImpl, %function
    343 
    344 /*
    345  * On entry:
    346  *  r0  Thread* self/
    347  *  r1  code_item
    348  *  r2  ShadowFrame
    349  *  r3  JValue* result_register
    350  *
    351  */
    352 
    353 ENTRY ExecuteMterpImpl
    354     stmfd   sp!, {r3-r10,fp,lr}         @ save 10 regs, (r3 just to align 64)
    355     .cfi_adjust_cfa_offset 40
    356     .cfi_rel_offset r3, 0
    357     .cfi_rel_offset r4, 4
    358     .cfi_rel_offset r5, 8
    359     .cfi_rel_offset r6, 12
    360     .cfi_rel_offset r7, 16
    361     .cfi_rel_offset r8, 20
    362     .cfi_rel_offset r9, 24
    363     .cfi_rel_offset r10, 28
    364     .cfi_rel_offset fp, 32
    365     .cfi_rel_offset lr, 36
    366 
    367     /* Remember the return register */
    368     str     r3, [r2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
    369 
    370     /* Remember the code_item */
    371     str     r1, [r2, #SHADOWFRAME_CODE_ITEM_OFFSET]
    372 
    373     /* set up "named" registers */
    374     mov     rSELF, r0
    375     ldr     r0, [r2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
    376     add     rFP, r2, #SHADOWFRAME_VREGS_OFFSET     @ point to vregs.
    377     VREG_INDEX_TO_ADDR rREFS, r0                   @ point to reference array in shadow frame
    378     ldr     r0, [r2, #SHADOWFRAME_DEX_PC_OFFSET]   @ Get starting dex_pc.
    379     add     rPC, r1, #CODEITEM_INSNS_OFFSET        @ Point to base of insns[]
    380     add     rPC, rPC, r0, lsl #1                   @ Create direct pointer to 1st dex opcode
    381     EXPORT_PC
    382 
    383     /* Starting ibase */
    384     ldr     rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
    385 
    386     /* Set up for backwards branches & osr profiling */
    387     ldr     r0, [rFP, #OFF_FP_METHOD]
    388     add     r1, rFP, #OFF_FP_SHADOWFRAME
    389     bl      MterpSetUpHotnessCountdown
    390     mov     rPROFILE, r0                @ Starting hotness countdown to rPROFILE
    391 
    392     /* start executing the instruction at rPC */
    393     FETCH_INST                          @ load rINST from rPC
    394     GET_INST_OPCODE ip                  @ extract opcode from rINST
    395     GOTO_OPCODE ip                      @ jump to next instruction
    396     /* NOTE: no fallthrough */
    397 
    398 
    399     .global artMterpAsmInstructionStart
    400     .type   artMterpAsmInstructionStart, %function
    401 artMterpAsmInstructionStart = .L_op_nop
    402     .text
    403 
    404 /* ------------------------------ */
    405     .balign 128
    406 .L_op_nop: /* 0x00 */
    407 /* File: arm/op_nop.S */
    408     FETCH_ADVANCE_INST 1                @ advance to next instr, load rINST
    409     GET_INST_OPCODE ip                  @ ip<- opcode from rINST
    410     GOTO_OPCODE ip                      @ execute it
    411 
    412 /* ------------------------------ */
    413     .balign 128
    414 .L_op_move: /* 0x01 */
    415 /* File: arm/op_move.S */
    416     /* for move, move-object, long-to-int */
    417     /* op vA, vB */
    418     mov     r1, rINST, lsr #12          @ r1<- B from 15:12
    419     ubfx    r0, rINST, #8, #4           @ r0<- A from 11:8
    420     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
    421     GET_VREG r2, r1                     @ r2<- fp[B]
    422     GET_INST_OPCODE ip                  @ ip<- opcode from rINST
    423     .if 0
    424     SET_VREG_OBJECT r2, r0              @ fp[A]<- r2
    425     .else
    426     SET_VREG r2, r0                     @ fp[A]<- r2
    427     .endif
    428     GOTO_OPCODE ip                      @ execute next instruction
    429 
    430 /* ------------------------------ */
    431     .balign 128
    432 .L_op_move_from16: /* 0x02 */
    433 /* File: arm/op_move_from16.S */
    434     /* for: move/from16, move-object/from16 */
    435     /* op vAA, vBBBB */
    436     FETCH r1, 1                         @ r1<- BBBB
    437     mov     r0, rINST, lsr #8           @ r0<- AA
    438     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
    439     GET_VREG r2, r1                     @ r2<- fp[BBBB]
    440     GET_INST_OPCODE ip                  @ extract opcode from rINST
    441     .if 0
    442     SET_VREG_OBJECT r2, r0              @ fp[AA]<- r2
    443     .else
    444     SET_VREG r2, r0                     @ fp[AA]<- r2
    445     .endif
    446     GOTO_OPCODE ip                      @ jump to next instruction
    447 
    448 /* ------------------------------ */
    449     .balign 128
    450 .L_op_move_16: /* 0x03 */
    451 /* File: arm/op_move_16.S */
    452     /* for: move/16, move-object/16 */
    453     /* op vAAAA, vBBBB */
    454     FETCH r1, 2                         @ r1<- BBBB
    455     FETCH r0, 1                         @ r0<- AAAA
    456     FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
    457     GET_VREG r2, r1                     @ r2<- fp[BBBB]
    458     GET_INST_OPCODE ip                  @ extract opcode from rINST
    459     .if 0
    460     SET_VREG_OBJECT r2, r0              @ fp[AAAA]<- r2
    461     .else
    462     SET_VREG r2, r0                     @ fp[AAAA]<- r2
    463     .endif
    464     GOTO_OPCODE ip                      @ jump to next instruction
    465 
    466 /* ------------------------------ */
    467     .balign 128
    468 .L_op_move_wide: /* 0x04 */
    469 /* File: arm/op_move_wide.S */
    470     /* move-wide vA, vB */
    471     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
    472     mov     r3, rINST, lsr #12          @ r3<- B
    473     ubfx    rINST, rINST, #8, #4        @ rINST<- A
    474     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
    475     VREG_INDEX_TO_ADDR r2, rINST        @ r2<- &fp[A]
    476     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
    477     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero out the shadow regs
    478     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
    479     GET_INST_OPCODE ip                  @ extract opcode from rINST
    480     stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
    481     GOTO_OPCODE ip                      @ jump to next instruction
    482 
    483 /* ------------------------------ */
    484     .balign 128
    485 .L_op_move_wide_from16: /* 0x05 */
    486 /* File: arm/op_move_wide_from16.S */
    487     /* move-wide/from16 vAA, vBBBB */
    488     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
    489     FETCH r3, 1                         @ r3<- BBBB
    490     mov     rINST, rINST, lsr #8        @ rINST<- AA
    491     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[BBBB]
    492     VREG_INDEX_TO_ADDR r2, rINST        @ r2<- &fp[AA]
    493     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
    494     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero out the shadow regs
    495     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
    496     GET_INST_OPCODE ip                  @ extract opcode from rINST
    497     stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
    498     GOTO_OPCODE ip                      @ jump to next instruction
    499 
    500 /* ------------------------------ */
    501     .balign 128
    502 .L_op_move_wide_16: /* 0x06 */
    503 /* File: arm/op_move_wide_16.S */
    504     /* move-wide/16 vAAAA, vBBBB */
    505     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
    506     FETCH r3, 2                         @ r3<- BBBB
    507     FETCH r2, 1                         @ r2<- AAAA
    508     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[BBBB]
    509     VREG_INDEX_TO_ADDR lr, r2           @ r2<- &fp[AAAA]
    510     ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
    511     FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
    512     CLEAR_SHADOW_PAIR r2, r3, ip        @ Zero out the shadow regs
    513     stmia   lr, {r0-r1}                 @ fp[AAAA]<- r0/r1
    514     GET_INST_OPCODE ip                  @ extract opcode from rINST
    515     GOTO_OPCODE ip                      @ jump to next instruction
    516 
    517 /* ------------------------------ */
    518     .balign 128
    519 .L_op_move_object: /* 0x07 */
    520 /* File: arm/op_move_object.S */
    521 /* File: arm/op_move.S */
    522     /* for move, move-object, long-to-int */
    523     /* op vA, vB */
    524     mov     r1, rINST, lsr #12          @ r1<- B from 15:12
    525     ubfx    r0, rINST, #8, #4           @ r0<- A from 11:8
    526     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
    527     GET_VREG r2, r1                     @ r2<- fp[B]
    528     GET_INST_OPCODE ip                  @ ip<- opcode from rINST
    529     .if 1
    530     SET_VREG_OBJECT r2, r0              @ fp[A]<- r2
    531     .else
    532     SET_VREG r2, r0                     @ fp[A]<- r2
    533     .endif
    534     GOTO_OPCODE ip                      @ execute next instruction
    535 
    536 
    537 /* ------------------------------ */
    538     .balign 128
    539 .L_op_move_object_from16: /* 0x08 */
    540 /* File: arm/op_move_object_from16.S */
    541 /* File: arm/op_move_from16.S */
    542     /* for: move/from16, move-object/from16 */
    543     /* op vAA, vBBBB */
    544     FETCH r1, 1                         @ r1<- BBBB
    545     mov     r0, rINST, lsr #8           @ r0<- AA
    546     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
    547     GET_VREG r2, r1                     @ r2<- fp[BBBB]
    548     GET_INST_OPCODE ip                  @ extract opcode from rINST
    549     .if 1
    550     SET_VREG_OBJECT r2, r0              @ fp[AA]<- r2
    551     .else
    552     SET_VREG r2, r0                     @ fp[AA]<- r2
    553     .endif
    554     GOTO_OPCODE ip                      @ jump to next instruction
    555 
    556 
    557 /* ------------------------------ */
    558     .balign 128
    559 .L_op_move_object_16: /* 0x09 */
    560 /* File: arm/op_move_object_16.S */
    561 /* File: arm/op_move_16.S */
    562     /* for: move/16, move-object/16 */
    563     /* op vAAAA, vBBBB */
    564     FETCH r1, 2                         @ r1<- BBBB
    565     FETCH r0, 1                         @ r0<- AAAA
    566     FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
    567     GET_VREG r2, r1                     @ r2<- fp[BBBB]
    568     GET_INST_OPCODE ip                  @ extract opcode from rINST
    569     .if 1
    570     SET_VREG_OBJECT r2, r0              @ fp[AAAA]<- r2
    571     .else
    572     SET_VREG r2, r0                     @ fp[AAAA]<- r2
    573     .endif
    574     GOTO_OPCODE ip                      @ jump to next instruction
    575 
    576 
    577 /* ------------------------------ */
    578     .balign 128
    579 .L_op_move_result: /* 0x0a */
    580 /* File: arm/op_move_result.S */
    581     /* for: move-result, move-result-object */
    582     /* op vAA */
    583     mov     r2, rINST, lsr #8           @ r2<- AA
    584     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
    585     ldr     r0, [rFP, #OFF_FP_RESULT_REGISTER]  @ get pointer to result JType.
    586     ldr     r0, [r0]                    @ r0 <- result.i.
    587     GET_INST_OPCODE ip                  @ extract opcode from rINST
    588     .if 0
    589     SET_VREG_OBJECT r0, r2, r1          @ fp[AA]<- r0
    590     .else
    591     SET_VREG r0, r2                     @ fp[AA]<- r0
    592     .endif
    593     GOTO_OPCODE ip                      @ jump to next instruction
    594 
    595 /* ------------------------------ */
    596     .balign 128
    597 .L_op_move_result_wide: /* 0x0b */
    598 /* File: arm/op_move_result_wide.S */
    599     /* move-result-wide vAA */
    600     mov     rINST, rINST, lsr #8        @ rINST<- AA
    601     ldr     r3, [rFP, #OFF_FP_RESULT_REGISTER]
    602     VREG_INDEX_TO_ADDR r2, rINST        @ r2<- &fp[AA]
    603     ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
    604     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero out the shadow regs
    605     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
    606     stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
    607     GET_INST_OPCODE ip                  @ extract opcode from rINST
    608     GOTO_OPCODE ip                      @ jump to next instruction
    609 
    610 /* ------------------------------ */
    611     .balign 128
    612 .L_op_move_result_object: /* 0x0c */
    613 /* File: arm/op_move_result_object.S */
    614 /* File: arm/op_move_result.S */
    615     /* for: move-result, move-result-object */
    616     /* op vAA */
    617     mov     r2, rINST, lsr #8           @ r2<- AA
    618     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
    619     ldr     r0, [rFP, #OFF_FP_RESULT_REGISTER]  @ get pointer to result JType.
    620     ldr     r0, [r0]                    @ r0 <- result.i.
    621     GET_INST_OPCODE ip                  @ extract opcode from rINST
    622     .if 1
    623     SET_VREG_OBJECT r0, r2, r1          @ fp[AA]<- r0
    624     .else
    625     SET_VREG r0, r2                     @ fp[AA]<- r0
    626     .endif
    627     GOTO_OPCODE ip                      @ jump to next instruction
    628 
    629 
    630 /* ------------------------------ */
    631     .balign 128
    632 .L_op_move_exception: /* 0x0d */
    633 /* File: arm/op_move_exception.S */
    634     /* move-exception vAA */
    635     mov     r2, rINST, lsr #8           @ r2<- AA
    636     ldr     r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
    637     mov     r1, #0                      @ r1<- 0
    638     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
    639     SET_VREG_OBJECT r3, r2              @ fp[AA]<- exception obj
    640     GET_INST_OPCODE ip                  @ extract opcode from rINST
    641     str     r1, [rSELF, #THREAD_EXCEPTION_OFFSET]  @ clear exception
    642     GOTO_OPCODE ip                      @ jump to next instruction
    643 
    644 /* ------------------------------ */
    645     .balign 128
    646 .L_op_return_void: /* 0x0e */
    647 /* File: arm/op_return_void.S */
    648     .extern MterpThreadFenceForConstructor
    649     bl      MterpThreadFenceForConstructor
    650     ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
    651     mov     r0, rSELF
    652     ands    lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
    653     blne    MterpSuspendCheck                       @ (self)
    654     mov    r0, #0
    655     mov    r1, #0
    656     b      MterpReturn
    657 
    658 /* ------------------------------ */
    659     .balign 128
    660 .L_op_return: /* 0x0f */
    661 /* File: arm/op_return.S */
    662     /*
    663      * Return a 32-bit value.
    664      *
    665      * for: return, return-object
    666      */
    667     /* op vAA */
    668     .extern MterpThreadFenceForConstructor
    669     bl      MterpThreadFenceForConstructor
    670     ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
    671     mov     r0, rSELF
    672     ands    lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
    673     blne    MterpSuspendCheck                       @ (self)
    674     mov     r2, rINST, lsr #8           @ r2<- AA
    675     GET_VREG r0, r2                     @ r0<- vAA
    676     mov     r1, #0
    677     b       MterpReturn
    678 
    679 /* ------------------------------ */
    680     .balign 128
    681 .L_op_return_wide: /* 0x10 */
    682 /* File: arm/op_return_wide.S */
    683     /*
    684      * Return a 64-bit value.
    685      */
    686     /* return-wide vAA */
    687     .extern MterpThreadFenceForConstructor
    688     bl      MterpThreadFenceForConstructor
    689     ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
    690     mov     r0, rSELF
    691     ands    lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
    692     blne    MterpSuspendCheck                       @ (self)
    693     mov     r2, rINST, lsr #8           @ r2<- AA
    694     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[AA]
    695     ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
    696     b       MterpReturn
    697 
    698 /* ------------------------------ */
    699     .balign 128
    700 .L_op_return_object: /* 0x11 */
    701 /* File: arm/op_return_object.S */
    702 /* File: arm/op_return.S */
    703     /*
    704      * Return a 32-bit value.
    705      *
    706      * for: return, return-object
    707      */
    708     /* op vAA */
    709     .extern MterpThreadFenceForConstructor
    710     bl      MterpThreadFenceForConstructor
    711     ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
    712     mov     r0, rSELF
    713     ands    lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
    714     blne    MterpSuspendCheck                       @ (self)
    715     mov     r2, rINST, lsr #8           @ r2<- AA
    716     GET_VREG r0, r2                     @ r0<- vAA
    717     mov     r1, #0
    718     b       MterpReturn
    719 
    720 
    721 /* ------------------------------ */
    722     .balign 128
    723 .L_op_const_4: /* 0x12 */
    724 /* File: arm/op_const_4.S */
    725     /* const/4 vA, #+B */
    726     sbfx    r1, rINST, #12, #4          @ r1<- sssssssB (sign-extended)
    727     ubfx    r0, rINST, #8, #4           @ r0<- A
    728     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
    729     GET_INST_OPCODE ip                  @ ip<- opcode from rINST
    730     SET_VREG r1, r0                     @ fp[A]<- r1
    731     GOTO_OPCODE ip                      @ execute next instruction
    732 
    733 /* ------------------------------ */
    734     .balign 128
    735 .L_op_const_16: /* 0x13 */
    736 /* File: arm/op_const_16.S */
    737     /* const/16 vAA, #+BBBB */
    738     FETCH_S r0, 1                       @ r0<- ssssBBBB (sign-extended)
    739     mov     r3, rINST, lsr #8           @ r3<- AA
    740     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
    741     SET_VREG r0, r3                     @ vAA<- r0
    742     GET_INST_OPCODE ip                  @ extract opcode from rINST
    743     GOTO_OPCODE ip                      @ jump to next instruction
    744 
    745 /* ------------------------------ */
    746     .balign 128
    747 .L_op_const: /* 0x14 */
    748 /* File: arm/op_const.S */
    749     /* const vAA, #+BBBBbbbb */
    750     mov     r3, rINST, lsr #8           @ r3<- AA
    751     FETCH r0, 1                         @ r0<- bbbb (low)
    752     FETCH r1, 2                         @ r1<- BBBB (high)
    753     FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
    754     orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
    755     GET_INST_OPCODE ip                  @ extract opcode from rINST
    756     SET_VREG r0, r3                     @ vAA<- r0
    757     GOTO_OPCODE ip                      @ jump to next instruction
    758 
    759 /* ------------------------------ */
    760     .balign 128
    761 .L_op_const_high16: /* 0x15 */
    762 /* File: arm/op_const_high16.S */
    763     /* const/high16 vAA, #+BBBB0000 */
    764     FETCH r0, 1                         @ r0<- 0000BBBB (zero-extended)
    765     mov     r3, rINST, lsr #8           @ r3<- AA
    766     mov     r0, r0, lsl #16             @ r0<- BBBB0000
    767     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
    768     SET_VREG r0, r3                     @ vAA<- r0
    769     GET_INST_OPCODE ip                  @ extract opcode from rINST
    770     GOTO_OPCODE ip                      @ jump to next instruction
    771 
    772 /* ------------------------------ */
    773     .balign 128
    774 .L_op_const_wide_16: /* 0x16 */
    775 /* File: arm/op_const_wide_16.S */
    776     /* const-wide/16 vAA, #+BBBB */
    777     FETCH_S r0, 1                       @ r0<- ssssBBBB (sign-extended)
    778     mov     r3, rINST, lsr #8           @ r3<- AA
    779     mov     r1, r0, asr #31             @ r1<- ssssssss
    780     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
    781     CLEAR_SHADOW_PAIR r3, r2, lr        @ Zero out the shadow regs
    782     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[AA]
    783     GET_INST_OPCODE ip                  @ extract opcode from rINST
    784     stmia   r3, {r0-r1}                 @ vAA<- r0/r1
    785     GOTO_OPCODE ip                      @ jump to next instruction
    786 
    787 /* ------------------------------ */
    788     .balign 128
    789 .L_op_const_wide_32: /* 0x17 */
    790 /* File: arm/op_const_wide_32.S */
    791     /* const-wide/32 vAA, #+BBBBbbbb */
    792     FETCH r0, 1                         @ r0<- 0000bbbb (low)
    793     mov     r3, rINST, lsr #8           @ r3<- AA
    794     FETCH_S r2, 2                       @ r2<- ssssBBBB (high)
    795     FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
    796     orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
    797     CLEAR_SHADOW_PAIR r3, r2, lr        @ Zero out the shadow regs
    798     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[AA]
    799     mov     r1, r0, asr #31             @ r1<- ssssssss
    800     GET_INST_OPCODE ip                  @ extract opcode from rINST
    801     stmia   r3, {r0-r1}                 @ vAA<- r0/r1
    802     GOTO_OPCODE ip                      @ jump to next instruction
    803 
    804 /* ------------------------------ */
    805     .balign 128
    806 .L_op_const_wide: /* 0x18 */
    807 /* File: arm/op_const_wide.S */
    808     /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
    809     FETCH r0, 1                         @ r0<- bbbb (low)
    810     FETCH r1, 2                         @ r1<- BBBB (low middle)
    811     FETCH r2, 3                         @ r2<- hhhh (high middle)
    812     orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
    813     FETCH r3, 4                         @ r3<- HHHH (high)
    814     mov     r9, rINST, lsr #8           @ r9<- AA
    815     orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
    816     CLEAR_SHADOW_PAIR r9, r2, r3        @ Zero out the shadow regs
    817     FETCH_ADVANCE_INST 5                @ advance rPC, load rINST
    818     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
    819     GET_INST_OPCODE ip                  @ extract opcode from rINST
    820     stmia   r9, {r0-r1}                 @ vAA<- r0/r1
    821     GOTO_OPCODE ip                      @ jump to next instruction
    822 
    823 /* ------------------------------ */
    824     .balign 128
    825 .L_op_const_wide_high16: /* 0x19 */
    826 /* File: arm/op_const_wide_high16.S */
    827     /* const-wide/high16 vAA, #+BBBB000000000000 */
    828     FETCH r1, 1                         @ r1<- 0000BBBB (zero-extended)
    829     mov     r3, rINST, lsr #8           @ r3<- AA
    830     mov     r0, #0                      @ r0<- 00000000
    831     mov     r1, r1, lsl #16             @ r1<- BBBB0000
    832     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
    833     CLEAR_SHADOW_PAIR r3, r0, r2        @ Zero shadow regs
    834     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[AA]
    835     GET_INST_OPCODE ip                  @ extract opcode from rINST
    836     stmia   r3, {r0-r1}                 @ vAA<- r0/r1
    837     GOTO_OPCODE ip                      @ jump to next instruction
    838 
    839 /* ------------------------------ */
    840     .balign 128
    841 .L_op_const_string: /* 0x1a */
    842 /* File: arm/op_const_string.S */
    843     /* const/string vAA, String@BBBB */
    844     EXPORT_PC
    845     FETCH r0, 1                         @ r0<- BBBB
    846     mov     r1, rINST, lsr #8           @ r1<- AA
    847     add     r2, rFP, #OFF_FP_SHADOWFRAME
    848     mov     r3, rSELF
    849     bl      MterpConstString            @ (index, tgt_reg, shadow_frame, self)
    850     PREFETCH_INST 2                     @ load rINST
    851     cmp     r0, #0                      @ fail?
    852     bne     MterpPossibleException      @ let reference interpreter deal with it.
    853     ADVANCE 2                           @ advance rPC
    854     GET_INST_OPCODE ip                  @ extract opcode from rINST
    855     GOTO_OPCODE ip                      @ jump to next instruction
    856 
    857 /* ------------------------------ */
    858     .balign 128
    859 .L_op_const_string_jumbo: /* 0x1b */
    860 /* File: arm/op_const_string_jumbo.S */
    861     /* const/string vAA, String@BBBBBBBB */
    862     EXPORT_PC
    863     FETCH r0, 1                         @ r0<- bbbb (low)
    864     FETCH r2, 2                         @ r2<- BBBB (high)
    865     mov     r1, rINST, lsr #8           @ r1<- AA
    866     orr     r0, r0, r2, lsl #16         @ r1<- BBBBbbbb
    867     add     r2, rFP, #OFF_FP_SHADOWFRAME
    868     mov     r3, rSELF
    869     bl      MterpConstString            @ (index, tgt_reg, shadow_frame, self)
    870     PREFETCH_INST 3                     @ advance rPC
    871     cmp     r0, #0                      @ fail?
    872     bne     MterpPossibleException      @ let reference interpreter deal with it.
    873     ADVANCE 3                           @ advance rPC
    874     GET_INST_OPCODE ip                  @ extract opcode from rINST
    875     GOTO_OPCODE ip                      @ jump to next instruction
    876 
    877 /* ------------------------------ */
    878     .balign 128
    879 .L_op_const_class: /* 0x1c */
    880 /* File: arm/op_const_class.S */
    881     /* const/class vAA, Class@BBBB */
    882     EXPORT_PC
    883     FETCH   r0, 1                       @ r0<- BBBB
    884     mov     r1, rINST, lsr #8           @ r1<- AA
    885     add     r2, rFP, #OFF_FP_SHADOWFRAME
    886     mov     r3, rSELF
    887     bl      MterpConstClass             @ (index, tgt_reg, shadow_frame, self)
    888     PREFETCH_INST 2
    889     cmp     r0, #0
    890     bne     MterpPossibleException
    891     ADVANCE 2
    892     GET_INST_OPCODE ip                  @ extract opcode from rINST
    893     GOTO_OPCODE ip                      @ jump to next instruction
    894 
    895 /* ------------------------------ */
    896     .balign 128
    897 .L_op_monitor_enter: /* 0x1d */
    898 /* File: arm/op_monitor_enter.S */
    899     /*
    900      * Synchronize on an object.
    901      */
    902     /* monitor-enter vAA */
    903     EXPORT_PC
    904     mov      r2, rINST, lsr #8           @ r2<- AA
    905     GET_VREG r0, r2                      @ r0<- vAA (object)
    906     mov      r1, rSELF                   @ r1<- self
    907     bl       artLockObjectFromCode
    908     cmp      r0, #0
    909     bne      MterpException
    910     FETCH_ADVANCE_INST 1
    911     GET_INST_OPCODE ip                   @ extract opcode from rINST
    912     GOTO_OPCODE ip                       @ jump to next instruction
    913 
    914 /* ------------------------------ */
    915     .balign 128
    916 .L_op_monitor_exit: /* 0x1e */
    917 /* File: arm/op_monitor_exit.S */
    918     /*
    919      * Unlock an object.
    920      *
    921      * Exceptions that occur when unlocking a monitor need to appear as
    922      * if they happened at the following instruction.  See the Dalvik
    923      * instruction spec.
    924      */
    925     /* monitor-exit vAA */
    926     EXPORT_PC
    927     mov      r2, rINST, lsr #8          @ r2<- AA
    928     GET_VREG r0, r2                     @ r0<- vAA (object)
    929     mov      r1, rSELF                  @ r0<- self
    930     bl       artUnlockObjectFromCode    @ r0<- success for unlock(self, obj)
    931     cmp     r0, #0                      @ failed?
    932     bne     MterpException
    933     FETCH_ADVANCE_INST 1                @ before throw: advance rPC, load rINST
    934     GET_INST_OPCODE ip                  @ extract opcode from rINST
    935     GOTO_OPCODE ip                      @ jump to next instruction
    936 
    937 /* ------------------------------ */
    938     .balign 128
    939 .L_op_check_cast: /* 0x1f */
    940 /* File: arm/op_check_cast.S */
    941     /*
    942      * Check to see if a cast from one class to another is allowed.
    943      */
    944     /* check-cast vAA, class@BBBB */
    945     EXPORT_PC
    946     FETCH    r0, 1                      @ r0<- BBBB
    947     mov      r1, rINST, lsr #8          @ r1<- AA
    948     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &object
    949     ldr      r2, [rFP, #OFF_FP_METHOD]  @ r2<- method
    950     mov      r3, rSELF                  @ r3<- self
    951     bl       MterpCheckCast             @ (index, &obj, method, self)
    952     PREFETCH_INST 2
    953     cmp      r0, #0
    954     bne      MterpPossibleException
    955     ADVANCE  2
    956     GET_INST_OPCODE ip                  @ extract opcode from rINST
    957     GOTO_OPCODE ip                      @ jump to next instruction
    958 
    959 /* ------------------------------ */
    960     .balign 128
    961 .L_op_instance_of: /* 0x20 */
    962 /* File: arm/op_instance_of.S */
    963     /*
    964      * Check to see if an object reference is an instance of a class.
    965      *
    966      * Most common situation is a non-null object, being compared against
    967      * an already-resolved class.
    968      */
    969     /* instance-of vA, vB, class@CCCC */
    970     EXPORT_PC
    971     FETCH     r0, 1                     @ r0<- CCCC
    972     mov       r1, rINST, lsr #12        @ r1<- B
    973     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &object
    974     ldr       r2, [rFP, #OFF_FP_METHOD] @ r2<- method
    975     mov       r3, rSELF                 @ r3<- self
    976     bl        MterpInstanceOf           @ (index, &obj, method, self)
    977     ldr       r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
    978     ubfx      r9, rINST, #8, #4         @ r9<- A
    979     PREFETCH_INST 2
    980     cmp       r1, #0                    @ exception pending?
    981     bne       MterpException
    982     ADVANCE 2                           @ advance rPC
    983     SET_VREG r0, r9                     @ vA<- r0
    984     GET_INST_OPCODE ip                  @ extract opcode from rINST
    985     GOTO_OPCODE ip                      @ jump to next instruction
    986 
    987 /* ------------------------------ */
    988     .balign 128
    989 .L_op_array_length: /* 0x21 */
    990 /* File: arm/op_array_length.S */
    991     /*
    992      * Return the length of an array.
    993      */
    994     mov     r1, rINST, lsr #12          @ r1<- B
    995     ubfx    r2, rINST, #8, #4           @ r2<- A
    996     GET_VREG r0, r1                     @ r0<- vB (object ref)
    997     cmp     r0, #0                      @ is object null?
    998     beq     common_errNullObject        @ yup, fail
    999     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   1000     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- array length
   1001     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1002     SET_VREG r3, r2                     @ vB<- length
   1003     GOTO_OPCODE ip                      @ jump to next instruction
   1004 
   1005 /* ------------------------------ */
   1006     .balign 128
   1007 .L_op_new_instance: /* 0x22 */
   1008 /* File: arm/op_new_instance.S */
   1009     /*
   1010      * Create a new instance of a class.
   1011      */
   1012     /* new-instance vAA, class@BBBB */
   1013     EXPORT_PC
   1014     add     r0, rFP, #OFF_FP_SHADOWFRAME
   1015     mov     r1, rSELF
   1016     mov     r2, rINST
   1017     bl      MterpNewInstance           @ (shadow_frame, self, inst_data)
   1018     cmp     r0, #0
   1019     beq     MterpPossibleException
   1020     FETCH_ADVANCE_INST 2               @ advance rPC, load rINST
   1021     GET_INST_OPCODE ip                 @ extract opcode from rINST
   1022     GOTO_OPCODE ip                     @ jump to next instruction
   1023 
   1024 /* ------------------------------ */
   1025     .balign 128
   1026 .L_op_new_array: /* 0x23 */
   1027 /* File: arm/op_new_array.S */
   1028     /*
   1029      * Allocate an array of objects, specified with the array class
   1030      * and a count.
   1031      *
   1032      * The verifier guarantees that this is an array class, so we don't
   1033      * check for it here.
   1034      */
   1035     /* new-array vA, vB, class@CCCC */
   1036     EXPORT_PC
   1037     add     r0, rFP, #OFF_FP_SHADOWFRAME
   1038     mov     r1, rPC
   1039     mov     r2, rINST
   1040     mov     r3, rSELF
   1041     bl      MterpNewArray
   1042     cmp     r0, #0
   1043     beq     MterpPossibleException
   1044     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1045     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1046     GOTO_OPCODE ip                      @ jump to next instruction
   1047 
   1048 /* ------------------------------ */
   1049     .balign 128
   1050 .L_op_filled_new_array: /* 0x24 */
   1051 /* File: arm/op_filled_new_array.S */
   1052     /*
   1053      * Create a new array with elements filled from registers.
   1054      *
   1055      * for: filled-new-array, filled-new-array/range
   1056      */
   1057     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   1058     /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
   1059     .extern MterpFilledNewArray
   1060     EXPORT_PC
   1061     add     r0, rFP, #OFF_FP_SHADOWFRAME
   1062     mov     r1, rPC
   1063     mov     r2, rSELF
   1064     bl      MterpFilledNewArray
   1065     cmp     r0, #0
   1066     beq     MterpPossibleException
   1067     FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
   1068     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1069     GOTO_OPCODE ip                      @ jump to next instruction
   1070 
   1071 /* ------------------------------ */
   1072     .balign 128
   1073 .L_op_filled_new_array_range: /* 0x25 */
   1074 /* File: arm/op_filled_new_array_range.S */
   1075 /* File: arm/op_filled_new_array.S */
   1076     /*
   1077      * Create a new array with elements filled from registers.
   1078      *
   1079      * for: filled-new-array, filled-new-array/range
   1080      */
   1081     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   1082     /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
   1083     .extern MterpFilledNewArrayRange
   1084     EXPORT_PC
   1085     add     r0, rFP, #OFF_FP_SHADOWFRAME
   1086     mov     r1, rPC
   1087     mov     r2, rSELF
   1088     bl      MterpFilledNewArrayRange
   1089     cmp     r0, #0
   1090     beq     MterpPossibleException
   1091     FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
   1092     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1093     GOTO_OPCODE ip                      @ jump to next instruction
   1094 
   1095 
   1096 /* ------------------------------ */
   1097     .balign 128
   1098 .L_op_fill_array_data: /* 0x26 */
   1099 /* File: arm/op_fill_array_data.S */
   1100     /* fill-array-data vAA, +BBBBBBBB */
   1101     EXPORT_PC
   1102     FETCH r0, 1                         @ r0<- bbbb (lo)
   1103     FETCH r1, 2                         @ r1<- BBBB (hi)
   1104     mov     r3, rINST, lsr #8           @ r3<- AA
   1105     orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
   1106     GET_VREG r0, r3                     @ r0<- vAA (array object)
   1107     add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
   1108     bl      MterpFillArrayData          @ (obj, payload)
   1109     cmp     r0, #0                      @ 0 means an exception is thrown
   1110     beq     MterpPossibleException      @ exception?
   1111     FETCH_ADVANCE_INST 3                @ advance rPC, load rINST
   1112     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1113     GOTO_OPCODE ip                      @ jump to next instruction
   1114 
   1115 /* ------------------------------ */
   1116     .balign 128
   1117 .L_op_throw: /* 0x27 */
   1118 /* File: arm/op_throw.S */
   1119     /*
   1120      * Throw an exception object in the current thread.
   1121      */
   1122     /* throw vAA */
   1123     EXPORT_PC
   1124     mov      r2, rINST, lsr #8           @ r2<- AA
   1125     GET_VREG r1, r2                      @ r1<- vAA (exception object)
   1126     cmp      r1, #0                      @ null object?
   1127     beq      common_errNullObject        @ yes, throw an NPE instead
   1128     str      r1, [rSELF, #THREAD_EXCEPTION_OFFSET]  @ thread->exception<- obj
   1129     b        MterpException
   1130 
   1131 /* ------------------------------ */
   1132     .balign 128
   1133 .L_op_goto: /* 0x28 */
   1134 /* File: arm/op_goto.S */
   1135     /*
   1136      * Unconditional branch, 8-bit offset.
   1137      *
   1138      * The branch distance is a signed code-unit offset, which we need to
   1139      * double to get a byte offset.
   1140      */
   1141     /* goto +AA */
   1142     sbfx    rINST, rINST, #8, #8           @ rINST<- ssssssAA (sign-extended)
   1143     b       MterpCommonTakenBranchNoFlags
   1144 
   1145 /* ------------------------------ */
   1146     .balign 128
   1147 .L_op_goto_16: /* 0x29 */
   1148 /* File: arm/op_goto_16.S */
   1149     /*
   1150      * Unconditional branch, 16-bit offset.
   1151      *
   1152      * The branch distance is a signed code-unit offset, which we need to
   1153      * double to get a byte offset.
   1154      */
   1155     /* goto/16 +AAAA */
   1156     FETCH_S rINST, 1                    @ rINST<- ssssAAAA (sign-extended)
   1157     b       MterpCommonTakenBranchNoFlags
   1158 
   1159 /* ------------------------------ */
   1160     .balign 128
   1161 .L_op_goto_32: /* 0x2a */
   1162 /* File: arm/op_goto_32.S */
   1163     /*
   1164      * Unconditional branch, 32-bit offset.
   1165      *
   1166      * The branch distance is a signed code-unit offset, which we need to
   1167      * double to get a byte offset.
   1168      *
   1169      * Unlike most opcodes, this one is allowed to branch to itself, so
   1170      * our "backward branch" test must be "<=0" instead of "<0".  Because
   1171      * we need the V bit set, we'll use an adds to convert from Dalvik
   1172      * offset to byte offset.
   1173      */
   1174     /* goto/32 +AAAAAAAA */
   1175     FETCH r0, 1                         @ r0<- aaaa (lo)
   1176     FETCH r3, 2                         @ r1<- AAAA (hi)
   1177     orrs    rINST, r0, r3, lsl #16      @ rINST<- AAAAaaaa
   1178     b       MterpCommonTakenBranch
   1179 
   1180 /* ------------------------------ */
   1181     .balign 128
   1182 .L_op_packed_switch: /* 0x2b */
   1183 /* File: arm/op_packed_switch.S */
   1184     /*
   1185      * Handle a packed-switch or sparse-switch instruction.  In both cases
   1186      * we decode it and hand it off to a helper function.
   1187      *
   1188      * We don't really expect backward branches in a switch statement, but
   1189      * they're perfectly legal, so we check for them here.
   1190      *
   1191      * for: packed-switch, sparse-switch
   1192      */
   1193     /* op vAA, +BBBB */
   1194     FETCH r0, 1                         @ r0<- bbbb (lo)
   1195     FETCH r1, 2                         @ r1<- BBBB (hi)
   1196     mov     r3, rINST, lsr #8           @ r3<- AA
   1197     orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
   1198     GET_VREG r1, r3                     @ r1<- vAA
   1199     add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
   1200     bl      MterpDoPackedSwitch                       @ r0<- code-unit branch offset
   1201     movs    rINST, r0
   1202     b       MterpCommonTakenBranch
   1203 
   1204 /* ------------------------------ */
   1205     .balign 128
   1206 .L_op_sparse_switch: /* 0x2c */
   1207 /* File: arm/op_sparse_switch.S */
   1208 /* File: arm/op_packed_switch.S */
   1209     /*
   1210      * Handle a packed-switch or sparse-switch instruction.  In both cases
   1211      * we decode it and hand it off to a helper function.
   1212      *
   1213      * We don't really expect backward branches in a switch statement, but
   1214      * they're perfectly legal, so we check for them here.
   1215      *
   1216      * for: packed-switch, sparse-switch
   1217      */
   1218     /* op vAA, +BBBB */
   1219     FETCH r0, 1                         @ r0<- bbbb (lo)
   1220     FETCH r1, 2                         @ r1<- BBBB (hi)
   1221     mov     r3, rINST, lsr #8           @ r3<- AA
   1222     orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
   1223     GET_VREG r1, r3                     @ r1<- vAA
   1224     add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
   1225     bl      MterpDoSparseSwitch                       @ r0<- code-unit branch offset
   1226     movs    rINST, r0
   1227     b       MterpCommonTakenBranch
   1228 
   1229 
   1230 /* ------------------------------ */
   1231     .balign 128
   1232 .L_op_cmpl_float: /* 0x2d */
   1233 /* File: arm/op_cmpl_float.S */
   1234     /*
   1235      * Compare two floating-point values.  Puts 0, 1, or -1 into the
   1236      * destination register based on the results of the comparison.
   1237      *
   1238      * int compare(x, y) {
   1239      *     if (x == y) {
   1240      *         return 0;
   1241      *     } else if (x > y) {
   1242      *         return 1;
   1243      *     } else if (x < y) {
   1244      *         return -1;
   1245      *     } else {
   1246      *         return -1;
   1247      *     }
   1248      * }
   1249      */
   1250     /* op vAA, vBB, vCC */
   1251     FETCH r0, 1                         @ r0<- CCBB
   1252     mov     r9, rINST, lsr #8           @ r9<- AA
   1253     and     r2, r0, #255                @ r2<- BB
   1254     mov     r3, r0, lsr #8              @ r3<- CC
   1255     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   1256     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   1257     flds    s0, [r2]                    @ s0<- vBB
   1258     flds    s1, [r3]                    @ s1<- vCC
   1259     vcmpe.f32  s0, s1                   @ compare (vBB, vCC)
   1260     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1261     mvn     r0, #0                      @ r0<- -1 (default)
   1262     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1263     fmstat                              @ export status flags
   1264     movgt   r0, #1                      @ (greater than) r1<- 1
   1265     moveq   r0, #0                      @ (equal) r1<- 0
   1266     SET_VREG r0, r9                     @ vAA<- r0
   1267     GOTO_OPCODE ip                      @ jump to next instruction
   1268 
   1269 /* ------------------------------ */
   1270     .balign 128
   1271 .L_op_cmpg_float: /* 0x2e */
   1272 /* File: arm/op_cmpg_float.S */
   1273     /*
   1274      * Compare two floating-point values.  Puts 0, 1, or -1 into the
   1275      * destination register based on the results of the comparison.
   1276      *
   1277      * int compare(x, y) {
   1278      *     if (x == y) {
   1279      *         return 0;
   1280      *     } else if (x < y) {
   1281      *         return -1;
   1282      *     } else if (x > y) {
   1283      *         return 1;
   1284      *     } else {
   1285      *         return 1;
   1286      *     }
   1287      * }
   1288      */
   1289     /* op vAA, vBB, vCC */
   1290     FETCH r0, 1                         @ r0<- CCBB
   1291     mov     r9, rINST, lsr #8           @ r9<- AA
   1292     and     r2, r0, #255                @ r2<- BB
   1293     mov     r3, r0, lsr #8              @ r3<- CC
   1294     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   1295     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   1296     flds    s0, [r2]                    @ s0<- vBB
   1297     flds    s1, [r3]                    @ s1<- vCC
   1298     vcmpe.f32 s0, s1                    @ compare (vBB, vCC)
   1299     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1300     mov     r0, #1                      @ r0<- 1 (default)
   1301     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1302     fmstat                              @ export status flags
   1303     mvnmi   r0, #0                      @ (less than) r1<- -1
   1304     moveq   r0, #0                      @ (equal) r1<- 0
   1305     SET_VREG r0, r9                     @ vAA<- r0
   1306     GOTO_OPCODE ip                      @ jump to next instruction
   1307 
   1308 /* ------------------------------ */
   1309     .balign 128
   1310 .L_op_cmpl_double: /* 0x2f */
   1311 /* File: arm/op_cmpl_double.S */
   1312     /*
   1313      * Compare two floating-point values.  Puts 0, 1, or -1 into the
   1314      * destination register based on the results of the comparison.
   1315      *
   1316      * int compare(x, y) {
   1317      *     if (x == y) {
   1318      *         return 0;
   1319      *     } else if (x > y) {
   1320      *         return 1;
   1321      *     } else if (x < y) {
   1322      *         return -1;
   1323      *     } else {
   1324      *         return -1;
   1325      *     }
   1326      * }
   1327      */
   1328     /* op vAA, vBB, vCC */
   1329     FETCH r0, 1                         @ r0<- CCBB
   1330     mov     r9, rINST, lsr #8           @ r9<- AA
   1331     and     r2, r0, #255                @ r2<- BB
   1332     mov     r3, r0, lsr #8              @ r3<- CC
   1333     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   1334     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   1335     fldd    d0, [r2]                    @ d0<- vBB
   1336     fldd    d1, [r3]                    @ d1<- vCC
   1337     vcmpe.f64 d0, d1                    @ compare (vBB, vCC)
   1338     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1339     mvn     r0, #0                      @ r0<- -1 (default)
   1340     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1341     fmstat                              @ export status flags
   1342     movgt   r0, #1                      @ (greater than) r1<- 1
   1343     moveq   r0, #0                      @ (equal) r1<- 0
   1344     SET_VREG r0, r9                     @ vAA<- r0
   1345     GOTO_OPCODE ip                      @ jump to next instruction
   1346 
   1347 /* ------------------------------ */
   1348     .balign 128
   1349 .L_op_cmpg_double: /* 0x30 */
   1350 /* File: arm/op_cmpg_double.S */
   1351     /*
   1352      * Compare two floating-point values.  Puts 0, 1, or -1 into the
   1353      * destination register based on the results of the comparison.
   1354      *
   1355      * int compare(x, y) {
   1356      *     if (x == y) {
   1357      *         return 0;
   1358      *     } else if (x < y) {
   1359      *         return -1;
   1360      *     } else if (x > y) {
   1361      *         return 1;
   1362      *     } else {
   1363      *         return 1;
   1364      *     }
   1365      * }
   1366      */
   1367     /* op vAA, vBB, vCC */
   1368     FETCH r0, 1                         @ r0<- CCBB
   1369     mov     r9, rINST, lsr #8           @ r9<- AA
   1370     and     r2, r0, #255                @ r2<- BB
   1371     mov     r3, r0, lsr #8              @ r3<- CC
   1372     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   1373     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   1374     fldd    d0, [r2]                    @ d0<- vBB
   1375     fldd    d1, [r3]                    @ d1<- vCC
   1376     vcmpe.f64 d0, d1                    @ compare (vBB, vCC)
   1377     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1378     mov     r0, #1                      @ r0<- 1 (default)
   1379     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1380     fmstat                              @ export status flags
   1381     mvnmi   r0, #0                      @ (less than) r1<- -1
   1382     moveq   r0, #0                      @ (equal) r1<- 0
   1383     SET_VREG r0, r9                     @ vAA<- r0
   1384     GOTO_OPCODE ip                      @ jump to next instruction
   1385 
   1386 /* ------------------------------ */
   1387     .balign 128
   1388 .L_op_cmp_long: /* 0x31 */
   1389 /* File: arm/op_cmp_long.S */
   1390     /*
   1391      * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
   1392      * register based on the results of the comparison.
   1393      */
   1394     /* cmp-long vAA, vBB, vCC */
   1395     FETCH r0, 1                         @ r0<- CCBB
   1396     mov     r9, rINST, lsr #8           @ r9<- AA
   1397     and     r2, r0, #255                @ r2<- BB
   1398     mov     r3, r0, lsr #8              @ r3<- CC
   1399     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
   1400     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
   1401     ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   1402     ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
   1403     cmp     r0, r2
   1404     sbcs    ip, r1, r3                  @ Sets correct CCs for checking LT (but not EQ/NE)
   1405     mov     ip, #0
   1406     mvnlt   ip, #0                      @ -1
   1407     cmpeq   r0, r2                      @ For correct EQ/NE, we may need to repeat the first CMP
   1408     orrne   ip, #1
   1409     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1410     SET_VREG ip, r9                     @ vAA<- ip
   1411     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1412     GOTO_OPCODE ip                      @ jump to next instruction
   1413 
   1414 /* ------------------------------ */
   1415     .balign 128
   1416 .L_op_if_eq: /* 0x32 */
   1417 /* File: arm/op_if_eq.S */
   1418 /* File: arm/bincmp.S */
   1419     /*
   1420      * Generic two-operand compare-and-branch operation.  Provide a "condition"
   1421      * fragment that specifies the comparison to perform.
   1422      *
   1423      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1424      */
   1425     /* if-cmp vA, vB, +CCCC */
   1426     mov     r1, rINST, lsr #12          @ r1<- B
   1427     ubfx    r0, rINST, #8, #4           @ r0<- A
   1428     GET_VREG r3, r1                     @ r3<- vB
   1429     GET_VREG r0, r0                     @ r0<- vA
   1430     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1431     cmp     r0, r3                      @ compare (vA, vB)
   1432     beq MterpCommonTakenBranchNoFlags
   1433     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1434     beq     .L_check_not_taken_osr
   1435     FETCH_ADVANCE_INST 2
   1436     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1437     GOTO_OPCODE ip                      @ jump to next instruction
   1438 
   1439 
   1440 /* ------------------------------ */
   1441     .balign 128
   1442 .L_op_if_ne: /* 0x33 */
   1443 /* File: arm/op_if_ne.S */
   1444 /* File: arm/bincmp.S */
   1445     /*
   1446      * Generic two-operand compare-and-branch operation.  Provide a "condition"
   1447      * fragment that specifies the comparison to perform.
   1448      *
   1449      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1450      */
   1451     /* if-cmp vA, vB, +CCCC */
   1452     mov     r1, rINST, lsr #12          @ r1<- B
   1453     ubfx    r0, rINST, #8, #4           @ r0<- A
   1454     GET_VREG r3, r1                     @ r3<- vB
   1455     GET_VREG r0, r0                     @ r0<- vA
   1456     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1457     cmp     r0, r3                      @ compare (vA, vB)
   1458     bne MterpCommonTakenBranchNoFlags
   1459     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1460     beq     .L_check_not_taken_osr
   1461     FETCH_ADVANCE_INST 2
   1462     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1463     GOTO_OPCODE ip                      @ jump to next instruction
   1464 
   1465 
   1466 /* ------------------------------ */
   1467     .balign 128
   1468 .L_op_if_lt: /* 0x34 */
   1469 /* File: arm/op_if_lt.S */
   1470 /* File: arm/bincmp.S */
   1471     /*
   1472      * Generic two-operand compare-and-branch operation.  Provide a "condition"
   1473      * fragment that specifies the comparison to perform.
   1474      *
   1475      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1476      */
   1477     /* if-cmp vA, vB, +CCCC */
   1478     mov     r1, rINST, lsr #12          @ r1<- B
   1479     ubfx    r0, rINST, #8, #4           @ r0<- A
   1480     GET_VREG r3, r1                     @ r3<- vB
   1481     GET_VREG r0, r0                     @ r0<- vA
   1482     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1483     cmp     r0, r3                      @ compare (vA, vB)
   1484     blt MterpCommonTakenBranchNoFlags
   1485     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1486     beq     .L_check_not_taken_osr
   1487     FETCH_ADVANCE_INST 2
   1488     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1489     GOTO_OPCODE ip                      @ jump to next instruction
   1490 
   1491 
   1492 /* ------------------------------ */
   1493     .balign 128
   1494 .L_op_if_ge: /* 0x35 */
   1495 /* File: arm/op_if_ge.S */
   1496 /* File: arm/bincmp.S */
   1497     /*
   1498      * Generic two-operand compare-and-branch operation.  Provide a "condition"
   1499      * fragment that specifies the comparison to perform.
   1500      *
   1501      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1502      */
   1503     /* if-cmp vA, vB, +CCCC */
   1504     mov     r1, rINST, lsr #12          @ r1<- B
   1505     ubfx    r0, rINST, #8, #4           @ r0<- A
   1506     GET_VREG r3, r1                     @ r3<- vB
   1507     GET_VREG r0, r0                     @ r0<- vA
   1508     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1509     cmp     r0, r3                      @ compare (vA, vB)
   1510     bge MterpCommonTakenBranchNoFlags
   1511     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1512     beq     .L_check_not_taken_osr
   1513     FETCH_ADVANCE_INST 2
   1514     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1515     GOTO_OPCODE ip                      @ jump to next instruction
   1516 
   1517 
   1518 /* ------------------------------ */
   1519     .balign 128
   1520 .L_op_if_gt: /* 0x36 */
   1521 /* File: arm/op_if_gt.S */
   1522 /* File: arm/bincmp.S */
   1523     /*
   1524      * Generic two-operand compare-and-branch operation.  Provide a "condition"
   1525      * fragment that specifies the comparison to perform.
   1526      *
   1527      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1528      */
   1529     /* if-cmp vA, vB, +CCCC */
   1530     mov     r1, rINST, lsr #12          @ r1<- B
   1531     ubfx    r0, rINST, #8, #4           @ r0<- A
   1532     GET_VREG r3, r1                     @ r3<- vB
   1533     GET_VREG r0, r0                     @ r0<- vA
   1534     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1535     cmp     r0, r3                      @ compare (vA, vB)
   1536     bgt MterpCommonTakenBranchNoFlags
   1537     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1538     beq     .L_check_not_taken_osr
   1539     FETCH_ADVANCE_INST 2
   1540     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1541     GOTO_OPCODE ip                      @ jump to next instruction
   1542 
   1543 
   1544 /* ------------------------------ */
   1545     .balign 128
   1546 .L_op_if_le: /* 0x37 */
   1547 /* File: arm/op_if_le.S */
   1548 /* File: arm/bincmp.S */
   1549     /*
   1550      * Generic two-operand compare-and-branch operation.  Provide a "condition"
   1551      * fragment that specifies the comparison to perform.
   1552      *
   1553      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1554      */
   1555     /* if-cmp vA, vB, +CCCC */
   1556     mov     r1, rINST, lsr #12          @ r1<- B
   1557     ubfx    r0, rINST, #8, #4           @ r0<- A
   1558     GET_VREG r3, r1                     @ r3<- vB
   1559     GET_VREG r0, r0                     @ r0<- vA
   1560     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1561     cmp     r0, r3                      @ compare (vA, vB)
   1562     ble MterpCommonTakenBranchNoFlags
   1563     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1564     beq     .L_check_not_taken_osr
   1565     FETCH_ADVANCE_INST 2
   1566     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1567     GOTO_OPCODE ip                      @ jump to next instruction
   1568 
   1569 
   1570 /* ------------------------------ */
   1571     .balign 128
   1572 .L_op_if_eqz: /* 0x38 */
   1573 /* File: arm/op_if_eqz.S */
   1574 /* File: arm/zcmp.S */
   1575     /*
   1576      * Generic one-operand compare-and-branch operation.  Provide a "condition"
   1577      * fragment that specifies the comparison to perform.
   1578      *
   1579      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   1580      */
   1581     /* if-cmp vAA, +BBBB */
   1582     mov     r0, rINST, lsr #8           @ r0<- AA
   1583     GET_VREG r0, r0                     @ r0<- vAA
   1584     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1585     cmp     r0, #0                      @ compare (vA, 0)
   1586     beq MterpCommonTakenBranchNoFlags
   1587     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1588     beq     .L_check_not_taken_osr
   1589     FETCH_ADVANCE_INST 2
   1590     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1591     GOTO_OPCODE ip                      @ jump to next instruction
   1592 
   1593 
   1594 /* ------------------------------ */
   1595     .balign 128
   1596 .L_op_if_nez: /* 0x39 */
   1597 /* File: arm/op_if_nez.S */
   1598 /* File: arm/zcmp.S */
   1599     /*
   1600      * Generic one-operand compare-and-branch operation.  Provide a "condition"
   1601      * fragment that specifies the comparison to perform.
   1602      *
   1603      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   1604      */
   1605     /* if-cmp vAA, +BBBB */
   1606     mov     r0, rINST, lsr #8           @ r0<- AA
   1607     GET_VREG r0, r0                     @ r0<- vAA
   1608     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1609     cmp     r0, #0                      @ compare (vA, 0)
   1610     bne MterpCommonTakenBranchNoFlags
   1611     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1612     beq     .L_check_not_taken_osr
   1613     FETCH_ADVANCE_INST 2
   1614     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1615     GOTO_OPCODE ip                      @ jump to next instruction
   1616 
   1617 
   1618 /* ------------------------------ */
   1619     .balign 128
   1620 .L_op_if_ltz: /* 0x3a */
   1621 /* File: arm/op_if_ltz.S */
   1622 /* File: arm/zcmp.S */
   1623     /*
   1624      * Generic one-operand compare-and-branch operation.  Provide a "condition"
   1625      * fragment that specifies the comparison to perform.
   1626      *
   1627      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   1628      */
   1629     /* if-cmp vAA, +BBBB */
   1630     mov     r0, rINST, lsr #8           @ r0<- AA
   1631     GET_VREG r0, r0                     @ r0<- vAA
   1632     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1633     cmp     r0, #0                      @ compare (vA, 0)
   1634     blt MterpCommonTakenBranchNoFlags
   1635     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1636     beq     .L_check_not_taken_osr
   1637     FETCH_ADVANCE_INST 2
   1638     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1639     GOTO_OPCODE ip                      @ jump to next instruction
   1640 
   1641 
   1642 /* ------------------------------ */
   1643     .balign 128
   1644 .L_op_if_gez: /* 0x3b */
   1645 /* File: arm/op_if_gez.S */
   1646 /* File: arm/zcmp.S */
   1647     /*
   1648      * Generic one-operand compare-and-branch operation.  Provide a "condition"
   1649      * fragment that specifies the comparison to perform.
   1650      *
   1651      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   1652      */
   1653     /* if-cmp vAA, +BBBB */
   1654     mov     r0, rINST, lsr #8           @ r0<- AA
   1655     GET_VREG r0, r0                     @ r0<- vAA
   1656     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1657     cmp     r0, #0                      @ compare (vA, 0)
   1658     bge MterpCommonTakenBranchNoFlags
   1659     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1660     beq     .L_check_not_taken_osr
   1661     FETCH_ADVANCE_INST 2
   1662     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1663     GOTO_OPCODE ip                      @ jump to next instruction
   1664 
   1665 
   1666 /* ------------------------------ */
   1667     .balign 128
   1668 .L_op_if_gtz: /* 0x3c */
   1669 /* File: arm/op_if_gtz.S */
   1670 /* File: arm/zcmp.S */
   1671     /*
   1672      * Generic one-operand compare-and-branch operation.  Provide a "condition"
   1673      * fragment that specifies the comparison to perform.
   1674      *
   1675      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   1676      */
   1677     /* if-cmp vAA, +BBBB */
   1678     mov     r0, rINST, lsr #8           @ r0<- AA
   1679     GET_VREG r0, r0                     @ r0<- vAA
   1680     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1681     cmp     r0, #0                      @ compare (vA, 0)
   1682     bgt MterpCommonTakenBranchNoFlags
   1683     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1684     beq     .L_check_not_taken_osr
   1685     FETCH_ADVANCE_INST 2
   1686     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1687     GOTO_OPCODE ip                      @ jump to next instruction
   1688 
   1689 
   1690 /* ------------------------------ */
   1691     .balign 128
   1692 .L_op_if_lez: /* 0x3d */
   1693 /* File: arm/op_if_lez.S */
   1694 /* File: arm/zcmp.S */
   1695     /*
   1696      * Generic one-operand compare-and-branch operation.  Provide a "condition"
   1697      * fragment that specifies the comparison to perform.
   1698      *
   1699      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   1700      */
   1701     /* if-cmp vAA, +BBBB */
   1702     mov     r0, rINST, lsr #8           @ r0<- AA
   1703     GET_VREG r0, r0                     @ r0<- vAA
   1704     FETCH_S rINST, 1                    @ rINST<- branch offset, in code units
   1705     cmp     r0, #0                      @ compare (vA, 0)
   1706     ble MterpCommonTakenBranchNoFlags
   1707     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   1708     beq     .L_check_not_taken_osr
   1709     FETCH_ADVANCE_INST 2
   1710     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1711     GOTO_OPCODE ip                      @ jump to next instruction
   1712 
   1713 
   1714 /* ------------------------------ */
   1715     .balign 128
   1716 .L_op_unused_3e: /* 0x3e */
   1717 /* File: arm/op_unused_3e.S */
   1718 /* File: arm/unused.S */
   1719 /*
   1720  * Bail to reference interpreter to throw.
   1721  */
   1722   b MterpFallback
   1723 
   1724 
   1725 /* ------------------------------ */
   1726     .balign 128
   1727 .L_op_unused_3f: /* 0x3f */
   1728 /* File: arm/op_unused_3f.S */
   1729 /* File: arm/unused.S */
   1730 /*
   1731  * Bail to reference interpreter to throw.
   1732  */
   1733   b MterpFallback
   1734 
   1735 
   1736 /* ------------------------------ */
   1737     .balign 128
   1738 .L_op_unused_40: /* 0x40 */
   1739 /* File: arm/op_unused_40.S */
   1740 /* File: arm/unused.S */
   1741 /*
   1742  * Bail to reference interpreter to throw.
   1743  */
   1744   b MterpFallback
   1745 
   1746 
   1747 /* ------------------------------ */
   1748     .balign 128
   1749 .L_op_unused_41: /* 0x41 */
   1750 /* File: arm/op_unused_41.S */
   1751 /* File: arm/unused.S */
   1752 /*
   1753  * Bail to reference interpreter to throw.
   1754  */
   1755   b MterpFallback
   1756 
   1757 
   1758 /* ------------------------------ */
   1759     .balign 128
   1760 .L_op_unused_42: /* 0x42 */
   1761 /* File: arm/op_unused_42.S */
   1762 /* File: arm/unused.S */
   1763 /*
   1764  * Bail to reference interpreter to throw.
   1765  */
   1766   b MterpFallback
   1767 
   1768 
   1769 /* ------------------------------ */
   1770     .balign 128
   1771 .L_op_unused_43: /* 0x43 */
   1772 /* File: arm/op_unused_43.S */
   1773 /* File: arm/unused.S */
   1774 /*
   1775  * Bail to reference interpreter to throw.
   1776  */
   1777   b MterpFallback
   1778 
   1779 
   1780 /* ------------------------------ */
   1781     .balign 128
   1782 .L_op_aget: /* 0x44 */
   1783 /* File: arm/op_aget.S */
   1784     /*
   1785      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   1786      *
   1787      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   1788      * instructions.  We use a pair of FETCH_Bs instead.
   1789      *
   1790      * for: aget, aget-boolean, aget-byte, aget-char, aget-short
   1791      *
   1792      * NOTE: assumes data offset for arrays is the same for all non-wide types.
   1793      * If this changes, specialize.
   1794      */
   1795     /* op vAA, vBB, vCC */
   1796     FETCH_B r2, 1, 0                    @ r2<- BB
   1797     mov     r9, rINST, lsr #8           @ r9<- AA
   1798     FETCH_B r3, 1, 1                    @ r3<- CC
   1799     GET_VREG r0, r2                     @ r0<- vBB (array object)
   1800     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   1801     cmp     r0, #0                      @ null array object?
   1802     beq     common_errNullObject        @ yes, bail
   1803     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
   1804     add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
   1805     cmp     r1, r3                      @ compare unsigned index, length
   1806     bcs     common_errArrayIndex        @ index >= length, bail
   1807     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1808     ldr   r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET]     @ r2<- vBB[vCC]
   1809     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1810     SET_VREG r2, r9                     @ vAA<- r2
   1811     GOTO_OPCODE ip                      @ jump to next instruction
   1812 
   1813 /* ------------------------------ */
   1814     .balign 128
   1815 .L_op_aget_wide: /* 0x45 */
   1816 /* File: arm/op_aget_wide.S */
   1817     /*
   1818      * Array get, 64 bits.  vAA <- vBB[vCC].
   1819      *
   1820      * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
   1821      */
   1822     /* aget-wide vAA, vBB, vCC */
   1823     FETCH r0, 1                         @ r0<- CCBB
   1824     mov     r9, rINST, lsr #8           @ r9<- AA
   1825     and     r2, r0, #255                @ r2<- BB
   1826     mov     r3, r0, lsr #8              @ r3<- CC
   1827     GET_VREG r0, r2                     @ r0<- vBB (array object)
   1828     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   1829     CLEAR_SHADOW_PAIR r9, r2, r3        @ Zero out the shadow regs
   1830     cmp     r0, #0                      @ null array object?
   1831     beq     common_errNullObject        @ yes, bail
   1832     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
   1833     add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
   1834     cmp     r1, r3                      @ compare unsigned index, length
   1835     bcs     common_errArrayIndex        @ index >= length, bail
   1836     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1837     ldrd    r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]  @ r2/r3<- vBB[vCC]
   1838     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
   1839     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1840     stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
   1841     GOTO_OPCODE ip                      @ jump to next instruction
   1842 
   1843 /* ------------------------------ */
   1844     .balign 128
   1845 .L_op_aget_object: /* 0x46 */
   1846 /* File: arm/op_aget_object.S */
   1847     /*
   1848      * Array object get.  vAA <- vBB[vCC].
   1849      *
   1850      * for: aget-object
   1851      */
   1852     /* op vAA, vBB, vCC */
   1853     FETCH_B r2, 1, 0                    @ r2<- BB
   1854     mov     r9, rINST, lsr #8           @ r9<- AA
   1855     FETCH_B r3, 1, 1                    @ r3<- CC
   1856     EXPORT_PC
   1857     GET_VREG r0, r2                     @ r0<- vBB (array object)
   1858     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   1859     bl       artAGetObjectFromMterp     @ (array, index)
   1860     ldr      r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
   1861     PREFETCH_INST 2
   1862     cmp      r1, #0
   1863     bne      MterpException
   1864     SET_VREG_OBJECT r0, r9
   1865     ADVANCE 2
   1866     GET_INST_OPCODE ip
   1867     GOTO_OPCODE ip                      @ jump to next instruction
   1868 
   1869 /* ------------------------------ */
   1870     .balign 128
   1871 .L_op_aget_boolean: /* 0x47 */
   1872 /* File: arm/op_aget_boolean.S */
   1873 /* File: arm/op_aget.S */
   1874     /*
   1875      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   1876      *
   1877      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   1878      * instructions.  We use a pair of FETCH_Bs instead.
   1879      *
   1880      * for: aget, aget-boolean, aget-byte, aget-char, aget-short
   1881      *
   1882      * NOTE: assumes data offset for arrays is the same for all non-wide types.
   1883      * If this changes, specialize.
   1884      */
   1885     /* op vAA, vBB, vCC */
   1886     FETCH_B r2, 1, 0                    @ r2<- BB
   1887     mov     r9, rINST, lsr #8           @ r9<- AA
   1888     FETCH_B r3, 1, 1                    @ r3<- CC
   1889     GET_VREG r0, r2                     @ r0<- vBB (array object)
   1890     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   1891     cmp     r0, #0                      @ null array object?
   1892     beq     common_errNullObject        @ yes, bail
   1893     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
   1894     add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
   1895     cmp     r1, r3                      @ compare unsigned index, length
   1896     bcs     common_errArrayIndex        @ index >= length, bail
   1897     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1898     ldrb   r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET]     @ r2<- vBB[vCC]
   1899     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1900     SET_VREG r2, r9                     @ vAA<- r2
   1901     GOTO_OPCODE ip                      @ jump to next instruction
   1902 
   1903 
   1904 /* ------------------------------ */
   1905     .balign 128
   1906 .L_op_aget_byte: /* 0x48 */
   1907 /* File: arm/op_aget_byte.S */
   1908 /* File: arm/op_aget.S */
   1909     /*
   1910      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   1911      *
   1912      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   1913      * instructions.  We use a pair of FETCH_Bs instead.
   1914      *
   1915      * for: aget, aget-boolean, aget-byte, aget-char, aget-short
   1916      *
   1917      * NOTE: assumes data offset for arrays is the same for all non-wide types.
   1918      * If this changes, specialize.
   1919      */
   1920     /* op vAA, vBB, vCC */
   1921     FETCH_B r2, 1, 0                    @ r2<- BB
   1922     mov     r9, rINST, lsr #8           @ r9<- AA
   1923     FETCH_B r3, 1, 1                    @ r3<- CC
   1924     GET_VREG r0, r2                     @ r0<- vBB (array object)
   1925     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   1926     cmp     r0, #0                      @ null array object?
   1927     beq     common_errNullObject        @ yes, bail
   1928     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
   1929     add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
   1930     cmp     r1, r3                      @ compare unsigned index, length
   1931     bcs     common_errArrayIndex        @ index >= length, bail
   1932     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1933     ldrsb   r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET]     @ r2<- vBB[vCC]
   1934     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1935     SET_VREG r2, r9                     @ vAA<- r2
   1936     GOTO_OPCODE ip                      @ jump to next instruction
   1937 
   1938 
   1939 /* ------------------------------ */
   1940     .balign 128
   1941 .L_op_aget_char: /* 0x49 */
   1942 /* File: arm/op_aget_char.S */
   1943 /* File: arm/op_aget.S */
   1944     /*
   1945      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   1946      *
   1947      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   1948      * instructions.  We use a pair of FETCH_Bs instead.
   1949      *
   1950      * for: aget, aget-boolean, aget-byte, aget-char, aget-short
   1951      *
   1952      * NOTE: assumes data offset for arrays is the same for all non-wide types.
   1953      * If this changes, specialize.
   1954      */
   1955     /* op vAA, vBB, vCC */
   1956     FETCH_B r2, 1, 0                    @ r2<- BB
   1957     mov     r9, rINST, lsr #8           @ r9<- AA
   1958     FETCH_B r3, 1, 1                    @ r3<- CC
   1959     GET_VREG r0, r2                     @ r0<- vBB (array object)
   1960     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   1961     cmp     r0, #0                      @ null array object?
   1962     beq     common_errNullObject        @ yes, bail
   1963     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
   1964     add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
   1965     cmp     r1, r3                      @ compare unsigned index, length
   1966     bcs     common_errArrayIndex        @ index >= length, bail
   1967     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   1968     ldrh   r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET]     @ r2<- vBB[vCC]
   1969     GET_INST_OPCODE ip                  @ extract opcode from rINST
   1970     SET_VREG r2, r9                     @ vAA<- r2
   1971     GOTO_OPCODE ip                      @ jump to next instruction
   1972 
   1973 
   1974 /* ------------------------------ */
   1975     .balign 128
   1976 .L_op_aget_short: /* 0x4a */
   1977 /* File: arm/op_aget_short.S */
   1978 /* File: arm/op_aget.S */
   1979     /*
   1980      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   1981      *
   1982      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   1983      * instructions.  We use a pair of FETCH_Bs instead.
   1984      *
   1985      * for: aget, aget-boolean, aget-byte, aget-char, aget-short
   1986      *
   1987      * NOTE: assumes data offset for arrays is the same for all non-wide types.
   1988      * If this changes, specialize.
   1989      */
   1990     /* op vAA, vBB, vCC */
   1991     FETCH_B r2, 1, 0                    @ r2<- BB
   1992     mov     r9, rINST, lsr #8           @ r9<- AA
   1993     FETCH_B r3, 1, 1                    @ r3<- CC
   1994     GET_VREG r0, r2                     @ r0<- vBB (array object)
   1995     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   1996     cmp     r0, #0                      @ null array object?
   1997     beq     common_errNullObject        @ yes, bail
   1998     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
   1999     add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
   2000     cmp     r1, r3                      @ compare unsigned index, length
   2001     bcs     common_errArrayIndex        @ index >= length, bail
   2002     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2003     ldrsh   r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET]     @ r2<- vBB[vCC]
   2004     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2005     SET_VREG r2, r9                     @ vAA<- r2
   2006     GOTO_OPCODE ip                      @ jump to next instruction
   2007 
   2008 
   2009 /* ------------------------------ */
   2010     .balign 128
   2011 .L_op_aput: /* 0x4b */
   2012 /* File: arm/op_aput.S */
   2013     /*
   2014      * Array put, 32 bits or less.  vBB[vCC] <- vAA.
   2015      *
   2016      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2017      * instructions.  We use a pair of FETCH_Bs instead.
   2018      *
   2019      * for: aput, aput-boolean, aput-byte, aput-char, aput-short
   2020      *
   2021      * NOTE: this assumes data offset for arrays is the same for all non-wide types.
   2022      * If this changes, specialize.
   2023      */
   2024     /* op vAA, vBB, vCC */
   2025     FETCH_B r2, 1, 0                    @ r2<- BB
   2026     mov     r9, rINST, lsr #8           @ r9<- AA
   2027     FETCH_B r3, 1, 1                    @ r3<- CC
   2028     GET_VREG r0, r2                     @ r0<- vBB (array object)
   2029     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   2030     cmp     r0, #0                      @ null array object?
   2031     beq     common_errNullObject        @ yes, bail
   2032     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]     @ r3<- arrayObj->length
   2033     add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
   2034     cmp     r1, r3                      @ compare unsigned index, length
   2035     bcs     common_errArrayIndex        @ index >= length, bail
   2036     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2037     GET_VREG r2, r9                     @ r2<- vAA
   2038     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2039     str  r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET]     @ vBB[vCC]<- r2
   2040     GOTO_OPCODE ip                      @ jump to next instruction
   2041 
   2042 /* ------------------------------ */
   2043     .balign 128
   2044 .L_op_aput_wide: /* 0x4c */
   2045 /* File: arm/op_aput_wide.S */
   2046     /*
   2047      * Array put, 64 bits.  vBB[vCC] <- vAA.
   2048      *
   2049      * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
   2050      */
   2051     /* aput-wide vAA, vBB, vCC */
   2052     FETCH r0, 1                         @ r0<- CCBB
   2053     mov     r9, rINST, lsr #8           @ r9<- AA
   2054     and     r2, r0, #255                @ r2<- BB
   2055     mov     r3, r0, lsr #8              @ r3<- CC
   2056     GET_VREG r0, r2                     @ r0<- vBB (array object)
   2057     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   2058     cmp     r0, #0                      @ null array object?
   2059     beq     common_errNullObject        @ yes, bail
   2060     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]    @ r3<- arrayObj->length
   2061     add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
   2062     cmp     r1, r3                      @ compare unsigned index, length
   2063     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
   2064     bcs     common_errArrayIndex        @ index >= length, bail
   2065     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2066     ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
   2067     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2068     strd    r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]  @ r2/r3<- vBB[vCC]
   2069     GOTO_OPCODE ip                      @ jump to next instruction
   2070 
   2071 /* ------------------------------ */
   2072     .balign 128
   2073 .L_op_aput_object: /* 0x4d */
   2074 /* File: arm/op_aput_object.S */
   2075     /*
   2076      * Store an object into an array.  vBB[vCC] <- vAA.
   2077      */
   2078     /* op vAA, vBB, vCC */
   2079     EXPORT_PC
   2080     add     r0, rFP, #OFF_FP_SHADOWFRAME
   2081     mov     r1, rPC
   2082     mov     r2, rINST
   2083     bl      MterpAputObject
   2084     cmp     r0, #0
   2085     beq     MterpPossibleException
   2086     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2087     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2088     GOTO_OPCODE ip                      @ jump to next instruction
   2089 
   2090 /* ------------------------------ */
   2091     .balign 128
   2092 .L_op_aput_boolean: /* 0x4e */
   2093 /* File: arm/op_aput_boolean.S */
   2094 /* File: arm/op_aput.S */
   2095     /*
   2096      * Array put, 32 bits or less.  vBB[vCC] <- vAA.
   2097      *
   2098      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2099      * instructions.  We use a pair of FETCH_Bs instead.
   2100      *
   2101      * for: aput, aput-boolean, aput-byte, aput-char, aput-short
   2102      *
   2103      * NOTE: this assumes data offset for arrays is the same for all non-wide types.
   2104      * If this changes, specialize.
   2105      */
   2106     /* op vAA, vBB, vCC */
   2107     FETCH_B r2, 1, 0                    @ r2<- BB
   2108     mov     r9, rINST, lsr #8           @ r9<- AA
   2109     FETCH_B r3, 1, 1                    @ r3<- CC
   2110     GET_VREG r0, r2                     @ r0<- vBB (array object)
   2111     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   2112     cmp     r0, #0                      @ null array object?
   2113     beq     common_errNullObject        @ yes, bail
   2114     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]     @ r3<- arrayObj->length
   2115     add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
   2116     cmp     r1, r3                      @ compare unsigned index, length
   2117     bcs     common_errArrayIndex        @ index >= length, bail
   2118     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2119     GET_VREG r2, r9                     @ r2<- vAA
   2120     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2121     strb  r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET]     @ vBB[vCC]<- r2
   2122     GOTO_OPCODE ip                      @ jump to next instruction
   2123 
   2124 
   2125 /* ------------------------------ */
   2126     .balign 128
   2127 .L_op_aput_byte: /* 0x4f */
   2128 /* File: arm/op_aput_byte.S */
   2129 /* File: arm/op_aput.S */
   2130     /*
   2131      * Array put, 32 bits or less.  vBB[vCC] <- vAA.
   2132      *
   2133      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2134      * instructions.  We use a pair of FETCH_Bs instead.
   2135      *
   2136      * for: aput, aput-boolean, aput-byte, aput-char, aput-short
   2137      *
   2138      * NOTE: this assumes data offset for arrays is the same for all non-wide types.
   2139      * If this changes, specialize.
   2140      */
   2141     /* op vAA, vBB, vCC */
   2142     FETCH_B r2, 1, 0                    @ r2<- BB
   2143     mov     r9, rINST, lsr #8           @ r9<- AA
   2144     FETCH_B r3, 1, 1                    @ r3<- CC
   2145     GET_VREG r0, r2                     @ r0<- vBB (array object)
   2146     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   2147     cmp     r0, #0                      @ null array object?
   2148     beq     common_errNullObject        @ yes, bail
   2149     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]     @ r3<- arrayObj->length
   2150     add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
   2151     cmp     r1, r3                      @ compare unsigned index, length
   2152     bcs     common_errArrayIndex        @ index >= length, bail
   2153     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2154     GET_VREG r2, r9                     @ r2<- vAA
   2155     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2156     strb  r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET]     @ vBB[vCC]<- r2
   2157     GOTO_OPCODE ip                      @ jump to next instruction
   2158 
   2159 
   2160 /* ------------------------------ */
   2161     .balign 128
   2162 .L_op_aput_char: /* 0x50 */
   2163 /* File: arm/op_aput_char.S */
   2164 /* File: arm/op_aput.S */
   2165     /*
   2166      * Array put, 32 bits or less.  vBB[vCC] <- vAA.
   2167      *
   2168      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2169      * instructions.  We use a pair of FETCH_Bs instead.
   2170      *
   2171      * for: aput, aput-boolean, aput-byte, aput-char, aput-short
   2172      *
   2173      * NOTE: this assumes data offset for arrays is the same for all non-wide types.
   2174      * If this changes, specialize.
   2175      */
   2176     /* op vAA, vBB, vCC */
   2177     FETCH_B r2, 1, 0                    @ r2<- BB
   2178     mov     r9, rINST, lsr #8           @ r9<- AA
   2179     FETCH_B r3, 1, 1                    @ r3<- CC
   2180     GET_VREG r0, r2                     @ r0<- vBB (array object)
   2181     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   2182     cmp     r0, #0                      @ null array object?
   2183     beq     common_errNullObject        @ yes, bail
   2184     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]     @ r3<- arrayObj->length
   2185     add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
   2186     cmp     r1, r3                      @ compare unsigned index, length
   2187     bcs     common_errArrayIndex        @ index >= length, bail
   2188     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2189     GET_VREG r2, r9                     @ r2<- vAA
   2190     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2191     strh  r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET]     @ vBB[vCC]<- r2
   2192     GOTO_OPCODE ip                      @ jump to next instruction
   2193 
   2194 
   2195 /* ------------------------------ */
   2196     .balign 128
   2197 .L_op_aput_short: /* 0x51 */
   2198 /* File: arm/op_aput_short.S */
   2199 /* File: arm/op_aput.S */
   2200     /*
   2201      * Array put, 32 bits or less.  vBB[vCC] <- vAA.
   2202      *
   2203      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2204      * instructions.  We use a pair of FETCH_Bs instead.
   2205      *
   2206      * for: aput, aput-boolean, aput-byte, aput-char, aput-short
   2207      *
   2208      * NOTE: this assumes data offset for arrays is the same for all non-wide types.
   2209      * If this changes, specialize.
   2210      */
   2211     /* op vAA, vBB, vCC */
   2212     FETCH_B r2, 1, 0                    @ r2<- BB
   2213     mov     r9, rINST, lsr #8           @ r9<- AA
   2214     FETCH_B r3, 1, 1                    @ r3<- CC
   2215     GET_VREG r0, r2                     @ r0<- vBB (array object)
   2216     GET_VREG r1, r3                     @ r1<- vCC (requested index)
   2217     cmp     r0, #0                      @ null array object?
   2218     beq     common_errNullObject        @ yes, bail
   2219     ldr     r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET]     @ r3<- arrayObj->length
   2220     add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
   2221     cmp     r1, r3                      @ compare unsigned index, length
   2222     bcs     common_errArrayIndex        @ index >= length, bail
   2223     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2224     GET_VREG r2, r9                     @ r2<- vAA
   2225     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2226     strh  r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET]     @ vBB[vCC]<- r2
   2227     GOTO_OPCODE ip                      @ jump to next instruction
   2228 
   2229 
   2230 /* ------------------------------ */
   2231     .balign 128
   2232 .L_op_iget: /* 0x52 */
   2233 /* File: arm/op_iget.S */
   2234     /*
   2235      * General instance field get.
   2236      *
   2237      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   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       artGet32InstanceFromCode
   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      MterpPossibleException        @ bail out
   2251     .if 0
   2252     SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
   2253     .else
   2254     SET_VREG r0, r2                        @ fp[A]<- r0
   2255     .endif
   2256     ADVANCE 2
   2257     GET_INST_OPCODE ip                     @ extract opcode from rINST
   2258     GOTO_OPCODE ip                         @ jump to next instruction
   2259 
   2260 /* ------------------------------ */
   2261     .balign 128
   2262 .L_op_iget_wide: /* 0x53 */
   2263 /* File: arm/op_iget_wide.S */
   2264     /*
   2265      * 64-bit instance field get.
   2266      *
   2267      * for: iget-wide
   2268      */
   2269     EXPORT_PC
   2270     FETCH    r0, 1                         @ r0<- field ref CCCC
   2271     mov      r1, rINST, lsr #12            @ r1<- B
   2272     GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
   2273     ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
   2274     mov      r3, rSELF                     @ r3<- self
   2275     bl       artGet64InstanceFromCode
   2276     ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2277     ubfx     r2, rINST, #8, #4             @ r2<- A
   2278     PREFETCH_INST 2
   2279     cmp      r3, #0
   2280     bne      MterpException                @ bail out
   2281     CLEAR_SHADOW_PAIR r2, ip, lr           @ Zero out the shadow regs
   2282     VREG_INDEX_TO_ADDR r3, r2              @ r3<- &fp[A]
   2283     stmia    r3, {r0-r1}                   @ fp[A]<- r0/r1
   2284     ADVANCE 2
   2285     GET_INST_OPCODE ip                     @ extract opcode from rINST
   2286     GOTO_OPCODE ip                         @ jump to next instruction
   2287 
   2288 /* ------------------------------ */
   2289     .balign 128
   2290 .L_op_iget_object: /* 0x54 */
   2291 /* File: arm/op_iget_object.S */
   2292 /* File: arm/op_iget.S */
   2293     /*
   2294      * General instance field get.
   2295      *
   2296      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2297      */
   2298     EXPORT_PC
   2299     FETCH    r0, 1                         @ r0<- field ref CCCC
   2300     mov      r1, rINST, lsr #12            @ r1<- B
   2301     GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
   2302     ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
   2303     mov      r3, rSELF                     @ r3<- self
   2304     bl       artGetObjInstanceFromCode
   2305     ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2306     ubfx     r2, rINST, #8, #4             @ r2<- A
   2307     PREFETCH_INST 2
   2308     cmp      r3, #0
   2309     bne      MterpPossibleException        @ bail out
   2310     .if 1
   2311     SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
   2312     .else
   2313     SET_VREG r0, r2                        @ fp[A]<- r0
   2314     .endif
   2315     ADVANCE 2
   2316     GET_INST_OPCODE ip                     @ extract opcode from rINST
   2317     GOTO_OPCODE ip                         @ jump to next instruction
   2318 
   2319 
   2320 /* ------------------------------ */
   2321     .balign 128
   2322 .L_op_iget_boolean: /* 0x55 */
   2323 /* File: arm/op_iget_boolean.S */
   2324 /* File: arm/op_iget.S */
   2325     /*
   2326      * General instance field get.
   2327      *
   2328      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2329      */
   2330     EXPORT_PC
   2331     FETCH    r0, 1                         @ r0<- field ref CCCC
   2332     mov      r1, rINST, lsr #12            @ r1<- B
   2333     GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
   2334     ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
   2335     mov      r3, rSELF                     @ r3<- self
   2336     bl       artGetBooleanInstanceFromCode
   2337     ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2338     ubfx     r2, rINST, #8, #4             @ r2<- A
   2339     PREFETCH_INST 2
   2340     cmp      r3, #0
   2341     bne      MterpPossibleException        @ bail out
   2342     .if 0
   2343     SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
   2344     .else
   2345     SET_VREG r0, r2                        @ fp[A]<- r0
   2346     .endif
   2347     ADVANCE 2
   2348     GET_INST_OPCODE ip                     @ extract opcode from rINST
   2349     GOTO_OPCODE ip                         @ jump to next instruction
   2350 
   2351 
   2352 /* ------------------------------ */
   2353     .balign 128
   2354 .L_op_iget_byte: /* 0x56 */
   2355 /* File: arm/op_iget_byte.S */
   2356 /* File: arm/op_iget.S */
   2357     /*
   2358      * General instance field get.
   2359      *
   2360      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2361      */
   2362     EXPORT_PC
   2363     FETCH    r0, 1                         @ r0<- field ref CCCC
   2364     mov      r1, rINST, lsr #12            @ r1<- B
   2365     GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
   2366     ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
   2367     mov      r3, rSELF                     @ r3<- self
   2368     bl       artGetByteInstanceFromCode
   2369     ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2370     ubfx     r2, rINST, #8, #4             @ r2<- A
   2371     PREFETCH_INST 2
   2372     cmp      r3, #0
   2373     bne      MterpPossibleException        @ bail out
   2374     .if 0
   2375     SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
   2376     .else
   2377     SET_VREG r0, r2                        @ fp[A]<- r0
   2378     .endif
   2379     ADVANCE 2
   2380     GET_INST_OPCODE ip                     @ extract opcode from rINST
   2381     GOTO_OPCODE ip                         @ jump to next instruction
   2382 
   2383 
   2384 /* ------------------------------ */
   2385     .balign 128
   2386 .L_op_iget_char: /* 0x57 */
   2387 /* File: arm/op_iget_char.S */
   2388 /* File: arm/op_iget.S */
   2389     /*
   2390      * General instance field get.
   2391      *
   2392      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2393      */
   2394     EXPORT_PC
   2395     FETCH    r0, 1                         @ r0<- field ref CCCC
   2396     mov      r1, rINST, lsr #12            @ r1<- B
   2397     GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
   2398     ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
   2399     mov      r3, rSELF                     @ r3<- self
   2400     bl       artGetCharInstanceFromCode
   2401     ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2402     ubfx     r2, rINST, #8, #4             @ r2<- A
   2403     PREFETCH_INST 2
   2404     cmp      r3, #0
   2405     bne      MterpPossibleException        @ bail out
   2406     .if 0
   2407     SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
   2408     .else
   2409     SET_VREG r0, r2                        @ fp[A]<- r0
   2410     .endif
   2411     ADVANCE 2
   2412     GET_INST_OPCODE ip                     @ extract opcode from rINST
   2413     GOTO_OPCODE ip                         @ jump to next instruction
   2414 
   2415 
   2416 /* ------------------------------ */
   2417     .balign 128
   2418 .L_op_iget_short: /* 0x58 */
   2419 /* File: arm/op_iget_short.S */
   2420 /* File: arm/op_iget.S */
   2421     /*
   2422      * General instance field get.
   2423      *
   2424      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2425      */
   2426     EXPORT_PC
   2427     FETCH    r0, 1                         @ r0<- field ref CCCC
   2428     mov      r1, rINST, lsr #12            @ r1<- B
   2429     GET_VREG r1, r1                        @ r1<- fp[B], the object pointer
   2430     ldr      r2, [rFP, #OFF_FP_METHOD]     @ r2<- referrer
   2431     mov      r3, rSELF                     @ r3<- self
   2432     bl       artGetShortInstanceFromCode
   2433     ldr      r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2434     ubfx     r2, rINST, #8, #4             @ r2<- A
   2435     PREFETCH_INST 2
   2436     cmp      r3, #0
   2437     bne      MterpPossibleException        @ bail out
   2438     .if 0
   2439     SET_VREG_OBJECT r0, r2                 @ fp[A]<- r0
   2440     .else
   2441     SET_VREG r0, r2                        @ fp[A]<- r0
   2442     .endif
   2443     ADVANCE 2
   2444     GET_INST_OPCODE ip                     @ extract opcode from rINST
   2445     GOTO_OPCODE ip                         @ jump to next instruction
   2446 
   2447 
   2448 /* ------------------------------ */
   2449     .balign 128
   2450 .L_op_iput: /* 0x59 */
   2451 /* File: arm/op_iput.S */
   2452     /*
   2453      * General 32-bit instance field put.
   2454      *
   2455      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   2456      */
   2457     /* op vA, vB, field@CCCC */
   2458     .extern artSet32InstanceFromMterp
   2459     EXPORT_PC
   2460     FETCH    r0, 1                      @ r0<- field ref CCCC
   2461     mov      r1, rINST, lsr #12         @ r1<- B
   2462     GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
   2463     ubfx     r2, rINST, #8, #4          @ r2<- A
   2464     GET_VREG r2, r2                     @ r2<- fp[A]
   2465     ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
   2466     PREFETCH_INST 2
   2467     bl       artSet32InstanceFromMterp
   2468     cmp      r0, #0
   2469     bne      MterpPossibleException
   2470     ADVANCE  2                          @ advance rPC
   2471     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2472     GOTO_OPCODE ip                      @ jump to next instruction
   2473 
   2474 /* ------------------------------ */
   2475     .balign 128
   2476 .L_op_iput_wide: /* 0x5a */
   2477 /* File: arm/op_iput_wide.S */
   2478     /* iput-wide vA, vB, field@CCCC */
   2479     .extern artSet64InstanceFromMterp
   2480     EXPORT_PC
   2481     FETCH    r0, 1                      @ r0<- field ref CCCC
   2482     mov      r1, rINST, lsr #12         @ r1<- B
   2483     GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
   2484     ubfx     r2, rINST, #8, #4          @ r2<- A
   2485     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[A]
   2486     ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
   2487     PREFETCH_INST 2
   2488     bl       artSet64InstanceFromMterp
   2489     cmp      r0, #0
   2490     bne      MterpPossibleException
   2491     ADVANCE  2                          @ advance rPC
   2492     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2493     GOTO_OPCODE ip                      @ jump to next instruction
   2494 
   2495 /* ------------------------------ */
   2496     .balign 128
   2497 .L_op_iput_object: /* 0x5b */
   2498 /* File: arm/op_iput_object.S */
   2499     EXPORT_PC
   2500     add     r0, rFP, #OFF_FP_SHADOWFRAME
   2501     mov     r1, rPC
   2502     mov     r2, rINST
   2503     mov     r3, rSELF
   2504     bl      MterpIputObject
   2505     cmp     r0, #0
   2506     beq     MterpException
   2507     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2508     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2509     GOTO_OPCODE ip                      @ jump to next instruction
   2510 
   2511 /* ------------------------------ */
   2512     .balign 128
   2513 .L_op_iput_boolean: /* 0x5c */
   2514 /* File: arm/op_iput_boolean.S */
   2515 /* File: arm/op_iput.S */
   2516     /*
   2517      * General 32-bit instance field put.
   2518      *
   2519      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   2520      */
   2521     /* op vA, vB, field@CCCC */
   2522     .extern artSet8InstanceFromMterp
   2523     EXPORT_PC
   2524     FETCH    r0, 1                      @ r0<- field ref CCCC
   2525     mov      r1, rINST, lsr #12         @ r1<- B
   2526     GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
   2527     ubfx     r2, rINST, #8, #4          @ r2<- A
   2528     GET_VREG r2, r2                     @ r2<- fp[A]
   2529     ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
   2530     PREFETCH_INST 2
   2531     bl       artSet8InstanceFromMterp
   2532     cmp      r0, #0
   2533     bne      MterpPossibleException
   2534     ADVANCE  2                          @ advance rPC
   2535     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2536     GOTO_OPCODE ip                      @ jump to next instruction
   2537 
   2538 
   2539 /* ------------------------------ */
   2540     .balign 128
   2541 .L_op_iput_byte: /* 0x5d */
   2542 /* File: arm/op_iput_byte.S */
   2543 /* File: arm/op_iput.S */
   2544     /*
   2545      * General 32-bit instance field put.
   2546      *
   2547      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   2548      */
   2549     /* op vA, vB, field@CCCC */
   2550     .extern artSet8InstanceFromMterp
   2551     EXPORT_PC
   2552     FETCH    r0, 1                      @ r0<- field ref CCCC
   2553     mov      r1, rINST, lsr #12         @ r1<- B
   2554     GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
   2555     ubfx     r2, rINST, #8, #4          @ r2<- A
   2556     GET_VREG r2, r2                     @ r2<- fp[A]
   2557     ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
   2558     PREFETCH_INST 2
   2559     bl       artSet8InstanceFromMterp
   2560     cmp      r0, #0
   2561     bne      MterpPossibleException
   2562     ADVANCE  2                          @ advance rPC
   2563     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2564     GOTO_OPCODE ip                      @ jump to next instruction
   2565 
   2566 
   2567 /* ------------------------------ */
   2568     .balign 128
   2569 .L_op_iput_char: /* 0x5e */
   2570 /* File: arm/op_iput_char.S */
   2571 /* File: arm/op_iput.S */
   2572     /*
   2573      * General 32-bit instance field put.
   2574      *
   2575      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   2576      */
   2577     /* op vA, vB, field@CCCC */
   2578     .extern artSet16InstanceFromMterp
   2579     EXPORT_PC
   2580     FETCH    r0, 1                      @ r0<- field ref CCCC
   2581     mov      r1, rINST, lsr #12         @ r1<- B
   2582     GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
   2583     ubfx     r2, rINST, #8, #4          @ r2<- A
   2584     GET_VREG r2, r2                     @ r2<- fp[A]
   2585     ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
   2586     PREFETCH_INST 2
   2587     bl       artSet16InstanceFromMterp
   2588     cmp      r0, #0
   2589     bne      MterpPossibleException
   2590     ADVANCE  2                          @ advance rPC
   2591     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2592     GOTO_OPCODE ip                      @ jump to next instruction
   2593 
   2594 
   2595 /* ------------------------------ */
   2596     .balign 128
   2597 .L_op_iput_short: /* 0x5f */
   2598 /* File: arm/op_iput_short.S */
   2599 /* File: arm/op_iput.S */
   2600     /*
   2601      * General 32-bit instance field put.
   2602      *
   2603      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   2604      */
   2605     /* op vA, vB, field@CCCC */
   2606     .extern artSet16InstanceFromMterp
   2607     EXPORT_PC
   2608     FETCH    r0, 1                      @ r0<- field ref CCCC
   2609     mov      r1, rINST, lsr #12         @ r1<- B
   2610     GET_VREG r1, r1                     @ r1<- fp[B], the object pointer
   2611     ubfx     r2, rINST, #8, #4          @ r2<- A
   2612     GET_VREG r2, r2                     @ r2<- fp[A]
   2613     ldr      r3, [rFP, #OFF_FP_METHOD]  @ r3<- referrer
   2614     PREFETCH_INST 2
   2615     bl       artSet16InstanceFromMterp
   2616     cmp      r0, #0
   2617     bne      MterpPossibleException
   2618     ADVANCE  2                          @ advance rPC
   2619     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2620     GOTO_OPCODE ip                      @ jump to next instruction
   2621 
   2622 
   2623 /* ------------------------------ */
   2624     .balign 128
   2625 .L_op_sget: /* 0x60 */
   2626 /* File: arm/op_sget.S */
   2627     /*
   2628      * General SGET handler wrapper.
   2629      *
   2630      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   2631      */
   2632     /* op vAA, field@BBBB */
   2633 
   2634     .extern MterpGet32Static
   2635     EXPORT_PC
   2636     FETCH r0, 1                         @ r0<- field ref BBBB
   2637     ldr   r1, [rFP, #OFF_FP_METHOD]
   2638     mov   r2, rSELF
   2639     bl    MterpGet32Static
   2640     ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2641     mov   r2, rINST, lsr #8             @ r2<- AA
   2642     PREFETCH_INST 2
   2643     cmp   r3, #0                        @ Fail to resolve?
   2644     bne   MterpException                @ bail out
   2645 .if 0
   2646     SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
   2647 .else
   2648     SET_VREG r0, r2                     @ fp[AA]<- r0
   2649 .endif
   2650     ADVANCE 2
   2651     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2652     GOTO_OPCODE ip
   2653 
   2654 /* ------------------------------ */
   2655     .balign 128
   2656 .L_op_sget_wide: /* 0x61 */
   2657 /* File: arm/op_sget_wide.S */
   2658     /*
   2659      * SGET_WIDE handler wrapper.
   2660      *
   2661      */
   2662     /* sget-wide vAA, field@BBBB */
   2663 
   2664     .extern MterpGet64Static
   2665     EXPORT_PC
   2666     FETCH r0, 1                         @ r0<- field ref BBBB
   2667     ldr   r1, [rFP, #OFF_FP_METHOD]
   2668     mov   r2, rSELF
   2669     bl    MterpGet64Static
   2670     ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2671     mov   r9, rINST, lsr #8             @ r9<- AA
   2672     VREG_INDEX_TO_ADDR lr, r9           @ r9<- &fp[AA]
   2673     cmp   r3, #0                        @ Fail to resolve?
   2674     bne   MterpException                @ bail out
   2675     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2676     CLEAR_SHADOW_PAIR r9, r2, ip        @ Zero out the shadow regs
   2677     stmia lr, {r0-r1}                   @ vAA/vAA+1<- r0/r1
   2678     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2679     GOTO_OPCODE ip                      @ jump to next instruction
   2680 
   2681 /* ------------------------------ */
   2682     .balign 128
   2683 .L_op_sget_object: /* 0x62 */
   2684 /* File: arm/op_sget_object.S */
   2685 /* File: arm/op_sget.S */
   2686     /*
   2687      * General SGET handler wrapper.
   2688      *
   2689      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   2690      */
   2691     /* op vAA, field@BBBB */
   2692 
   2693     .extern MterpGetObjStatic
   2694     EXPORT_PC
   2695     FETCH r0, 1                         @ r0<- field ref BBBB
   2696     ldr   r1, [rFP, #OFF_FP_METHOD]
   2697     mov   r2, rSELF
   2698     bl    MterpGetObjStatic
   2699     ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2700     mov   r2, rINST, lsr #8             @ r2<- AA
   2701     PREFETCH_INST 2
   2702     cmp   r3, #0                        @ Fail to resolve?
   2703     bne   MterpException                @ bail out
   2704 .if 1
   2705     SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
   2706 .else
   2707     SET_VREG r0, r2                     @ fp[AA]<- r0
   2708 .endif
   2709     ADVANCE 2
   2710     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2711     GOTO_OPCODE ip
   2712 
   2713 
   2714 /* ------------------------------ */
   2715     .balign 128
   2716 .L_op_sget_boolean: /* 0x63 */
   2717 /* File: arm/op_sget_boolean.S */
   2718 /* File: arm/op_sget.S */
   2719     /*
   2720      * General SGET handler wrapper.
   2721      *
   2722      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   2723      */
   2724     /* op vAA, field@BBBB */
   2725 
   2726     .extern MterpGetBooleanStatic
   2727     EXPORT_PC
   2728     FETCH r0, 1                         @ r0<- field ref BBBB
   2729     ldr   r1, [rFP, #OFF_FP_METHOD]
   2730     mov   r2, rSELF
   2731     bl    MterpGetBooleanStatic
   2732     ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2733     mov   r2, rINST, lsr #8             @ r2<- AA
   2734     PREFETCH_INST 2
   2735     cmp   r3, #0                        @ Fail to resolve?
   2736     bne   MterpException                @ bail out
   2737 .if 0
   2738     SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
   2739 .else
   2740     SET_VREG r0, r2                     @ fp[AA]<- r0
   2741 .endif
   2742     ADVANCE 2
   2743     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2744     GOTO_OPCODE ip
   2745 
   2746 
   2747 /* ------------------------------ */
   2748     .balign 128
   2749 .L_op_sget_byte: /* 0x64 */
   2750 /* File: arm/op_sget_byte.S */
   2751 /* File: arm/op_sget.S */
   2752     /*
   2753      * General SGET handler wrapper.
   2754      *
   2755      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   2756      */
   2757     /* op vAA, field@BBBB */
   2758 
   2759     .extern MterpGetByteStatic
   2760     EXPORT_PC
   2761     FETCH r0, 1                         @ r0<- field ref BBBB
   2762     ldr   r1, [rFP, #OFF_FP_METHOD]
   2763     mov   r2, rSELF
   2764     bl    MterpGetByteStatic
   2765     ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2766     mov   r2, rINST, lsr #8             @ r2<- AA
   2767     PREFETCH_INST 2
   2768     cmp   r3, #0                        @ Fail to resolve?
   2769     bne   MterpException                @ bail out
   2770 .if 0
   2771     SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
   2772 .else
   2773     SET_VREG r0, r2                     @ fp[AA]<- r0
   2774 .endif
   2775     ADVANCE 2
   2776     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2777     GOTO_OPCODE ip
   2778 
   2779 
   2780 /* ------------------------------ */
   2781     .balign 128
   2782 .L_op_sget_char: /* 0x65 */
   2783 /* File: arm/op_sget_char.S */
   2784 /* File: arm/op_sget.S */
   2785     /*
   2786      * General SGET handler wrapper.
   2787      *
   2788      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   2789      */
   2790     /* op vAA, field@BBBB */
   2791 
   2792     .extern MterpGetCharStatic
   2793     EXPORT_PC
   2794     FETCH r0, 1                         @ r0<- field ref BBBB
   2795     ldr   r1, [rFP, #OFF_FP_METHOD]
   2796     mov   r2, rSELF
   2797     bl    MterpGetCharStatic
   2798     ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2799     mov   r2, rINST, lsr #8             @ r2<- AA
   2800     PREFETCH_INST 2
   2801     cmp   r3, #0                        @ Fail to resolve?
   2802     bne   MterpException                @ bail out
   2803 .if 0
   2804     SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
   2805 .else
   2806     SET_VREG r0, r2                     @ fp[AA]<- r0
   2807 .endif
   2808     ADVANCE 2
   2809     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2810     GOTO_OPCODE ip
   2811 
   2812 
   2813 /* ------------------------------ */
   2814     .balign 128
   2815 .L_op_sget_short: /* 0x66 */
   2816 /* File: arm/op_sget_short.S */
   2817 /* File: arm/op_sget.S */
   2818     /*
   2819      * General SGET handler wrapper.
   2820      *
   2821      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   2822      */
   2823     /* op vAA, field@BBBB */
   2824 
   2825     .extern MterpGetShortStatic
   2826     EXPORT_PC
   2827     FETCH r0, 1                         @ r0<- field ref BBBB
   2828     ldr   r1, [rFP, #OFF_FP_METHOD]
   2829     mov   r2, rSELF
   2830     bl    MterpGetShortStatic
   2831     ldr   r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   2832     mov   r2, rINST, lsr #8             @ r2<- AA
   2833     PREFETCH_INST 2
   2834     cmp   r3, #0                        @ Fail to resolve?
   2835     bne   MterpException                @ bail out
   2836 .if 0
   2837     SET_VREG_OBJECT r0, r2              @ fp[AA]<- r0
   2838 .else
   2839     SET_VREG r0, r2                     @ fp[AA]<- r0
   2840 .endif
   2841     ADVANCE 2
   2842     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2843     GOTO_OPCODE ip
   2844 
   2845 
   2846 /* ------------------------------ */
   2847     .balign 128
   2848 .L_op_sput: /* 0x67 */
   2849 /* File: arm/op_sput.S */
   2850     /*
   2851      * General SPUT handler wrapper.
   2852      *
   2853      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
   2854      */
   2855     /* op vAA, field@BBBB */
   2856     EXPORT_PC
   2857     FETCH   r0, 1                       @ r0<- field ref BBBB
   2858     mov     r3, rINST, lsr #8           @ r3<- AA
   2859     GET_VREG r1, r3                     @ r1<= fp[AA]
   2860     ldr     r2, [rFP, #OFF_FP_METHOD]
   2861     mov     r3, rSELF
   2862     PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
   2863     bl      MterpSet32Static
   2864     cmp     r0, #0                      @ 0 on success, -1 on failure
   2865     bne     MterpException
   2866     ADVANCE 2                           @ Past exception point - now advance rPC
   2867     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2868     GOTO_OPCODE ip                      @ jump to next instruction
   2869 
   2870 /* ------------------------------ */
   2871     .balign 128
   2872 .L_op_sput_wide: /* 0x68 */
   2873 /* File: arm/op_sput_wide.S */
   2874     /*
   2875      * SPUT_WIDE handler wrapper.
   2876      *
   2877      */
   2878     /* sput-wide vAA, field@BBBB */
   2879     .extern MterpSet64Static
   2880     EXPORT_PC
   2881     FETCH   r0, 1                       @ r0<- field ref BBBB
   2882     mov     r1, rINST, lsr #8           @ r1<- AA
   2883     VREG_INDEX_TO_ADDR r1, r1
   2884     ldr     r2, [rFP, #OFF_FP_METHOD]
   2885     mov     r3, rSELF
   2886     PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
   2887     bl      MterpSet64Static
   2888     cmp     r0, #0                      @ 0 on success, -1 on failure
   2889     bne     MterpException
   2890     ADVANCE 2                           @ Past exception point - now advance rPC
   2891     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2892     GOTO_OPCODE ip                      @ jump to next instruction
   2893 
   2894 /* ------------------------------ */
   2895     .balign 128
   2896 .L_op_sput_object: /* 0x69 */
   2897 /* File: arm/op_sput_object.S */
   2898     EXPORT_PC
   2899     add     r0, rFP, #OFF_FP_SHADOWFRAME
   2900     mov     r1, rPC
   2901     mov     r2, rINST
   2902     mov     r3, rSELF
   2903     bl      MterpSputObject
   2904     cmp     r0, #0
   2905     beq     MterpException
   2906     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   2907     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2908     GOTO_OPCODE ip                      @ jump to next instruction
   2909 
   2910 /* ------------------------------ */
   2911     .balign 128
   2912 .L_op_sput_boolean: /* 0x6a */
   2913 /* File: arm/op_sput_boolean.S */
   2914 /* File: arm/op_sput.S */
   2915     /*
   2916      * General SPUT handler wrapper.
   2917      *
   2918      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
   2919      */
   2920     /* op vAA, field@BBBB */
   2921     EXPORT_PC
   2922     FETCH   r0, 1                       @ r0<- field ref BBBB
   2923     mov     r3, rINST, lsr #8           @ r3<- AA
   2924     GET_VREG r1, r3                     @ r1<= fp[AA]
   2925     ldr     r2, [rFP, #OFF_FP_METHOD]
   2926     mov     r3, rSELF
   2927     PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
   2928     bl      MterpSetBooleanStatic
   2929     cmp     r0, #0                      @ 0 on success, -1 on failure
   2930     bne     MterpException
   2931     ADVANCE 2                           @ Past exception point - now advance rPC
   2932     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2933     GOTO_OPCODE ip                      @ jump to next instruction
   2934 
   2935 
   2936 /* ------------------------------ */
   2937     .balign 128
   2938 .L_op_sput_byte: /* 0x6b */
   2939 /* File: arm/op_sput_byte.S */
   2940 /* File: arm/op_sput.S */
   2941     /*
   2942      * General SPUT handler wrapper.
   2943      *
   2944      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
   2945      */
   2946     /* op vAA, field@BBBB */
   2947     EXPORT_PC
   2948     FETCH   r0, 1                       @ r0<- field ref BBBB
   2949     mov     r3, rINST, lsr #8           @ r3<- AA
   2950     GET_VREG r1, r3                     @ r1<= fp[AA]
   2951     ldr     r2, [rFP, #OFF_FP_METHOD]
   2952     mov     r3, rSELF
   2953     PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
   2954     bl      MterpSetByteStatic
   2955     cmp     r0, #0                      @ 0 on success, -1 on failure
   2956     bne     MterpException
   2957     ADVANCE 2                           @ Past exception point - now advance rPC
   2958     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2959     GOTO_OPCODE ip                      @ jump to next instruction
   2960 
   2961 
   2962 /* ------------------------------ */
   2963     .balign 128
   2964 .L_op_sput_char: /* 0x6c */
   2965 /* File: arm/op_sput_char.S */
   2966 /* File: arm/op_sput.S */
   2967     /*
   2968      * General SPUT handler wrapper.
   2969      *
   2970      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
   2971      */
   2972     /* op vAA, field@BBBB */
   2973     EXPORT_PC
   2974     FETCH   r0, 1                       @ r0<- field ref BBBB
   2975     mov     r3, rINST, lsr #8           @ r3<- AA
   2976     GET_VREG r1, r3                     @ r1<= fp[AA]
   2977     ldr     r2, [rFP, #OFF_FP_METHOD]
   2978     mov     r3, rSELF
   2979     PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
   2980     bl      MterpSetCharStatic
   2981     cmp     r0, #0                      @ 0 on success, -1 on failure
   2982     bne     MterpException
   2983     ADVANCE 2                           @ Past exception point - now advance rPC
   2984     GET_INST_OPCODE ip                  @ extract opcode from rINST
   2985     GOTO_OPCODE ip                      @ jump to next instruction
   2986 
   2987 
   2988 /* ------------------------------ */
   2989     .balign 128
   2990 .L_op_sput_short: /* 0x6d */
   2991 /* File: arm/op_sput_short.S */
   2992 /* File: arm/op_sput.S */
   2993     /*
   2994      * General SPUT handler wrapper.
   2995      *
   2996      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
   2997      */
   2998     /* op vAA, field@BBBB */
   2999     EXPORT_PC
   3000     FETCH   r0, 1                       @ r0<- field ref BBBB
   3001     mov     r3, rINST, lsr #8           @ r3<- AA
   3002     GET_VREG r1, r3                     @ r1<= fp[AA]
   3003     ldr     r2, [rFP, #OFF_FP_METHOD]
   3004     mov     r3, rSELF
   3005     PREFETCH_INST 2                     @ Get next inst, but don't advance rPC
   3006     bl      MterpSetShortStatic
   3007     cmp     r0, #0                      @ 0 on success, -1 on failure
   3008     bne     MterpException
   3009     ADVANCE 2                           @ Past exception point - now advance rPC
   3010     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3011     GOTO_OPCODE ip                      @ jump to next instruction
   3012 
   3013 
   3014 /* ------------------------------ */
   3015     .balign 128
   3016 .L_op_invoke_virtual: /* 0x6e */
   3017 /* File: arm/op_invoke_virtual.S */
   3018 /* File: arm/invoke.S */
   3019     /*
   3020      * Generic invoke handler wrapper.
   3021      */
   3022     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3023     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3024     .extern MterpInvokeVirtual
   3025     EXPORT_PC
   3026     mov     r0, rSELF
   3027     add     r1, rFP, #OFF_FP_SHADOWFRAME
   3028     mov     r2, rPC
   3029     mov     r3, rINST
   3030     bl      MterpInvokeVirtual
   3031     cmp     r0, #0
   3032     beq     MterpException
   3033     FETCH_ADVANCE_INST 3
   3034     bl      MterpShouldSwitchInterpreters
   3035     cmp     r0, #0
   3036     bne     MterpFallback
   3037     GET_INST_OPCODE ip
   3038     GOTO_OPCODE ip
   3039 
   3040 
   3041     /*
   3042      * Handle a virtual method call.
   3043      *
   3044      * for: invoke-virtual, invoke-virtual/range
   3045      */
   3046     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3047     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3048 
   3049 /* ------------------------------ */
   3050     .balign 128
   3051 .L_op_invoke_super: /* 0x6f */
   3052 /* File: arm/op_invoke_super.S */
   3053 /* File: arm/invoke.S */
   3054     /*
   3055      * Generic invoke handler wrapper.
   3056      */
   3057     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3058     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3059     .extern MterpInvokeSuper
   3060     EXPORT_PC
   3061     mov     r0, rSELF
   3062     add     r1, rFP, #OFF_FP_SHADOWFRAME
   3063     mov     r2, rPC
   3064     mov     r3, rINST
   3065     bl      MterpInvokeSuper
   3066     cmp     r0, #0
   3067     beq     MterpException
   3068     FETCH_ADVANCE_INST 3
   3069     bl      MterpShouldSwitchInterpreters
   3070     cmp     r0, #0
   3071     bne     MterpFallback
   3072     GET_INST_OPCODE ip
   3073     GOTO_OPCODE ip
   3074 
   3075 
   3076     /*
   3077      * Handle a "super" method call.
   3078      *
   3079      * for: invoke-super, invoke-super/range
   3080      */
   3081     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3082     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3083 
   3084 /* ------------------------------ */
   3085     .balign 128
   3086 .L_op_invoke_direct: /* 0x70 */
   3087 /* File: arm/op_invoke_direct.S */
   3088 /* File: arm/invoke.S */
   3089     /*
   3090      * Generic invoke handler wrapper.
   3091      */
   3092     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3093     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3094     .extern MterpInvokeDirect
   3095     EXPORT_PC
   3096     mov     r0, rSELF
   3097     add     r1, rFP, #OFF_FP_SHADOWFRAME
   3098     mov     r2, rPC
   3099     mov     r3, rINST
   3100     bl      MterpInvokeDirect
   3101     cmp     r0, #0
   3102     beq     MterpException
   3103     FETCH_ADVANCE_INST 3
   3104     bl      MterpShouldSwitchInterpreters
   3105     cmp     r0, #0
   3106     bne     MterpFallback
   3107     GET_INST_OPCODE ip
   3108     GOTO_OPCODE ip
   3109 
   3110 
   3111 
   3112 /* ------------------------------ */
   3113     .balign 128
   3114 .L_op_invoke_static: /* 0x71 */
   3115 /* File: arm/op_invoke_static.S */
   3116 /* File: arm/invoke.S */
   3117     /*
   3118      * Generic invoke handler wrapper.
   3119      */
   3120     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3121     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3122     .extern MterpInvokeStatic
   3123     EXPORT_PC
   3124     mov     r0, rSELF
   3125     add     r1, rFP, #OFF_FP_SHADOWFRAME
   3126     mov     r2, rPC
   3127     mov     r3, rINST
   3128     bl      MterpInvokeStatic
   3129     cmp     r0, #0
   3130     beq     MterpException
   3131     FETCH_ADVANCE_INST 3
   3132     bl      MterpShouldSwitchInterpreters
   3133     cmp     r0, #0
   3134     bne     MterpFallback
   3135     GET_INST_OPCODE ip
   3136     GOTO_OPCODE ip
   3137 
   3138 
   3139 
   3140 
   3141 /* ------------------------------ */
   3142     .balign 128
   3143 .L_op_invoke_interface: /* 0x72 */
   3144 /* File: arm/op_invoke_interface.S */
   3145 /* File: arm/invoke.S */
   3146     /*
   3147      * Generic invoke handler wrapper.
   3148      */
   3149     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3150     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3151     .extern MterpInvokeInterface
   3152     EXPORT_PC
   3153     mov     r0, rSELF
   3154     add     r1, rFP, #OFF_FP_SHADOWFRAME
   3155     mov     r2, rPC
   3156     mov     r3, rINST
   3157     bl      MterpInvokeInterface
   3158     cmp     r0, #0
   3159     beq     MterpException
   3160     FETCH_ADVANCE_INST 3
   3161     bl      MterpShouldSwitchInterpreters
   3162     cmp     r0, #0
   3163     bne     MterpFallback
   3164     GET_INST_OPCODE ip
   3165     GOTO_OPCODE ip
   3166 
   3167 
   3168     /*
   3169      * Handle an interface method call.
   3170      *
   3171      * for: invoke-interface, invoke-interface/range
   3172      */
   3173     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3174     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3175 
   3176 /* ------------------------------ */
   3177     .balign 128
   3178 .L_op_return_void_no_barrier: /* 0x73 */
   3179 /* File: arm/op_return_void_no_barrier.S */
   3180     ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
   3181     mov     r0, rSELF
   3182     ands    lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
   3183     blne    MterpSuspendCheck                       @ (self)
   3184     mov    r0, #0
   3185     mov    r1, #0
   3186     b      MterpReturn
   3187 
   3188 /* ------------------------------ */
   3189     .balign 128
   3190 .L_op_invoke_virtual_range: /* 0x74 */
   3191 /* File: arm/op_invoke_virtual_range.S */
   3192 /* File: arm/invoke.S */
   3193     /*
   3194      * Generic invoke handler wrapper.
   3195      */
   3196     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3197     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3198     .extern MterpInvokeVirtualRange
   3199     EXPORT_PC
   3200     mov     r0, rSELF
   3201     add     r1, rFP, #OFF_FP_SHADOWFRAME
   3202     mov     r2, rPC
   3203     mov     r3, rINST
   3204     bl      MterpInvokeVirtualRange
   3205     cmp     r0, #0
   3206     beq     MterpException
   3207     FETCH_ADVANCE_INST 3
   3208     bl      MterpShouldSwitchInterpreters
   3209     cmp     r0, #0
   3210     bne     MterpFallback
   3211     GET_INST_OPCODE ip
   3212     GOTO_OPCODE ip
   3213 
   3214 
   3215 
   3216 /* ------------------------------ */
   3217     .balign 128
   3218 .L_op_invoke_super_range: /* 0x75 */
   3219 /* File: arm/op_invoke_super_range.S */
   3220 /* File: arm/invoke.S */
   3221     /*
   3222      * Generic invoke handler wrapper.
   3223      */
   3224     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3225     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3226     .extern MterpInvokeSuperRange
   3227     EXPORT_PC
   3228     mov     r0, rSELF
   3229     add     r1, rFP, #OFF_FP_SHADOWFRAME
   3230     mov     r2, rPC
   3231     mov     r3, rINST
   3232     bl      MterpInvokeSuperRange
   3233     cmp     r0, #0
   3234     beq     MterpException
   3235     FETCH_ADVANCE_INST 3
   3236     bl      MterpShouldSwitchInterpreters
   3237     cmp     r0, #0
   3238     bne     MterpFallback
   3239     GET_INST_OPCODE ip
   3240     GOTO_OPCODE ip
   3241 
   3242 
   3243 
   3244 /* ------------------------------ */
   3245     .balign 128
   3246 .L_op_invoke_direct_range: /* 0x76 */
   3247 /* File: arm/op_invoke_direct_range.S */
   3248 /* File: arm/invoke.S */
   3249     /*
   3250      * Generic invoke handler wrapper.
   3251      */
   3252     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3253     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3254     .extern MterpInvokeDirectRange
   3255     EXPORT_PC
   3256     mov     r0, rSELF
   3257     add     r1, rFP, #OFF_FP_SHADOWFRAME
   3258     mov     r2, rPC
   3259     mov     r3, rINST
   3260     bl      MterpInvokeDirectRange
   3261     cmp     r0, #0
   3262     beq     MterpException
   3263     FETCH_ADVANCE_INST 3
   3264     bl      MterpShouldSwitchInterpreters
   3265     cmp     r0, #0
   3266     bne     MterpFallback
   3267     GET_INST_OPCODE ip
   3268     GOTO_OPCODE ip
   3269 
   3270 
   3271 
   3272 /* ------------------------------ */
   3273     .balign 128
   3274 .L_op_invoke_static_range: /* 0x77 */
   3275 /* File: arm/op_invoke_static_range.S */
   3276 /* File: arm/invoke.S */
   3277     /*
   3278      * Generic invoke handler wrapper.
   3279      */
   3280     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3281     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3282     .extern MterpInvokeStaticRange
   3283     EXPORT_PC
   3284     mov     r0, rSELF
   3285     add     r1, rFP, #OFF_FP_SHADOWFRAME
   3286     mov     r2, rPC
   3287     mov     r3, rINST
   3288     bl      MterpInvokeStaticRange
   3289     cmp     r0, #0
   3290     beq     MterpException
   3291     FETCH_ADVANCE_INST 3
   3292     bl      MterpShouldSwitchInterpreters
   3293     cmp     r0, #0
   3294     bne     MterpFallback
   3295     GET_INST_OPCODE ip
   3296     GOTO_OPCODE ip
   3297 
   3298 
   3299 
   3300 /* ------------------------------ */
   3301     .balign 128
   3302 .L_op_invoke_interface_range: /* 0x78 */
   3303 /* File: arm/op_invoke_interface_range.S */
   3304 /* File: arm/invoke.S */
   3305     /*
   3306      * Generic invoke handler wrapper.
   3307      */
   3308     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3309     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3310     .extern MterpInvokeInterfaceRange
   3311     EXPORT_PC
   3312     mov     r0, rSELF
   3313     add     r1, rFP, #OFF_FP_SHADOWFRAME
   3314     mov     r2, rPC
   3315     mov     r3, rINST
   3316     bl      MterpInvokeInterfaceRange
   3317     cmp     r0, #0
   3318     beq     MterpException
   3319     FETCH_ADVANCE_INST 3
   3320     bl      MterpShouldSwitchInterpreters
   3321     cmp     r0, #0
   3322     bne     MterpFallback
   3323     GET_INST_OPCODE ip
   3324     GOTO_OPCODE ip
   3325 
   3326 
   3327 
   3328 /* ------------------------------ */
   3329     .balign 128
   3330 .L_op_unused_79: /* 0x79 */
   3331 /* File: arm/op_unused_79.S */
   3332 /* File: arm/unused.S */
   3333 /*
   3334  * Bail to reference interpreter to throw.
   3335  */
   3336   b MterpFallback
   3337 
   3338 
   3339 /* ------------------------------ */
   3340     .balign 128
   3341 .L_op_unused_7a: /* 0x7a */
   3342 /* File: arm/op_unused_7a.S */
   3343 /* File: arm/unused.S */
   3344 /*
   3345  * Bail to reference interpreter to throw.
   3346  */
   3347   b MterpFallback
   3348 
   3349 
   3350 /* ------------------------------ */
   3351     .balign 128
   3352 .L_op_neg_int: /* 0x7b */
   3353 /* File: arm/op_neg_int.S */
   3354 /* File: arm/unop.S */
   3355     /*
   3356      * Generic 32-bit unary operation.  Provide an "instr" line that
   3357      * specifies an instruction that performs "result = op r0".
   3358      * This could be an ARM instruction or a function call.
   3359      *
   3360      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   3361      *      int-to-byte, int-to-char, int-to-short
   3362      */
   3363     /* unop vA, vB */
   3364     mov     r3, rINST, lsr #12          @ r3<- B
   3365     ubfx    r9, rINST, #8, #4           @ r9<- A
   3366     GET_VREG r0, r3                     @ r0<- vB
   3367                                @ optional op; may set condition codes
   3368     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3369     rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
   3370     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3371     SET_VREG r0, r9                     @ vAA<- r0
   3372     GOTO_OPCODE ip                      @ jump to next instruction
   3373     /* 8-9 instructions */
   3374 
   3375 
   3376 /* ------------------------------ */
   3377     .balign 128
   3378 .L_op_not_int: /* 0x7c */
   3379 /* File: arm/op_not_int.S */
   3380 /* File: arm/unop.S */
   3381     /*
   3382      * Generic 32-bit unary operation.  Provide an "instr" line that
   3383      * specifies an instruction that performs "result = op r0".
   3384      * This could be an ARM instruction or a function call.
   3385      *
   3386      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   3387      *      int-to-byte, int-to-char, int-to-short
   3388      */
   3389     /* unop vA, vB */
   3390     mov     r3, rINST, lsr #12          @ r3<- B
   3391     ubfx    r9, rINST, #8, #4           @ r9<- A
   3392     GET_VREG r0, r3                     @ r0<- vB
   3393                                @ optional op; may set condition codes
   3394     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3395     mvn     r0, r0                              @ r0<- op, r0-r3 changed
   3396     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3397     SET_VREG r0, r9                     @ vAA<- r0
   3398     GOTO_OPCODE ip                      @ jump to next instruction
   3399     /* 8-9 instructions */
   3400 
   3401 
   3402 /* ------------------------------ */
   3403     .balign 128
   3404 .L_op_neg_long: /* 0x7d */
   3405 /* File: arm/op_neg_long.S */
   3406 /* File: arm/unopWide.S */
   3407     /*
   3408      * Generic 64-bit unary operation.  Provide an "instr" line that
   3409      * specifies an instruction that performs "result = op r0/r1".
   3410      * This could be an ARM instruction or a function call.
   3411      *
   3412      * For: neg-long, not-long, neg-double, long-to-double, double-to-long
   3413      */
   3414     /* unop vA, vB */
   3415     mov     r3, rINST, lsr #12          @ r3<- B
   3416     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   3417     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
   3418     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   3419     ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
   3420     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   3421     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3422     rsbs    r0, r0, #0                           @ optional op; may set condition codes
   3423     rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
   3424     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3425     stmia   r9, {r0-r1}                 @ vAA<- r0/r1
   3426     GOTO_OPCODE ip                      @ jump to next instruction
   3427     /* 10-11 instructions */
   3428 
   3429 
   3430 /* ------------------------------ */
   3431     .balign 128
   3432 .L_op_not_long: /* 0x7e */
   3433 /* File: arm/op_not_long.S */
   3434 /* File: arm/unopWide.S */
   3435     /*
   3436      * Generic 64-bit unary operation.  Provide an "instr" line that
   3437      * specifies an instruction that performs "result = op r0/r1".
   3438      * This could be an ARM instruction or a function call.
   3439      *
   3440      * For: neg-long, not-long, neg-double, long-to-double, double-to-long
   3441      */
   3442     /* unop vA, vB */
   3443     mov     r3, rINST, lsr #12          @ r3<- B
   3444     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   3445     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
   3446     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   3447     ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
   3448     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   3449     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3450     mvn     r0, r0                           @ optional op; may set condition codes
   3451     mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
   3452     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3453     stmia   r9, {r0-r1}                 @ vAA<- r0/r1
   3454     GOTO_OPCODE ip                      @ jump to next instruction
   3455     /* 10-11 instructions */
   3456 
   3457 
   3458 /* ------------------------------ */
   3459     .balign 128
   3460 .L_op_neg_float: /* 0x7f */
   3461 /* File: arm/op_neg_float.S */
   3462 /* File: arm/unop.S */
   3463     /*
   3464      * Generic 32-bit unary operation.  Provide an "instr" line that
   3465      * specifies an instruction that performs "result = op r0".
   3466      * This could be an ARM instruction or a function call.
   3467      *
   3468      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   3469      *      int-to-byte, int-to-char, int-to-short
   3470      */
   3471     /* unop vA, vB */
   3472     mov     r3, rINST, lsr #12          @ r3<- B
   3473     ubfx    r9, rINST, #8, #4           @ r9<- A
   3474     GET_VREG r0, r3                     @ r0<- vB
   3475                                @ optional op; may set condition codes
   3476     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3477     add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
   3478     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3479     SET_VREG r0, r9                     @ vAA<- r0
   3480     GOTO_OPCODE ip                      @ jump to next instruction
   3481     /* 8-9 instructions */
   3482 
   3483 
   3484 /* ------------------------------ */
   3485     .balign 128
   3486 .L_op_neg_double: /* 0x80 */
   3487 /* File: arm/op_neg_double.S */
   3488 /* File: arm/unopWide.S */
   3489     /*
   3490      * Generic 64-bit unary operation.  Provide an "instr" line that
   3491      * specifies an instruction that performs "result = op r0/r1".
   3492      * This could be an ARM instruction or a function call.
   3493      *
   3494      * For: neg-long, not-long, neg-double, long-to-double, double-to-long
   3495      */
   3496     /* unop vA, vB */
   3497     mov     r3, rINST, lsr #12          @ r3<- B
   3498     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   3499     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
   3500     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   3501     ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
   3502     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   3503     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3504                                @ optional op; may set condition codes
   3505     add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
   3506     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3507     stmia   r9, {r0-r1}                 @ vAA<- r0/r1
   3508     GOTO_OPCODE ip                      @ jump to next instruction
   3509     /* 10-11 instructions */
   3510 
   3511 
   3512 /* ------------------------------ */
   3513     .balign 128
   3514 .L_op_int_to_long: /* 0x81 */
   3515 /* File: arm/op_int_to_long.S */
   3516 /* File: arm/unopWider.S */
   3517     /*
   3518      * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
   3519      * that specifies an instruction that performs "result = op r0", where
   3520      * "result" is a 64-bit quantity in r0/r1.
   3521      *
   3522      * For: int-to-long, int-to-double, float-to-long, float-to-double
   3523      */
   3524     /* unop vA, vB */
   3525     mov     r3, rINST, lsr #12          @ r3<- B
   3526     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   3527     GET_VREG r0, r3                     @ r0<- vB
   3528     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   3529                                @ optional op; may set condition codes
   3530     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   3531     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3532     mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
   3533     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3534     stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
   3535     GOTO_OPCODE ip                      @ jump to next instruction
   3536     /* 9-10 instructions */
   3537 
   3538 
   3539 /* ------------------------------ */
   3540     .balign 128
   3541 .L_op_int_to_float: /* 0x82 */
   3542 /* File: arm/op_int_to_float.S */
   3543 /* File: arm/funop.S */
   3544     /*
   3545      * Generic 32-bit unary floating-point operation.  Provide an "instr"
   3546      * line that specifies an instruction that performs "s1 = op s0".
   3547      *
   3548      * for: int-to-float, float-to-int
   3549      */
   3550     /* unop vA, vB */
   3551     mov     r3, rINST, lsr #12          @ r3<- B
   3552     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   3553     flds    s0, [r3]                    @ s0<- vB
   3554     ubfx    r9, rINST, #8, #4           @ r9<- A
   3555     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3556     fsitos  s1, s0                              @ s1<- op
   3557     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3558     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   3559     fsts    s1, [r9]                    @ vA<- s1
   3560     GOTO_OPCODE ip                      @ jump to next instruction
   3561 
   3562 
   3563 /* ------------------------------ */
   3564     .balign 128
   3565 .L_op_int_to_double: /* 0x83 */
   3566 /* File: arm/op_int_to_double.S */
   3567 /* File: arm/funopWider.S */
   3568     /*
   3569      * Generic 32bit-to-64bit floating point unary operation.  Provide an
   3570      * "instr" line that specifies an instruction that performs "d0 = op s0".
   3571      *
   3572      * For: int-to-double, float-to-double
   3573      */
   3574     /* unop vA, vB */
   3575     mov     r3, rINST, lsr #12          @ r3<- B
   3576     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   3577     flds    s0, [r3]                    @ s0<- vB
   3578     ubfx    r9, rINST, #8, #4           @ r9<- A
   3579     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3580     fsitod  d0, s0                              @ d0<- op
   3581     CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
   3582     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3583     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   3584     fstd    d0, [r9]                    @ vA<- d0
   3585     GOTO_OPCODE ip                      @ jump to next instruction
   3586 
   3587 
   3588 /* ------------------------------ */
   3589     .balign 128
   3590 .L_op_long_to_int: /* 0x84 */
   3591 /* File: arm/op_long_to_int.S */
   3592 /* we ignore the high word, making this equivalent to a 32-bit reg move */
   3593 /* File: arm/op_move.S */
   3594     /* for move, move-object, long-to-int */
   3595     /* op vA, vB */
   3596     mov     r1, rINST, lsr #12          @ r1<- B from 15:12
   3597     ubfx    r0, rINST, #8, #4           @ r0<- A from 11:8
   3598     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3599     GET_VREG r2, r1                     @ r2<- fp[B]
   3600     GET_INST_OPCODE ip                  @ ip<- opcode from rINST
   3601     .if 0
   3602     SET_VREG_OBJECT r2, r0              @ fp[A]<- r2
   3603     .else
   3604     SET_VREG r2, r0                     @ fp[A]<- r2
   3605     .endif
   3606     GOTO_OPCODE ip                      @ execute next instruction
   3607 
   3608 
   3609 /* ------------------------------ */
   3610     .balign 128
   3611 .L_op_long_to_float: /* 0x85 */
   3612 /* File: arm/op_long_to_float.S */
   3613 /* File: arm/unopNarrower.S */
   3614     /*
   3615      * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
   3616      * that specifies an instruction that performs "result = op r0/r1", where
   3617      * "result" is a 32-bit quantity in r0.
   3618      *
   3619      * For: long-to-float, double-to-int, double-to-float
   3620      *
   3621      * (This would work for long-to-int, but that instruction is actually
   3622      * an exact match for op_move.)
   3623      */
   3624     /* unop vA, vB */
   3625     mov     r3, rINST, lsr #12          @ r3<- B
   3626     ubfx    r9, rINST, #8, #4           @ r9<- A
   3627     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
   3628     ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
   3629     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3630                                @ optional op; may set condition codes
   3631     bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
   3632     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3633     SET_VREG r0, r9                     @ vA<- r0
   3634     GOTO_OPCODE ip                      @ jump to next instruction
   3635     /* 9-10 instructions */
   3636 
   3637 
   3638 /* ------------------------------ */
   3639     .balign 128
   3640 .L_op_long_to_double: /* 0x86 */
   3641 /* File: arm/op_long_to_double.S */
   3642     /*
   3643      * Specialised 64-bit floating point operation.
   3644      *
   3645      * Note: The result will be returned in d2.
   3646      *
   3647      * For: long-to-double
   3648      */
   3649     mov     r3, rINST, lsr #12          @ r3<- B
   3650     ubfx    r9, rINST, #8, #4           @ r9<- A
   3651     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
   3652     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[A]
   3653     vldr    d0, [r3]                    @ d0<- vAA
   3654     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3655 
   3656     vcvt.f64.s32    d1, s1              @ d1<- (double)(vAAh)
   3657     vcvt.f64.u32    d2, s0              @ d2<- (double)(vAAl)
   3658     vldr            d3, constvalop_long_to_double
   3659     vmla.f64        d2, d1, d3          @ d2<- vAAh*2^32 + vAAl
   3660 
   3661     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3662     vstr.64 d2, [r9]                    @ vAA<- d2
   3663     GOTO_OPCODE ip                      @ jump to next instruction
   3664 
   3665     /* literal pool helper */
   3666 constvalop_long_to_double:
   3667     .8byte          0x41f0000000000000
   3668 
   3669 /* ------------------------------ */
   3670     .balign 128
   3671 .L_op_float_to_int: /* 0x87 */
   3672 /* File: arm/op_float_to_int.S */
   3673 /* File: arm/funop.S */
   3674     /*
   3675      * Generic 32-bit unary floating-point operation.  Provide an "instr"
   3676      * line that specifies an instruction that performs "s1 = op s0".
   3677      *
   3678      * for: int-to-float, float-to-int
   3679      */
   3680     /* unop vA, vB */
   3681     mov     r3, rINST, lsr #12          @ r3<- B
   3682     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   3683     flds    s0, [r3]                    @ s0<- vB
   3684     ubfx    r9, rINST, #8, #4           @ r9<- A
   3685     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3686     ftosizs s1, s0                              @ s1<- op
   3687     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3688     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   3689     fsts    s1, [r9]                    @ vA<- s1
   3690     GOTO_OPCODE ip                      @ jump to next instruction
   3691 
   3692 
   3693 /* ------------------------------ */
   3694     .balign 128
   3695 .L_op_float_to_long: /* 0x88 */
   3696 /* File: arm/op_float_to_long.S */
   3697 /* File: arm/unopWider.S */
   3698     /*
   3699      * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
   3700      * that specifies an instruction that performs "result = op r0", where
   3701      * "result" is a 64-bit quantity in r0/r1.
   3702      *
   3703      * For: int-to-long, int-to-double, float-to-long, float-to-double
   3704      */
   3705     /* unop vA, vB */
   3706     mov     r3, rINST, lsr #12          @ r3<- B
   3707     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   3708     GET_VREG r0, r3                     @ r0<- vB
   3709     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   3710                                @ optional op; may set condition codes
   3711     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   3712     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3713     bl      f2l_doconv                              @ r0<- op, r0-r3 changed
   3714     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3715     stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
   3716     GOTO_OPCODE ip                      @ jump to next instruction
   3717     /* 9-10 instructions */
   3718 
   3719 
   3720 
   3721 /* ------------------------------ */
   3722     .balign 128
   3723 .L_op_float_to_double: /* 0x89 */
   3724 /* File: arm/op_float_to_double.S */
   3725 /* File: arm/funopWider.S */
   3726     /*
   3727      * Generic 32bit-to-64bit floating point unary operation.  Provide an
   3728      * "instr" line that specifies an instruction that performs "d0 = op s0".
   3729      *
   3730      * For: int-to-double, float-to-double
   3731      */
   3732     /* unop vA, vB */
   3733     mov     r3, rINST, lsr #12          @ r3<- B
   3734     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   3735     flds    s0, [r3]                    @ s0<- vB
   3736     ubfx    r9, rINST, #8, #4           @ r9<- A
   3737     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3738     vcvt.f64.f32  d0, s0                              @ d0<- op
   3739     CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
   3740     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3741     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   3742     fstd    d0, [r9]                    @ vA<- d0
   3743     GOTO_OPCODE ip                      @ jump to next instruction
   3744 
   3745 
   3746 /* ------------------------------ */
   3747     .balign 128
   3748 .L_op_double_to_int: /* 0x8a */
   3749 /* File: arm/op_double_to_int.S */
   3750 /* File: arm/funopNarrower.S */
   3751     /*
   3752      * Generic 64bit-to-32bit unary floating point operation.  Provide an
   3753      * "instr" line that specifies an instruction that performs "s0 = op d0".
   3754      *
   3755      * For: double-to-int, double-to-float
   3756      */
   3757     /* unop vA, vB */
   3758     mov     r3, rINST, lsr #12          @ r3<- B
   3759     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   3760     fldd    d0, [r3]                    @ d0<- vB
   3761     ubfx    r9, rINST, #8, #4           @ r9<- A
   3762     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3763     ftosizd  s0, d0                              @ s0<- op
   3764     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3765     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   3766     fsts    s0, [r9]                    @ vA<- s0
   3767     GOTO_OPCODE ip                      @ jump to next instruction
   3768 
   3769 
   3770 /* ------------------------------ */
   3771     .balign 128
   3772 .L_op_double_to_long: /* 0x8b */
   3773 /* File: arm/op_double_to_long.S */
   3774 /* File: arm/unopWide.S */
   3775     /*
   3776      * Generic 64-bit unary operation.  Provide an "instr" line that
   3777      * specifies an instruction that performs "result = op r0/r1".
   3778      * This could be an ARM instruction or a function call.
   3779      *
   3780      * For: neg-long, not-long, neg-double, long-to-double, double-to-long
   3781      */
   3782     /* unop vA, vB */
   3783     mov     r3, rINST, lsr #12          @ r3<- B
   3784     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   3785     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[B]
   3786     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   3787     ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
   3788     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   3789     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3790                                @ optional op; may set condition codes
   3791     bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
   3792     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3793     stmia   r9, {r0-r1}                 @ vAA<- r0/r1
   3794     GOTO_OPCODE ip                      @ jump to next instruction
   3795     /* 10-11 instructions */
   3796 
   3797 
   3798 
   3799 /* ------------------------------ */
   3800     .balign 128
   3801 .L_op_double_to_float: /* 0x8c */
   3802 /* File: arm/op_double_to_float.S */
   3803 /* File: arm/funopNarrower.S */
   3804     /*
   3805      * Generic 64bit-to-32bit unary floating point operation.  Provide an
   3806      * "instr" line that specifies an instruction that performs "s0 = op d0".
   3807      *
   3808      * For: double-to-int, double-to-float
   3809      */
   3810     /* unop vA, vB */
   3811     mov     r3, rINST, lsr #12          @ r3<- B
   3812     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   3813     fldd    d0, [r3]                    @ d0<- vB
   3814     ubfx    r9, rINST, #8, #4           @ r9<- A
   3815     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3816     vcvt.f32.f64  s0, d0                              @ s0<- op
   3817     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3818     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   3819     fsts    s0, [r9]                    @ vA<- s0
   3820     GOTO_OPCODE ip                      @ jump to next instruction
   3821 
   3822 
   3823 /* ------------------------------ */
   3824     .balign 128
   3825 .L_op_int_to_byte: /* 0x8d */
   3826 /* File: arm/op_int_to_byte.S */
   3827 /* File: arm/unop.S */
   3828     /*
   3829      * Generic 32-bit unary operation.  Provide an "instr" line that
   3830      * specifies an instruction that performs "result = op r0".
   3831      * This could be an ARM instruction or a function call.
   3832      *
   3833      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   3834      *      int-to-byte, int-to-char, int-to-short
   3835      */
   3836     /* unop vA, vB */
   3837     mov     r3, rINST, lsr #12          @ r3<- B
   3838     ubfx    r9, rINST, #8, #4           @ r9<- A
   3839     GET_VREG r0, r3                     @ r0<- vB
   3840                                @ optional op; may set condition codes
   3841     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3842     sxtb    r0, r0                              @ r0<- op, r0-r3 changed
   3843     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3844     SET_VREG r0, r9                     @ vAA<- r0
   3845     GOTO_OPCODE ip                      @ jump to next instruction
   3846     /* 8-9 instructions */
   3847 
   3848 
   3849 /* ------------------------------ */
   3850     .balign 128
   3851 .L_op_int_to_char: /* 0x8e */
   3852 /* File: arm/op_int_to_char.S */
   3853 /* File: arm/unop.S */
   3854     /*
   3855      * Generic 32-bit unary operation.  Provide an "instr" line that
   3856      * specifies an instruction that performs "result = op r0".
   3857      * This could be an ARM instruction or a function call.
   3858      *
   3859      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   3860      *      int-to-byte, int-to-char, int-to-short
   3861      */
   3862     /* unop vA, vB */
   3863     mov     r3, rINST, lsr #12          @ r3<- B
   3864     ubfx    r9, rINST, #8, #4           @ r9<- A
   3865     GET_VREG r0, r3                     @ r0<- vB
   3866                                @ optional op; may set condition codes
   3867     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3868     uxth    r0, r0                              @ r0<- op, r0-r3 changed
   3869     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3870     SET_VREG r0, r9                     @ vAA<- r0
   3871     GOTO_OPCODE ip                      @ jump to next instruction
   3872     /* 8-9 instructions */
   3873 
   3874 
   3875 /* ------------------------------ */
   3876     .balign 128
   3877 .L_op_int_to_short: /* 0x8f */
   3878 /* File: arm/op_int_to_short.S */
   3879 /* File: arm/unop.S */
   3880     /*
   3881      * Generic 32-bit unary operation.  Provide an "instr" line that
   3882      * specifies an instruction that performs "result = op r0".
   3883      * This could be an ARM instruction or a function call.
   3884      *
   3885      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   3886      *      int-to-byte, int-to-char, int-to-short
   3887      */
   3888     /* unop vA, vB */
   3889     mov     r3, rINST, lsr #12          @ r3<- B
   3890     ubfx    r9, rINST, #8, #4           @ r9<- A
   3891     GET_VREG r0, r3                     @ r0<- vB
   3892                                @ optional op; may set condition codes
   3893     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   3894     sxth    r0, r0                              @ r0<- op, r0-r3 changed
   3895     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3896     SET_VREG r0, r9                     @ vAA<- r0
   3897     GOTO_OPCODE ip                      @ jump to next instruction
   3898     /* 8-9 instructions */
   3899 
   3900 
   3901 /* ------------------------------ */
   3902     .balign 128
   3903 .L_op_add_int: /* 0x90 */
   3904 /* File: arm/op_add_int.S */
   3905 /* File: arm/binop.S */
   3906     /*
   3907      * Generic 32-bit binary operation.  Provide an "instr" line that
   3908      * specifies an instruction that performs "result = r0 op r1".
   3909      * This could be an ARM instruction or a function call.  (If the result
   3910      * comes back in a register other than r0, you can override "result".)
   3911      *
   3912      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   3913      * vCC (r1).  Useful for integer division and modulus.  Note that we
   3914      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   3915      * handles it correctly.
   3916      *
   3917      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   3918      *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
   3919      *      mul-float, div-float, rem-float
   3920      */
   3921     /* binop vAA, vBB, vCC */
   3922     FETCH r0, 1                         @ r0<- CCBB
   3923     mov     r9, rINST, lsr #8           @ r9<- AA
   3924     mov     r3, r0, lsr #8              @ r3<- CC
   3925     and     r2, r0, #255                @ r2<- BB
   3926     GET_VREG r1, r3                     @ r1<- vCC
   3927     GET_VREG r0, r2                     @ r0<- vBB
   3928     .if 0
   3929     cmp     r1, #0                      @ is second operand zero?
   3930     beq     common_errDivideByZero
   3931     .endif
   3932 
   3933     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   3934                                @ optional op; may set condition codes
   3935     add     r0, r0, r1                              @ r0<- op, r0-r3 changed
   3936     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3937     SET_VREG r0, r9                @ vAA<- r0
   3938     GOTO_OPCODE ip                      @ jump to next instruction
   3939     /* 11-14 instructions */
   3940 
   3941 
   3942 /* ------------------------------ */
   3943     .balign 128
   3944 .L_op_sub_int: /* 0x91 */
   3945 /* File: arm/op_sub_int.S */
   3946 /* File: arm/binop.S */
   3947     /*
   3948      * Generic 32-bit binary operation.  Provide an "instr" line that
   3949      * specifies an instruction that performs "result = r0 op r1".
   3950      * This could be an ARM instruction or a function call.  (If the result
   3951      * comes back in a register other than r0, you can override "result".)
   3952      *
   3953      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   3954      * vCC (r1).  Useful for integer division and modulus.  Note that we
   3955      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   3956      * handles it correctly.
   3957      *
   3958      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   3959      *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
   3960      *      mul-float, div-float, rem-float
   3961      */
   3962     /* binop vAA, vBB, vCC */
   3963     FETCH r0, 1                         @ r0<- CCBB
   3964     mov     r9, rINST, lsr #8           @ r9<- AA
   3965     mov     r3, r0, lsr #8              @ r3<- CC
   3966     and     r2, r0, #255                @ r2<- BB
   3967     GET_VREG r1, r3                     @ r1<- vCC
   3968     GET_VREG r0, r2                     @ r0<- vBB
   3969     .if 0
   3970     cmp     r1, #0                      @ is second operand zero?
   3971     beq     common_errDivideByZero
   3972     .endif
   3973 
   3974     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   3975                                @ optional op; may set condition codes
   3976     sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
   3977     GET_INST_OPCODE ip                  @ extract opcode from rINST
   3978     SET_VREG r0, r9                @ vAA<- r0
   3979     GOTO_OPCODE ip                      @ jump to next instruction
   3980     /* 11-14 instructions */
   3981 
   3982 
   3983 /* ------------------------------ */
   3984     .balign 128
   3985 .L_op_mul_int: /* 0x92 */
   3986 /* File: arm/op_mul_int.S */
   3987 /* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
   3988 /* File: arm/binop.S */
   3989     /*
   3990      * Generic 32-bit binary operation.  Provide an "instr" line that
   3991      * specifies an instruction that performs "result = r0 op r1".
   3992      * This could be an ARM instruction or a function call.  (If the result
   3993      * comes back in a register other than r0, you can override "result".)
   3994      *
   3995      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   3996      * vCC (r1).  Useful for integer division and modulus.  Note that we
   3997      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   3998      * handles it correctly.
   3999      *
   4000      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4001      *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
   4002      *      mul-float, div-float, rem-float
   4003      */
   4004     /* binop vAA, vBB, vCC */
   4005     FETCH r0, 1                         @ r0<- CCBB
   4006     mov     r9, rINST, lsr #8           @ r9<- AA
   4007     mov     r3, r0, lsr #8              @ r3<- CC
   4008     and     r2, r0, #255                @ r2<- BB
   4009     GET_VREG r1, r3                     @ r1<- vCC
   4010     GET_VREG r0, r2                     @ r0<- vBB
   4011     .if 0
   4012     cmp     r1, #0                      @ is second operand zero?
   4013     beq     common_errDivideByZero
   4014     .endif
   4015 
   4016     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4017                                @ optional op; may set condition codes
   4018     mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
   4019     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4020     SET_VREG r0, r9                @ vAA<- r0
   4021     GOTO_OPCODE ip                      @ jump to next instruction
   4022     /* 11-14 instructions */
   4023 
   4024 
   4025 /* ------------------------------ */
   4026     .balign 128
   4027 .L_op_div_int: /* 0x93 */
   4028 /* File: arm/op_div_int.S */
   4029     /*
   4030      * Specialized 32-bit binary operation
   4031      *
   4032      * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
   4033      * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
   4034      * ARMv7 CPUs that have hardware division support).
   4035      *
   4036      * div-int
   4037      *
   4038      */
   4039     FETCH r0, 1                         @ r0<- CCBB
   4040     mov     r9, rINST, lsr #8           @ r9<- AA
   4041     mov     r3, r0, lsr #8              @ r3<- CC
   4042     and     r2, r0, #255                @ r2<- BB
   4043     GET_VREG r1, r3                     @ r1<- vCC
   4044     GET_VREG r0, r2                     @ r0<- vBB
   4045     cmp     r1, #0                      @ is second operand zero?
   4046     beq     common_errDivideByZero
   4047 
   4048     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4049 #ifdef __ARM_ARCH_EXT_IDIV__
   4050     sdiv    r0, r0, r1                  @ r0<- op
   4051 #else
   4052     bl    __aeabi_idiv                  @ r0<- op, r0-r3 changed
   4053 #endif
   4054     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4055     SET_VREG r0, r9                     @ vAA<- r0
   4056     GOTO_OPCODE ip                      @ jump to next instruction
   4057     /* 11-14 instructions */
   4058 
   4059 /* ------------------------------ */
   4060     .balign 128
   4061 .L_op_rem_int: /* 0x94 */
   4062 /* File: arm/op_rem_int.S */
   4063     /*
   4064      * Specialized 32-bit binary operation
   4065      *
   4066      * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
   4067      * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
   4068      * ARMv7 CPUs that have hardware division support).
   4069      *
   4070      * NOTE: idivmod returns quotient in r0 and remainder in r1
   4071      *
   4072      * rem-int
   4073      *
   4074      */
   4075     FETCH r0, 1                         @ r0<- CCBB
   4076     mov     r9, rINST, lsr #8           @ r9<- AA
   4077     mov     r3, r0, lsr #8              @ r3<- CC
   4078     and     r2, r0, #255                @ r2<- BB
   4079     GET_VREG r1, r3                     @ r1<- vCC
   4080     GET_VREG r0, r2                     @ r0<- vBB
   4081     cmp     r1, #0                      @ is second operand zero?
   4082     beq     common_errDivideByZero
   4083 
   4084     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4085 #ifdef __ARM_ARCH_EXT_IDIV__
   4086     sdiv    r2, r0, r1
   4087     mls  r1, r1, r2, r0                 @ r1<- op, r0-r2 changed
   4088 #else
   4089     bl   __aeabi_idivmod                @ r1<- op, r0-r3 changed
   4090 #endif
   4091     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4092     SET_VREG r1, r9                     @ vAA<- r1
   4093     GOTO_OPCODE ip                      @ jump to next instruction
   4094     /* 11-14 instructions */
   4095 
   4096 /* ------------------------------ */
   4097     .balign 128
   4098 .L_op_and_int: /* 0x95 */
   4099 /* File: arm/op_and_int.S */
   4100 /* File: arm/binop.S */
   4101     /*
   4102      * Generic 32-bit binary operation.  Provide an "instr" line that
   4103      * specifies an instruction that performs "result = r0 op r1".
   4104      * This could be an ARM instruction or a function call.  (If the result
   4105      * comes back in a register other than r0, you can override "result".)
   4106      *
   4107      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4108      * vCC (r1).  Useful for integer division and modulus.  Note that we
   4109      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4110      * handles it correctly.
   4111      *
   4112      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4113      *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
   4114      *      mul-float, div-float, rem-float
   4115      */
   4116     /* binop vAA, vBB, vCC */
   4117     FETCH r0, 1                         @ r0<- CCBB
   4118     mov     r9, rINST, lsr #8           @ r9<- AA
   4119     mov     r3, r0, lsr #8              @ r3<- CC
   4120     and     r2, r0, #255                @ r2<- BB
   4121     GET_VREG r1, r3                     @ r1<- vCC
   4122     GET_VREG r0, r2                     @ r0<- vBB
   4123     .if 0
   4124     cmp     r1, #0                      @ is second operand zero?
   4125     beq     common_errDivideByZero
   4126     .endif
   4127 
   4128     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4129                                @ optional op; may set condition codes
   4130     and     r0, r0, r1                              @ r0<- op, r0-r3 changed
   4131     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4132     SET_VREG r0, r9                @ vAA<- r0
   4133     GOTO_OPCODE ip                      @ jump to next instruction
   4134     /* 11-14 instructions */
   4135 
   4136 
   4137 /* ------------------------------ */
   4138     .balign 128
   4139 .L_op_or_int: /* 0x96 */
   4140 /* File: arm/op_or_int.S */
   4141 /* File: arm/binop.S */
   4142     /*
   4143      * Generic 32-bit binary operation.  Provide an "instr" line that
   4144      * specifies an instruction that performs "result = r0 op r1".
   4145      * This could be an ARM instruction or a function call.  (If the result
   4146      * comes back in a register other than r0, you can override "result".)
   4147      *
   4148      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4149      * vCC (r1).  Useful for integer division and modulus.  Note that we
   4150      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4151      * handles it correctly.
   4152      *
   4153      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4154      *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
   4155      *      mul-float, div-float, rem-float
   4156      */
   4157     /* binop vAA, vBB, vCC */
   4158     FETCH r0, 1                         @ r0<- CCBB
   4159     mov     r9, rINST, lsr #8           @ r9<- AA
   4160     mov     r3, r0, lsr #8              @ r3<- CC
   4161     and     r2, r0, #255                @ r2<- BB
   4162     GET_VREG r1, r3                     @ r1<- vCC
   4163     GET_VREG r0, r2                     @ r0<- vBB
   4164     .if 0
   4165     cmp     r1, #0                      @ is second operand zero?
   4166     beq     common_errDivideByZero
   4167     .endif
   4168 
   4169     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4170                                @ optional op; may set condition codes
   4171     orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
   4172     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4173     SET_VREG r0, r9                @ vAA<- r0
   4174     GOTO_OPCODE ip                      @ jump to next instruction
   4175     /* 11-14 instructions */
   4176 
   4177 
   4178 /* ------------------------------ */
   4179     .balign 128
   4180 .L_op_xor_int: /* 0x97 */
   4181 /* File: arm/op_xor_int.S */
   4182 /* File: arm/binop.S */
   4183     /*
   4184      * Generic 32-bit binary operation.  Provide an "instr" line that
   4185      * specifies an instruction that performs "result = r0 op r1".
   4186      * This could be an ARM instruction or a function call.  (If the result
   4187      * comes back in a register other than r0, you can override "result".)
   4188      *
   4189      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4190      * vCC (r1).  Useful for integer division and modulus.  Note that we
   4191      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4192      * handles it correctly.
   4193      *
   4194      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4195      *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
   4196      *      mul-float, div-float, rem-float
   4197      */
   4198     /* binop vAA, vBB, vCC */
   4199     FETCH r0, 1                         @ r0<- CCBB
   4200     mov     r9, rINST, lsr #8           @ r9<- AA
   4201     mov     r3, r0, lsr #8              @ r3<- CC
   4202     and     r2, r0, #255                @ r2<- BB
   4203     GET_VREG r1, r3                     @ r1<- vCC
   4204     GET_VREG r0, r2                     @ r0<- vBB
   4205     .if 0
   4206     cmp     r1, #0                      @ is second operand zero?
   4207     beq     common_errDivideByZero
   4208     .endif
   4209 
   4210     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4211                                @ optional op; may set condition codes
   4212     eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
   4213     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4214     SET_VREG r0, r9                @ vAA<- r0
   4215     GOTO_OPCODE ip                      @ jump to next instruction
   4216     /* 11-14 instructions */
   4217 
   4218 
   4219 /* ------------------------------ */
   4220     .balign 128
   4221 .L_op_shl_int: /* 0x98 */
   4222 /* File: arm/op_shl_int.S */
   4223 /* File: arm/binop.S */
   4224     /*
   4225      * Generic 32-bit binary operation.  Provide an "instr" line that
   4226      * specifies an instruction that performs "result = r0 op r1".
   4227      * This could be an ARM instruction or a function call.  (If the result
   4228      * comes back in a register other than r0, you can override "result".)
   4229      *
   4230      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4231      * vCC (r1).  Useful for integer division and modulus.  Note that we
   4232      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4233      * handles it correctly.
   4234      *
   4235      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4236      *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
   4237      *      mul-float, div-float, rem-float
   4238      */
   4239     /* binop vAA, vBB, vCC */
   4240     FETCH r0, 1                         @ r0<- CCBB
   4241     mov     r9, rINST, lsr #8           @ r9<- AA
   4242     mov     r3, r0, lsr #8              @ r3<- CC
   4243     and     r2, r0, #255                @ r2<- BB
   4244     GET_VREG r1, r3                     @ r1<- vCC
   4245     GET_VREG r0, r2                     @ r0<- vBB
   4246     .if 0
   4247     cmp     r1, #0                      @ is second operand zero?
   4248     beq     common_errDivideByZero
   4249     .endif
   4250 
   4251     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4252     and     r1, r1, #31                           @ optional op; may set condition codes
   4253     mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
   4254     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4255     SET_VREG r0, r9                @ vAA<- r0
   4256     GOTO_OPCODE ip                      @ jump to next instruction
   4257     /* 11-14 instructions */
   4258 
   4259 
   4260 /* ------------------------------ */
   4261     .balign 128
   4262 .L_op_shr_int: /* 0x99 */
   4263 /* File: arm/op_shr_int.S */
   4264 /* File: arm/binop.S */
   4265     /*
   4266      * Generic 32-bit binary operation.  Provide an "instr" line that
   4267      * specifies an instruction that performs "result = r0 op r1".
   4268      * This could be an ARM instruction or a function call.  (If the result
   4269      * comes back in a register other than r0, you can override "result".)
   4270      *
   4271      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4272      * vCC (r1).  Useful for integer division and modulus.  Note that we
   4273      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4274      * handles it correctly.
   4275      *
   4276      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4277      *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
   4278      *      mul-float, div-float, rem-float
   4279      */
   4280     /* binop vAA, vBB, vCC */
   4281     FETCH r0, 1                         @ r0<- CCBB
   4282     mov     r9, rINST, lsr #8           @ r9<- AA
   4283     mov     r3, r0, lsr #8              @ r3<- CC
   4284     and     r2, r0, #255                @ r2<- BB
   4285     GET_VREG r1, r3                     @ r1<- vCC
   4286     GET_VREG r0, r2                     @ r0<- vBB
   4287     .if 0
   4288     cmp     r1, #0                      @ is second operand zero?
   4289     beq     common_errDivideByZero
   4290     .endif
   4291 
   4292     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4293     and     r1, r1, #31                           @ optional op; may set condition codes
   4294     mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
   4295     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4296     SET_VREG r0, r9                @ vAA<- r0
   4297     GOTO_OPCODE ip                      @ jump to next instruction
   4298     /* 11-14 instructions */
   4299 
   4300 
   4301 /* ------------------------------ */
   4302     .balign 128
   4303 .L_op_ushr_int: /* 0x9a */
   4304 /* File: arm/op_ushr_int.S */
   4305 /* File: arm/binop.S */
   4306     /*
   4307      * Generic 32-bit binary operation.  Provide an "instr" line that
   4308      * specifies an instruction that performs "result = r0 op r1".
   4309      * This could be an ARM instruction or a function call.  (If the result
   4310      * comes back in a register other than r0, you can override "result".)
   4311      *
   4312      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4313      * vCC (r1).  Useful for integer division and modulus.  Note that we
   4314      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4315      * handles it correctly.
   4316      *
   4317      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4318      *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
   4319      *      mul-float, div-float, rem-float
   4320      */
   4321     /* binop vAA, vBB, vCC */
   4322     FETCH r0, 1                         @ r0<- CCBB
   4323     mov     r9, rINST, lsr #8           @ r9<- AA
   4324     mov     r3, r0, lsr #8              @ r3<- CC
   4325     and     r2, r0, #255                @ r2<- BB
   4326     GET_VREG r1, r3                     @ r1<- vCC
   4327     GET_VREG r0, r2                     @ r0<- vBB
   4328     .if 0
   4329     cmp     r1, #0                      @ is second operand zero?
   4330     beq     common_errDivideByZero
   4331     .endif
   4332 
   4333     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4334     and     r1, r1, #31                           @ optional op; may set condition codes
   4335     mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
   4336     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4337     SET_VREG r0, r9                @ vAA<- r0
   4338     GOTO_OPCODE ip                      @ jump to next instruction
   4339     /* 11-14 instructions */
   4340 
   4341 
   4342 /* ------------------------------ */
   4343     .balign 128
   4344 .L_op_add_long: /* 0x9b */
   4345 /* File: arm/op_add_long.S */
   4346 /* File: arm/binopWide.S */
   4347     /*
   4348      * Generic 64-bit binary operation.  Provide an "instr" line that
   4349      * specifies an instruction that performs "result = r0-r1 op r2-r3".
   4350      * This could be an ARM instruction or a function call.  (If the result
   4351      * comes back in a register other than r0, you can override "result".)
   4352      *
   4353      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4354      * vCC (r1).  Useful for integer division and modulus.
   4355      *
   4356      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   4357      *      xor-long, add-double, sub-double, mul-double, div-double,
   4358      *      rem-double
   4359      *
   4360      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   4361      */
   4362     /* binop vAA, vBB, vCC */
   4363     FETCH r0, 1                         @ r0<- CCBB
   4364     mov     rINST, rINST, lsr #8        @ rINST<- AA
   4365     and     r2, r0, #255                @ r2<- BB
   4366     mov     r3, r0, lsr #8              @ r3<- CC
   4367     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
   4368     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
   4369     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
   4370     ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4371     ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
   4372     .if 0
   4373     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   4374     beq     common_errDivideByZero
   4375     .endif
   4376     CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
   4377     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4378     adds    r0, r0, r2                           @ optional op; may set condition codes
   4379     adc     r1, r1, r3                              @ result<- op, r0-r3 changed
   4380     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4381     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   4382     GOTO_OPCODE ip                      @ jump to next instruction
   4383     /* 14-17 instructions */
   4384 
   4385 
   4386 /* ------------------------------ */
   4387     .balign 128
   4388 .L_op_sub_long: /* 0x9c */
   4389 /* File: arm/op_sub_long.S */
   4390 /* File: arm/binopWide.S */
   4391     /*
   4392      * Generic 64-bit binary operation.  Provide an "instr" line that
   4393      * specifies an instruction that performs "result = r0-r1 op r2-r3".
   4394      * This could be an ARM instruction or a function call.  (If the result
   4395      * comes back in a register other than r0, you can override "result".)
   4396      *
   4397      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4398      * vCC (r1).  Useful for integer division and modulus.
   4399      *
   4400      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   4401      *      xor-long, add-double, sub-double, mul-double, div-double,
   4402      *      rem-double
   4403      *
   4404      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   4405      */
   4406     /* binop vAA, vBB, vCC */
   4407     FETCH r0, 1                         @ r0<- CCBB
   4408     mov     rINST, rINST, lsr #8        @ rINST<- AA
   4409     and     r2, r0, #255                @ r2<- BB
   4410     mov     r3, r0, lsr #8              @ r3<- CC
   4411     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
   4412     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
   4413     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
   4414     ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4415     ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
   4416     .if 0
   4417     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   4418     beq     common_errDivideByZero
   4419     .endif
   4420     CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
   4421     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4422     subs    r0, r0, r2                           @ optional op; may set condition codes
   4423     sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
   4424     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4425     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   4426     GOTO_OPCODE ip                      @ jump to next instruction
   4427     /* 14-17 instructions */
   4428 
   4429 
   4430 /* ------------------------------ */
   4431     .balign 128
   4432 .L_op_mul_long: /* 0x9d */
   4433 /* File: arm/op_mul_long.S */
   4434     /*
   4435      * Signed 64-bit integer multiply.
   4436      *
   4437      * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
   4438      *        WX
   4439      *      x YZ
   4440      *  --------
   4441      *     ZW ZX
   4442      *  YW YX
   4443      *
   4444      * The low word of the result holds ZX, the high word holds
   4445      * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
   4446      * it doesn't fit in the low 64 bits.
   4447      *
   4448      * Unlike most ARM math operations, multiply instructions have
   4449      * restrictions on using the same register more than once (Rd and Rm
   4450      * cannot be the same).
   4451      */
   4452     /* mul-long vAA, vBB, vCC */
   4453     FETCH r0, 1                         @ r0<- CCBB
   4454     and     r2, r0, #255                @ r2<- BB
   4455     mov     r3, r0, lsr #8              @ r3<- CC
   4456     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
   4457     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
   4458     ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4459     ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
   4460     mul     ip, r2, r1                  @ ip<- ZxW
   4461     umull   r1, lr, r2, r0              @ r1/lr <- ZxX
   4462     mla     r2, r0, r3, ip              @ r2<- YxX + (ZxW)
   4463     mov     r0, rINST, lsr #8           @ r0<- AA
   4464     add     r2, r2, lr                  @ r2<- lr + low(ZxW + (YxX))
   4465     VREG_INDEX_TO_ADDR r0, r0           @ r0<- &fp[AA]
   4466     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4467     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4468     stmia   r0, {r1-r2 }                @ vAA/vAA+1<- r1/r2
   4469     GOTO_OPCODE ip                      @ jump to next instruction
   4470 
   4471 /* ------------------------------ */
   4472     .balign 128
   4473 .L_op_div_long: /* 0x9e */
   4474 /* File: arm/op_div_long.S */
   4475 /* File: arm/binopWide.S */
   4476     /*
   4477      * Generic 64-bit binary operation.  Provide an "instr" line that
   4478      * specifies an instruction that performs "result = r0-r1 op r2-r3".
   4479      * This could be an ARM instruction or a function call.  (If the result
   4480      * comes back in a register other than r0, you can override "result".)
   4481      *
   4482      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4483      * vCC (r1).  Useful for integer division and modulus.
   4484      *
   4485      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   4486      *      xor-long, add-double, sub-double, mul-double, div-double,
   4487      *      rem-double
   4488      *
   4489      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   4490      */
   4491     /* binop vAA, vBB, vCC */
   4492     FETCH r0, 1                         @ r0<- CCBB
   4493     mov     rINST, rINST, lsr #8        @ rINST<- AA
   4494     and     r2, r0, #255                @ r2<- BB
   4495     mov     r3, r0, lsr #8              @ r3<- CC
   4496     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
   4497     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
   4498     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
   4499     ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4500     ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
   4501     .if 1
   4502     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   4503     beq     common_errDivideByZero
   4504     .endif
   4505     CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
   4506     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4507                                @ optional op; may set condition codes
   4508     bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
   4509     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4510     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   4511     GOTO_OPCODE ip                      @ jump to next instruction
   4512     /* 14-17 instructions */
   4513 
   4514 
   4515 /* ------------------------------ */
   4516     .balign 128
   4517 .L_op_rem_long: /* 0x9f */
   4518 /* File: arm/op_rem_long.S */
   4519 /* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
   4520 /* File: arm/binopWide.S */
   4521     /*
   4522      * Generic 64-bit binary operation.  Provide an "instr" line that
   4523      * specifies an instruction that performs "result = r0-r1 op r2-r3".
   4524      * This could be an ARM instruction or a function call.  (If the result
   4525      * comes back in a register other than r0, you can override "result".)
   4526      *
   4527      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4528      * vCC (r1).  Useful for integer division and modulus.
   4529      *
   4530      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   4531      *      xor-long, add-double, sub-double, mul-double, div-double,
   4532      *      rem-double
   4533      *
   4534      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   4535      */
   4536     /* binop vAA, vBB, vCC */
   4537     FETCH r0, 1                         @ r0<- CCBB
   4538     mov     rINST, rINST, lsr #8        @ rINST<- AA
   4539     and     r2, r0, #255                @ r2<- BB
   4540     mov     r3, r0, lsr #8              @ r3<- CC
   4541     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
   4542     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
   4543     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
   4544     ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4545     ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
   4546     .if 1
   4547     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   4548     beq     common_errDivideByZero
   4549     .endif
   4550     CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
   4551     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4552                                @ optional op; may set condition codes
   4553     bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
   4554     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4555     stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
   4556     GOTO_OPCODE ip                      @ jump to next instruction
   4557     /* 14-17 instructions */
   4558 
   4559 
   4560 /* ------------------------------ */
   4561     .balign 128
   4562 .L_op_and_long: /* 0xa0 */
   4563 /* File: arm/op_and_long.S */
   4564 /* File: arm/binopWide.S */
   4565     /*
   4566      * Generic 64-bit binary operation.  Provide an "instr" line that
   4567      * specifies an instruction that performs "result = r0-r1 op r2-r3".
   4568      * This could be an ARM instruction or a function call.  (If the result
   4569      * comes back in a register other than r0, you can override "result".)
   4570      *
   4571      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4572      * vCC (r1).  Useful for integer division and modulus.
   4573      *
   4574      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   4575      *      xor-long, add-double, sub-double, mul-double, div-double,
   4576      *      rem-double
   4577      *
   4578      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   4579      */
   4580     /* binop vAA, vBB, vCC */
   4581     FETCH r0, 1                         @ r0<- CCBB
   4582     mov     rINST, rINST, lsr #8        @ rINST<- AA
   4583     and     r2, r0, #255                @ r2<- BB
   4584     mov     r3, r0, lsr #8              @ r3<- CC
   4585     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
   4586     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
   4587     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
   4588     ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4589     ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
   4590     .if 0
   4591     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   4592     beq     common_errDivideByZero
   4593     .endif
   4594     CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
   4595     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4596     and     r0, r0, r2                           @ optional op; may set condition codes
   4597     and     r1, r1, r3                              @ result<- op, r0-r3 changed
   4598     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4599     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   4600     GOTO_OPCODE ip                      @ jump to next instruction
   4601     /* 14-17 instructions */
   4602 
   4603 
   4604 /* ------------------------------ */
   4605     .balign 128
   4606 .L_op_or_long: /* 0xa1 */
   4607 /* File: arm/op_or_long.S */
   4608 /* File: arm/binopWide.S */
   4609     /*
   4610      * Generic 64-bit binary operation.  Provide an "instr" line that
   4611      * specifies an instruction that performs "result = r0-r1 op r2-r3".
   4612      * This could be an ARM instruction or a function call.  (If the result
   4613      * comes back in a register other than r0, you can override "result".)
   4614      *
   4615      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4616      * vCC (r1).  Useful for integer division and modulus.
   4617      *
   4618      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   4619      *      xor-long, add-double, sub-double, mul-double, div-double,
   4620      *      rem-double
   4621      *
   4622      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   4623      */
   4624     /* binop vAA, vBB, vCC */
   4625     FETCH r0, 1                         @ r0<- CCBB
   4626     mov     rINST, rINST, lsr #8        @ rINST<- AA
   4627     and     r2, r0, #255                @ r2<- BB
   4628     mov     r3, r0, lsr #8              @ r3<- CC
   4629     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
   4630     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
   4631     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
   4632     ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4633     ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
   4634     .if 0
   4635     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   4636     beq     common_errDivideByZero
   4637     .endif
   4638     CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
   4639     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4640     orr     r0, r0, r2                           @ optional op; may set condition codes
   4641     orr     r1, r1, r3                              @ result<- op, r0-r3 changed
   4642     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4643     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   4644     GOTO_OPCODE ip                      @ jump to next instruction
   4645     /* 14-17 instructions */
   4646 
   4647 
   4648 /* ------------------------------ */
   4649     .balign 128
   4650 .L_op_xor_long: /* 0xa2 */
   4651 /* File: arm/op_xor_long.S */
   4652 /* File: arm/binopWide.S */
   4653     /*
   4654      * Generic 64-bit binary operation.  Provide an "instr" line that
   4655      * specifies an instruction that performs "result = r0-r1 op r2-r3".
   4656      * This could be an ARM instruction or a function call.  (If the result
   4657      * comes back in a register other than r0, you can override "result".)
   4658      *
   4659      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4660      * vCC (r1).  Useful for integer division and modulus.
   4661      *
   4662      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   4663      *      xor-long, add-double, sub-double, mul-double, div-double,
   4664      *      rem-double
   4665      *
   4666      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   4667      */
   4668     /* binop vAA, vBB, vCC */
   4669     FETCH r0, 1                         @ r0<- CCBB
   4670     mov     rINST, rINST, lsr #8        @ rINST<- AA
   4671     and     r2, r0, #255                @ r2<- BB
   4672     mov     r3, r0, lsr #8              @ r3<- CC
   4673     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
   4674     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
   4675     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
   4676     ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4677     ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
   4678     .if 0
   4679     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   4680     beq     common_errDivideByZero
   4681     .endif
   4682     CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
   4683     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4684     eor     r0, r0, r2                           @ optional op; may set condition codes
   4685     eor     r1, r1, r3                              @ result<- op, r0-r3 changed
   4686     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4687     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   4688     GOTO_OPCODE ip                      @ jump to next instruction
   4689     /* 14-17 instructions */
   4690 
   4691 
   4692 /* ------------------------------ */
   4693     .balign 128
   4694 .L_op_shl_long: /* 0xa3 */
   4695 /* File: arm/op_shl_long.S */
   4696     /*
   4697      * Long integer shift.  This is different from the generic 32/64-bit
   4698      * binary operations because vAA/vBB are 64-bit but vCC (the shift
   4699      * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
   4700      * 6 bits of the shift distance.
   4701      */
   4702     /* shl-long vAA, vBB, vCC */
   4703     FETCH r0, 1                         @ r0<- CCBB
   4704     mov     r9, rINST, lsr #8           @ r9<- AA
   4705     and     r3, r0, #255                @ r3<- BB
   4706     mov     r0, r0, lsr #8              @ r0<- CC
   4707     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[BB]
   4708     GET_VREG r2, r0                     @ r2<- vCC
   4709     ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4710     CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
   4711     and     r2, r2, #63                 @ r2<- r2 & 0x3f
   4712     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
   4713     mov     r1, r1, asl r2              @ r1<- r1 << r2
   4714     rsb     r3, r2, #32                 @ r3<- 32 - r2
   4715     orr     r1, r1, r0, lsr r3          @ r1<- r1 | (r0 << (32-r2))
   4716     subs    ip, r2, #32                 @ ip<- r2 - 32
   4717     movpl   r1, r0, asl ip              @ if r2 >= 32, r1<- r0 << (r2-32)
   4718     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4719     mov     r0, r0, asl r2              @ r0<- r0 << r2
   4720     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4721     stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
   4722     GOTO_OPCODE ip                      @ jump to next instruction
   4723 
   4724 /* ------------------------------ */
   4725     .balign 128
   4726 .L_op_shr_long: /* 0xa4 */
   4727 /* File: arm/op_shr_long.S */
   4728     /*
   4729      * Long integer shift.  This is different from the generic 32/64-bit
   4730      * binary operations because vAA/vBB are 64-bit but vCC (the shift
   4731      * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
   4732      * 6 bits of the shift distance.
   4733      */
   4734     /* shr-long vAA, vBB, vCC */
   4735     FETCH r0, 1                         @ r0<- CCBB
   4736     mov     r9, rINST, lsr #8           @ r9<- AA
   4737     and     r3, r0, #255                @ r3<- BB
   4738     mov     r0, r0, lsr #8              @ r0<- CC
   4739     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[BB]
   4740     GET_VREG r2, r0                     @ r2<- vCC
   4741     ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4742     CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
   4743     and     r2, r2, #63                 @ r0<- r0 & 0x3f
   4744     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
   4745     mov     r0, r0, lsr r2              @ r0<- r2 >> r2
   4746     rsb     r3, r2, #32                 @ r3<- 32 - r2
   4747     orr     r0, r0, r1, asl r3          @ r0<- r0 | (r1 << (32-r2))
   4748     subs    ip, r2, #32                 @ ip<- r2 - 32
   4749     movpl   r0, r1, asr ip              @ if r2 >= 32, r0<-r1 >> (r2-32)
   4750     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4751     mov     r1, r1, asr r2              @ r1<- r1 >> r2
   4752     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4753     stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
   4754     GOTO_OPCODE ip                      @ jump to next instruction
   4755 
   4756 /* ------------------------------ */
   4757     .balign 128
   4758 .L_op_ushr_long: /* 0xa5 */
   4759 /* File: arm/op_ushr_long.S */
   4760     /*
   4761      * Long integer shift.  This is different from the generic 32/64-bit
   4762      * binary operations because vAA/vBB are 64-bit but vCC (the shift
   4763      * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
   4764      * 6 bits of the shift distance.
   4765      */
   4766     /* ushr-long vAA, vBB, vCC */
   4767     FETCH r0, 1                         @ r0<- CCBB
   4768     mov     r9, rINST, lsr #8           @ r9<- AA
   4769     and     r3, r0, #255                @ r3<- BB
   4770     mov     r0, r0, lsr #8              @ r0<- CC
   4771     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[BB]
   4772     GET_VREG r2, r0                     @ r2<- vCC
   4773     ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   4774     CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
   4775     and     r2, r2, #63                 @ r0<- r0 & 0x3f
   4776     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[AA]
   4777     mov     r0, r0, lsr r2              @ r0<- r2 >> r2
   4778     rsb     r3, r2, #32                 @ r3<- 32 - r2
   4779     orr     r0, r0, r1, asl r3          @ r0<- r0 | (r1 << (32-r2))
   4780     subs    ip, r2, #32                 @ ip<- r2 - 32
   4781     movpl   r0, r1, lsr ip              @ if r2 >= 32, r0<-r1 >>> (r2-32)
   4782     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4783     mov     r1, r1, lsr r2              @ r1<- r1 >>> r2
   4784     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4785     stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
   4786     GOTO_OPCODE ip                      @ jump to next instruction
   4787 
   4788 /* ------------------------------ */
   4789     .balign 128
   4790 .L_op_add_float: /* 0xa6 */
   4791 /* File: arm/op_add_float.S */
   4792 /* File: arm/fbinop.S */
   4793     /*
   4794      * Generic 32-bit floating-point operation.  Provide an "instr" line that
   4795      * specifies an instruction that performs "s2 = s0 op s1".  Because we
   4796      * use the "softfp" ABI, this must be an instruction, not a function call.
   4797      *
   4798      * For: add-float, sub-float, mul-float, div-float
   4799      */
   4800     /* floatop vAA, vBB, vCC */
   4801     FETCH r0, 1                         @ r0<- CCBB
   4802     mov     r9, rINST, lsr #8           @ r9<- AA
   4803     mov     r3, r0, lsr #8              @ r3<- CC
   4804     and     r2, r0, #255                @ r2<- BB
   4805     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   4806     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   4807     flds    s1, [r3]                    @ s1<- vCC
   4808     flds    s0, [r2]                    @ s0<- vBB
   4809 
   4810     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4811     fadds   s2, s0, s1                              @ s2<- op
   4812     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4813     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
   4814     fsts    s2, [r9]                    @ vAA<- s2
   4815     GOTO_OPCODE ip                      @ jump to next instruction
   4816 
   4817 
   4818 /* ------------------------------ */
   4819     .balign 128
   4820 .L_op_sub_float: /* 0xa7 */
   4821 /* File: arm/op_sub_float.S */
   4822 /* File: arm/fbinop.S */
   4823     /*
   4824      * Generic 32-bit floating-point operation.  Provide an "instr" line that
   4825      * specifies an instruction that performs "s2 = s0 op s1".  Because we
   4826      * use the "softfp" ABI, this must be an instruction, not a function call.
   4827      *
   4828      * For: add-float, sub-float, mul-float, div-float
   4829      */
   4830     /* floatop vAA, vBB, vCC */
   4831     FETCH r0, 1                         @ r0<- CCBB
   4832     mov     r9, rINST, lsr #8           @ r9<- AA
   4833     mov     r3, r0, lsr #8              @ r3<- CC
   4834     and     r2, r0, #255                @ r2<- BB
   4835     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   4836     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   4837     flds    s1, [r3]                    @ s1<- vCC
   4838     flds    s0, [r2]                    @ s0<- vBB
   4839 
   4840     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4841     fsubs   s2, s0, s1                              @ s2<- op
   4842     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4843     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
   4844     fsts    s2, [r9]                    @ vAA<- s2
   4845     GOTO_OPCODE ip                      @ jump to next instruction
   4846 
   4847 
   4848 /* ------------------------------ */
   4849     .balign 128
   4850 .L_op_mul_float: /* 0xa8 */
   4851 /* File: arm/op_mul_float.S */
   4852 /* File: arm/fbinop.S */
   4853     /*
   4854      * Generic 32-bit floating-point operation.  Provide an "instr" line that
   4855      * specifies an instruction that performs "s2 = s0 op s1".  Because we
   4856      * use the "softfp" ABI, this must be an instruction, not a function call.
   4857      *
   4858      * For: add-float, sub-float, mul-float, div-float
   4859      */
   4860     /* floatop vAA, vBB, vCC */
   4861     FETCH r0, 1                         @ r0<- CCBB
   4862     mov     r9, rINST, lsr #8           @ r9<- AA
   4863     mov     r3, r0, lsr #8              @ r3<- CC
   4864     and     r2, r0, #255                @ r2<- BB
   4865     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   4866     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   4867     flds    s1, [r3]                    @ s1<- vCC
   4868     flds    s0, [r2]                    @ s0<- vBB
   4869 
   4870     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4871     fmuls   s2, s0, s1                              @ s2<- op
   4872     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4873     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
   4874     fsts    s2, [r9]                    @ vAA<- s2
   4875     GOTO_OPCODE ip                      @ jump to next instruction
   4876 
   4877 
   4878 /* ------------------------------ */
   4879     .balign 128
   4880 .L_op_div_float: /* 0xa9 */
   4881 /* File: arm/op_div_float.S */
   4882 /* File: arm/fbinop.S */
   4883     /*
   4884      * Generic 32-bit floating-point operation.  Provide an "instr" line that
   4885      * specifies an instruction that performs "s2 = s0 op s1".  Because we
   4886      * use the "softfp" ABI, this must be an instruction, not a function call.
   4887      *
   4888      * For: add-float, sub-float, mul-float, div-float
   4889      */
   4890     /* floatop vAA, vBB, vCC */
   4891     FETCH r0, 1                         @ r0<- CCBB
   4892     mov     r9, rINST, lsr #8           @ r9<- AA
   4893     mov     r3, r0, lsr #8              @ r3<- CC
   4894     and     r2, r0, #255                @ r2<- BB
   4895     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   4896     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   4897     flds    s1, [r3]                    @ s1<- vCC
   4898     flds    s0, [r2]                    @ s0<- vBB
   4899 
   4900     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4901     fdivs   s2, s0, s1                              @ s2<- op
   4902     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4903     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
   4904     fsts    s2, [r9]                    @ vAA<- s2
   4905     GOTO_OPCODE ip                      @ jump to next instruction
   4906 
   4907 
   4908 /* ------------------------------ */
   4909     .balign 128
   4910 .L_op_rem_float: /* 0xaa */
   4911 /* File: arm/op_rem_float.S */
   4912 /* EABI doesn't define a float remainder function, but libm does */
   4913 /* File: arm/binop.S */
   4914     /*
   4915      * Generic 32-bit binary operation.  Provide an "instr" line that
   4916      * specifies an instruction that performs "result = r0 op r1".
   4917      * This could be an ARM instruction or a function call.  (If the result
   4918      * comes back in a register other than r0, you can override "result".)
   4919      *
   4920      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4921      * vCC (r1).  Useful for integer division and modulus.  Note that we
   4922      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4923      * handles it correctly.
   4924      *
   4925      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4926      *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
   4927      *      mul-float, div-float, rem-float
   4928      */
   4929     /* binop vAA, vBB, vCC */
   4930     FETCH r0, 1                         @ r0<- CCBB
   4931     mov     r9, rINST, lsr #8           @ r9<- AA
   4932     mov     r3, r0, lsr #8              @ r3<- CC
   4933     and     r2, r0, #255                @ r2<- BB
   4934     GET_VREG r1, r3                     @ r1<- vCC
   4935     GET_VREG r0, r2                     @ r0<- vBB
   4936     .if 0
   4937     cmp     r1, #0                      @ is second operand zero?
   4938     beq     common_errDivideByZero
   4939     .endif
   4940 
   4941     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4942                                @ optional op; may set condition codes
   4943     bl      fmodf                              @ r0<- op, r0-r3 changed
   4944     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4945     SET_VREG r0, r9                @ vAA<- r0
   4946     GOTO_OPCODE ip                      @ jump to next instruction
   4947     /* 11-14 instructions */
   4948 
   4949 
   4950 /* ------------------------------ */
   4951     .balign 128
   4952 .L_op_add_double: /* 0xab */
   4953 /* File: arm/op_add_double.S */
   4954 /* File: arm/fbinopWide.S */
   4955     /*
   4956      * Generic 64-bit double-precision floating point binary operation.
   4957      * Provide an "instr" line that specifies an instruction that performs
   4958      * "d2 = d0 op d1".
   4959      *
   4960      * for: add-double, sub-double, mul-double, div-double
   4961      */
   4962     /* doubleop vAA, vBB, vCC */
   4963     FETCH r0, 1                         @ r0<- CCBB
   4964     mov     r9, rINST, lsr #8           @ r9<- AA
   4965     mov     r3, r0, lsr #8              @ r3<- CC
   4966     and     r2, r0, #255                @ r2<- BB
   4967     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   4968     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   4969     fldd    d1, [r3]                    @ d1<- vCC
   4970     fldd    d0, [r2]                    @ d0<- vBB
   4971     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   4972     faddd   d2, d0, d1                              @ s2<- op
   4973     CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
   4974     GET_INST_OPCODE ip                  @ extract opcode from rINST
   4975     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
   4976     fstd    d2, [r9]                    @ vAA<- d2
   4977     GOTO_OPCODE ip                      @ jump to next instruction
   4978 
   4979 
   4980 /* ------------------------------ */
   4981     .balign 128
   4982 .L_op_sub_double: /* 0xac */
   4983 /* File: arm/op_sub_double.S */
   4984 /* File: arm/fbinopWide.S */
   4985     /*
   4986      * Generic 64-bit double-precision floating point binary operation.
   4987      * Provide an "instr" line that specifies an instruction that performs
   4988      * "d2 = d0 op d1".
   4989      *
   4990      * for: add-double, sub-double, mul-double, div-double
   4991      */
   4992     /* doubleop vAA, vBB, vCC */
   4993     FETCH r0, 1                         @ r0<- CCBB
   4994     mov     r9, rINST, lsr #8           @ r9<- AA
   4995     mov     r3, r0, lsr #8              @ r3<- CC
   4996     and     r2, r0, #255                @ r2<- BB
   4997     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   4998     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   4999     fldd    d1, [r3]                    @ d1<- vCC
   5000     fldd    d0, [r2]                    @ d0<- vBB
   5001     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   5002     fsubd   d2, d0, d1                              @ s2<- op
   5003     CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
   5004     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5005     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
   5006     fstd    d2, [r9]                    @ vAA<- d2
   5007     GOTO_OPCODE ip                      @ jump to next instruction
   5008 
   5009 
   5010 /* ------------------------------ */
   5011     .balign 128
   5012 .L_op_mul_double: /* 0xad */
   5013 /* File: arm/op_mul_double.S */
   5014 /* File: arm/fbinopWide.S */
   5015     /*
   5016      * Generic 64-bit double-precision floating point binary operation.
   5017      * Provide an "instr" line that specifies an instruction that performs
   5018      * "d2 = d0 op d1".
   5019      *
   5020      * for: add-double, sub-double, mul-double, div-double
   5021      */
   5022     /* doubleop vAA, vBB, vCC */
   5023     FETCH r0, 1                         @ r0<- CCBB
   5024     mov     r9, rINST, lsr #8           @ r9<- AA
   5025     mov     r3, r0, lsr #8              @ r3<- CC
   5026     and     r2, r0, #255                @ r2<- BB
   5027     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   5028     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   5029     fldd    d1, [r3]                    @ d1<- vCC
   5030     fldd    d0, [r2]                    @ d0<- vBB
   5031     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   5032     fmuld   d2, d0, d1                              @ s2<- op
   5033     CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
   5034     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5035     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
   5036     fstd    d2, [r9]                    @ vAA<- d2
   5037     GOTO_OPCODE ip                      @ jump to next instruction
   5038 
   5039 
   5040 /* ------------------------------ */
   5041     .balign 128
   5042 .L_op_div_double: /* 0xae */
   5043 /* File: arm/op_div_double.S */
   5044 /* File: arm/fbinopWide.S */
   5045     /*
   5046      * Generic 64-bit double-precision floating point binary operation.
   5047      * Provide an "instr" line that specifies an instruction that performs
   5048      * "d2 = d0 op d1".
   5049      *
   5050      * for: add-double, sub-double, mul-double, div-double
   5051      */
   5052     /* doubleop vAA, vBB, vCC */
   5053     FETCH r0, 1                         @ r0<- CCBB
   5054     mov     r9, rINST, lsr #8           @ r9<- AA
   5055     mov     r3, r0, lsr #8              @ r3<- CC
   5056     and     r2, r0, #255                @ r2<- BB
   5057     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
   5058     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
   5059     fldd    d1, [r3]                    @ d1<- vCC
   5060     fldd    d0, [r2]                    @ d0<- vBB
   5061     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   5062     fdivd   d2, d0, d1                              @ s2<- op
   5063     CLEAR_SHADOW_PAIR r9, ip, lr        @ Zero shadow regs
   5064     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5065     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vAA
   5066     fstd    d2, [r9]                    @ vAA<- d2
   5067     GOTO_OPCODE ip                      @ jump to next instruction
   5068 
   5069 
   5070 /* ------------------------------ */
   5071     .balign 128
   5072 .L_op_rem_double: /* 0xaf */
   5073 /* File: arm/op_rem_double.S */
   5074 /* EABI doesn't define a double remainder function, but libm does */
   5075 /* File: arm/binopWide.S */
   5076     /*
   5077      * Generic 64-bit binary operation.  Provide an "instr" line that
   5078      * specifies an instruction that performs "result = r0-r1 op r2-r3".
   5079      * This could be an ARM instruction or a function call.  (If the result
   5080      * comes back in a register other than r0, you can override "result".)
   5081      *
   5082      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5083      * vCC (r1).  Useful for integer division and modulus.
   5084      *
   5085      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   5086      *      xor-long, add-double, sub-double, mul-double, div-double,
   5087      *      rem-double
   5088      *
   5089      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   5090      */
   5091     /* binop vAA, vBB, vCC */
   5092     FETCH r0, 1                         @ r0<- CCBB
   5093     mov     rINST, rINST, lsr #8        @ rINST<- AA
   5094     and     r2, r0, #255                @ r2<- BB
   5095     mov     r3, r0, lsr #8              @ r3<- CC
   5096     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[AA]
   5097     VREG_INDEX_TO_ADDR r2, r2           @ r2<- &fp[BB]
   5098     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &fp[CC]
   5099     ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
   5100     ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
   5101     .if 0
   5102     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   5103     beq     common_errDivideByZero
   5104     .endif
   5105     CLEAR_SHADOW_PAIR rINST, lr, ip     @ Zero out the shadow regs
   5106     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   5107                                @ optional op; may set condition codes
   5108     bl      fmod                              @ result<- op, r0-r3 changed
   5109     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5110     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   5111     GOTO_OPCODE ip                      @ jump to next instruction
   5112     /* 14-17 instructions */
   5113 
   5114 
   5115 /* ------------------------------ */
   5116     .balign 128
   5117 .L_op_add_int_2addr: /* 0xb0 */
   5118 /* File: arm/op_add_int_2addr.S */
   5119 /* File: arm/binop2addr.S */
   5120     /*
   5121      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   5122      * that specifies an instruction that performs "result = r0 op r1".
   5123      * This could be an ARM instruction or a function call.  (If the result
   5124      * comes back in a register other than r0, you can override "result".)
   5125      *
   5126      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5127      * vCC (r1).  Useful for integer division and modulus.
   5128      *
   5129      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   5130      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   5131      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
   5132      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
   5133      */
   5134     /* binop/2addr vA, vB */
   5135     mov     r3, rINST, lsr #12          @ r3<- B
   5136     ubfx    r9, rINST, #8, #4           @ r9<- A
   5137     GET_VREG r1, r3                     @ r1<- vB
   5138     GET_VREG r0, r9                     @ r0<- vA
   5139     .if 0
   5140     cmp     r1, #0                      @ is second operand zero?
   5141     beq     common_errDivideByZero
   5142     .endif
   5143     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5144 
   5145                                @ optional op; may set condition codes
   5146     add     r0, r0, r1                              @ r0<- op, r0-r3 changed
   5147     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5148     SET_VREG r0, r9                @ vAA<- r0
   5149     GOTO_OPCODE ip                      @ jump to next instruction
   5150     /* 10-13 instructions */
   5151 
   5152 
   5153 /* ------------------------------ */
   5154     .balign 128
   5155 .L_op_sub_int_2addr: /* 0xb1 */
   5156 /* File: arm/op_sub_int_2addr.S */
   5157 /* File: arm/binop2addr.S */
   5158     /*
   5159      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   5160      * that specifies an instruction that performs "result = r0 op r1".
   5161      * This could be an ARM instruction or a function call.  (If the result
   5162      * comes back in a register other than r0, you can override "result".)
   5163      *
   5164      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5165      * vCC (r1).  Useful for integer division and modulus.
   5166      *
   5167      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   5168      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   5169      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
   5170      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
   5171      */
   5172     /* binop/2addr vA, vB */
   5173     mov     r3, rINST, lsr #12          @ r3<- B
   5174     ubfx    r9, rINST, #8, #4           @ r9<- A
   5175     GET_VREG r1, r3                     @ r1<- vB
   5176     GET_VREG r0, r9                     @ r0<- vA
   5177     .if 0
   5178     cmp     r1, #0                      @ is second operand zero?
   5179     beq     common_errDivideByZero
   5180     .endif
   5181     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5182 
   5183                                @ optional op; may set condition codes
   5184     sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
   5185     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5186     SET_VREG r0, r9                @ vAA<- r0
   5187     GOTO_OPCODE ip                      @ jump to next instruction
   5188     /* 10-13 instructions */
   5189 
   5190 
   5191 /* ------------------------------ */
   5192     .balign 128
   5193 .L_op_mul_int_2addr: /* 0xb2 */
   5194 /* File: arm/op_mul_int_2addr.S */
   5195 /* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
   5196 /* File: arm/binop2addr.S */
   5197     /*
   5198      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   5199      * that specifies an instruction that performs "result = r0 op r1".
   5200      * This could be an ARM instruction or a function call.  (If the result
   5201      * comes back in a register other than r0, you can override "result".)
   5202      *
   5203      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5204      * vCC (r1).  Useful for integer division and modulus.
   5205      *
   5206      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   5207      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   5208      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
   5209      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
   5210      */
   5211     /* binop/2addr vA, vB */
   5212     mov     r3, rINST, lsr #12          @ r3<- B
   5213     ubfx    r9, rINST, #8, #4           @ r9<- A
   5214     GET_VREG r1, r3                     @ r1<- vB
   5215     GET_VREG r0, r9                     @ r0<- vA
   5216     .if 0
   5217     cmp     r1, #0                      @ is second operand zero?
   5218     beq     common_errDivideByZero
   5219     .endif
   5220     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5221 
   5222                                @ optional op; may set condition codes
   5223     mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
   5224     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5225     SET_VREG r0, r9                @ vAA<- r0
   5226     GOTO_OPCODE ip                      @ jump to next instruction
   5227     /* 10-13 instructions */
   5228 
   5229 
   5230 /* ------------------------------ */
   5231     .balign 128
   5232 .L_op_div_int_2addr: /* 0xb3 */
   5233 /* File: arm/op_div_int_2addr.S */
   5234     /*
   5235      * Specialized 32-bit binary operation
   5236      *
   5237      * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
   5238      * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
   5239      * ARMv7 CPUs that have hardware division support).
   5240      *
   5241      * div-int/2addr
   5242      *
   5243      */
   5244     mov     r3, rINST, lsr #12          @ r3<- B
   5245     ubfx    r9, rINST, #8, #4           @ r9<- A
   5246     GET_VREG r1, r3                     @ r1<- vB
   5247     GET_VREG r0, r9                     @ r0<- vA
   5248     cmp     r1, #0                      @ is second operand zero?
   5249     beq     common_errDivideByZero
   5250     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5251 
   5252 #ifdef __ARM_ARCH_EXT_IDIV__
   5253     sdiv    r0, r0, r1                  @ r0<- op
   5254 #else
   5255     bl       __aeabi_idiv               @ r0<- op, r0-r3 changed
   5256 #endif
   5257     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5258     SET_VREG r0, r9                     @ vAA<- r0
   5259     GOTO_OPCODE ip                      @ jump to next instruction
   5260     /* 10-13 instructions */
   5261 
   5262 
   5263 /* ------------------------------ */
   5264     .balign 128
   5265 .L_op_rem_int_2addr: /* 0xb4 */
   5266 /* File: arm/op_rem_int_2addr.S */
   5267     /*
   5268      * Specialized 32-bit binary operation
   5269      *
   5270      * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
   5271      * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
   5272      * ARMv7 CPUs that have hardware division support).
   5273      *
   5274      * NOTE: idivmod returns quotient in r0 and remainder in r1
   5275      *
   5276      * rem-int/2addr
   5277      *
   5278      */
   5279     mov     r3, rINST, lsr #12          @ r3<- B
   5280     ubfx    r9, rINST, #8, #4           @ r9<- A
   5281     GET_VREG r1, r3                     @ r1<- vB
   5282     GET_VREG r0, r9                     @ r0<- vA
   5283     cmp     r1, #0                      @ is second operand zero?
   5284     beq     common_errDivideByZero
   5285     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5286 
   5287 #ifdef __ARM_ARCH_EXT_IDIV__
   5288     sdiv    r2, r0, r1
   5289     mls     r1, r1, r2, r0              @ r1<- op
   5290 #else
   5291     bl      __aeabi_idivmod             @ r1<- op, r0-r3 changed
   5292 #endif
   5293     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5294     SET_VREG r1, r9                     @ vAA<- r1
   5295     GOTO_OPCODE ip                      @ jump to next instruction
   5296     /* 10-13 instructions */
   5297 
   5298 
   5299 /* ------------------------------ */
   5300     .balign 128
   5301 .L_op_and_int_2addr: /* 0xb5 */
   5302 /* File: arm/op_and_int_2addr.S */
   5303 /* File: arm/binop2addr.S */
   5304     /*
   5305      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   5306      * that specifies an instruction that performs "result = r0 op r1".
   5307      * This could be an ARM instruction or a function call.  (If the result
   5308      * comes back in a register other than r0, you can override "result".)
   5309      *
   5310      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5311      * vCC (r1).  Useful for integer division and modulus.
   5312      *
   5313      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   5314      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   5315      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
   5316      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
   5317      */
   5318     /* binop/2addr vA, vB */
   5319     mov     r3, rINST, lsr #12          @ r3<- B
   5320     ubfx    r9, rINST, #8, #4           @ r9<- A
   5321     GET_VREG r1, r3                     @ r1<- vB
   5322     GET_VREG r0, r9                     @ r0<- vA
   5323     .if 0
   5324     cmp     r1, #0                      @ is second operand zero?
   5325     beq     common_errDivideByZero
   5326     .endif
   5327     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5328 
   5329                                @ optional op; may set condition codes
   5330     and     r0, r0, r1                              @ r0<- op, r0-r3 changed
   5331     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5332     SET_VREG r0, r9                @ vAA<- r0
   5333     GOTO_OPCODE ip                      @ jump to next instruction
   5334     /* 10-13 instructions */
   5335 
   5336 
   5337 /* ------------------------------ */
   5338     .balign 128
   5339 .L_op_or_int_2addr: /* 0xb6 */
   5340 /* File: arm/op_or_int_2addr.S */
   5341 /* File: arm/binop2addr.S */
   5342     /*
   5343      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   5344      * that specifies an instruction that performs "result = r0 op r1".
   5345      * This could be an ARM instruction or a function call.  (If the result
   5346      * comes back in a register other than r0, you can override "result".)
   5347      *
   5348      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5349      * vCC (r1).  Useful for integer division and modulus.
   5350      *
   5351      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   5352      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   5353      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
   5354      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
   5355      */
   5356     /* binop/2addr vA, vB */
   5357     mov     r3, rINST, lsr #12          @ r3<- B
   5358     ubfx    r9, rINST, #8, #4           @ r9<- A
   5359     GET_VREG r1, r3                     @ r1<- vB
   5360     GET_VREG r0, r9                     @ r0<- vA
   5361     .if 0
   5362     cmp     r1, #0                      @ is second operand zero?
   5363     beq     common_errDivideByZero
   5364     .endif
   5365     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5366 
   5367                                @ optional op; may set condition codes
   5368     orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
   5369     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5370     SET_VREG r0, r9                @ vAA<- r0
   5371     GOTO_OPCODE ip                      @ jump to next instruction
   5372     /* 10-13 instructions */
   5373 
   5374 
   5375 /* ------------------------------ */
   5376     .balign 128
   5377 .L_op_xor_int_2addr: /* 0xb7 */
   5378 /* File: arm/op_xor_int_2addr.S */
   5379 /* File: arm/binop2addr.S */
   5380     /*
   5381      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   5382      * that specifies an instruction that performs "result = r0 op r1".
   5383      * This could be an ARM instruction or a function call.  (If the result
   5384      * comes back in a register other than r0, you can override "result".)
   5385      *
   5386      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5387      * vCC (r1).  Useful for integer division and modulus.
   5388      *
   5389      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   5390      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   5391      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
   5392      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
   5393      */
   5394     /* binop/2addr vA, vB */
   5395     mov     r3, rINST, lsr #12          @ r3<- B
   5396     ubfx    r9, rINST, #8, #4           @ r9<- A
   5397     GET_VREG r1, r3                     @ r1<- vB
   5398     GET_VREG r0, r9                     @ r0<- vA
   5399     .if 0
   5400     cmp     r1, #0                      @ is second operand zero?
   5401     beq     common_errDivideByZero
   5402     .endif
   5403     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5404 
   5405                                @ optional op; may set condition codes
   5406     eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
   5407     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5408     SET_VREG r0, r9                @ vAA<- r0
   5409     GOTO_OPCODE ip                      @ jump to next instruction
   5410     /* 10-13 instructions */
   5411 
   5412 
   5413 /* ------------------------------ */
   5414     .balign 128
   5415 .L_op_shl_int_2addr: /* 0xb8 */
   5416 /* File: arm/op_shl_int_2addr.S */
   5417 /* File: arm/binop2addr.S */
   5418     /*
   5419      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   5420      * that specifies an instruction that performs "result = r0 op r1".
   5421      * This could be an ARM instruction or a function call.  (If the result
   5422      * comes back in a register other than r0, you can override "result".)
   5423      *
   5424      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5425      * vCC (r1).  Useful for integer division and modulus.
   5426      *
   5427      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   5428      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   5429      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
   5430      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
   5431      */
   5432     /* binop/2addr vA, vB */
   5433     mov     r3, rINST, lsr #12          @ r3<- B
   5434     ubfx    r9, rINST, #8, #4           @ r9<- A
   5435     GET_VREG r1, r3                     @ r1<- vB
   5436     GET_VREG r0, r9                     @ r0<- vA
   5437     .if 0
   5438     cmp     r1, #0                      @ is second operand zero?
   5439     beq     common_errDivideByZero
   5440     .endif
   5441     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5442 
   5443     and     r1, r1, #31                           @ optional op; may set condition codes
   5444     mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
   5445     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5446     SET_VREG r0, r9                @ vAA<- r0
   5447     GOTO_OPCODE ip                      @ jump to next instruction
   5448     /* 10-13 instructions */
   5449 
   5450 
   5451 /* ------------------------------ */
   5452     .balign 128
   5453 .L_op_shr_int_2addr: /* 0xb9 */
   5454 /* File: arm/op_shr_int_2addr.S */
   5455 /* File: arm/binop2addr.S */
   5456     /*
   5457      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   5458      * that specifies an instruction that performs "result = r0 op r1".
   5459      * This could be an ARM instruction or a function call.  (If the result
   5460      * comes back in a register other than r0, you can override "result".)
   5461      *
   5462      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5463      * vCC (r1).  Useful for integer division and modulus.
   5464      *
   5465      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   5466      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   5467      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
   5468      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
   5469      */
   5470     /* binop/2addr vA, vB */
   5471     mov     r3, rINST, lsr #12          @ r3<- B
   5472     ubfx    r9, rINST, #8, #4           @ r9<- A
   5473     GET_VREG r1, r3                     @ r1<- vB
   5474     GET_VREG r0, r9                     @ r0<- vA
   5475     .if 0
   5476     cmp     r1, #0                      @ is second operand zero?
   5477     beq     common_errDivideByZero
   5478     .endif
   5479     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5480 
   5481     and     r1, r1, #31                           @ optional op; may set condition codes
   5482     mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
   5483     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5484     SET_VREG r0, r9                @ vAA<- r0
   5485     GOTO_OPCODE ip                      @ jump to next instruction
   5486     /* 10-13 instructions */
   5487 
   5488 
   5489 /* ------------------------------ */
   5490     .balign 128
   5491 .L_op_ushr_int_2addr: /* 0xba */
   5492 /* File: arm/op_ushr_int_2addr.S */
   5493 /* File: arm/binop2addr.S */
   5494     /*
   5495      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   5496      * that specifies an instruction that performs "result = r0 op r1".
   5497      * This could be an ARM instruction or a function call.  (If the result
   5498      * comes back in a register other than r0, you can override "result".)
   5499      *
   5500      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5501      * vCC (r1).  Useful for integer division and modulus.
   5502      *
   5503      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   5504      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   5505      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
   5506      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
   5507      */
   5508     /* binop/2addr vA, vB */
   5509     mov     r3, rINST, lsr #12          @ r3<- B
   5510     ubfx    r9, rINST, #8, #4           @ r9<- A
   5511     GET_VREG r1, r3                     @ r1<- vB
   5512     GET_VREG r0, r9                     @ r0<- vA
   5513     .if 0
   5514     cmp     r1, #0                      @ is second operand zero?
   5515     beq     common_errDivideByZero
   5516     .endif
   5517     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5518 
   5519     and     r1, r1, #31                           @ optional op; may set condition codes
   5520     mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
   5521     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5522     SET_VREG r0, r9                @ vAA<- r0
   5523     GOTO_OPCODE ip                      @ jump to next instruction
   5524     /* 10-13 instructions */
   5525 
   5526 
   5527 /* ------------------------------ */
   5528     .balign 128
   5529 .L_op_add_long_2addr: /* 0xbb */
   5530 /* File: arm/op_add_long_2addr.S */
   5531 /* File: arm/binopWide2addr.S */
   5532     /*
   5533      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   5534      * that specifies an instruction that performs "result = r0-r1 op r2-r3".
   5535      * This could be an ARM instruction or a function call.  (If the result
   5536      * comes back in a register other than r0, you can override "result".)
   5537      *
   5538      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5539      * vCC (r1).  Useful for integer division and modulus.
   5540      *
   5541      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   5542      *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
   5543      *      sub-double/2addr, mul-double/2addr, div-double/2addr,
   5544      *      rem-double/2addr
   5545      */
   5546     /* binop/2addr vA, vB */
   5547     mov     r1, rINST, lsr #12          @ r1<- B
   5548     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   5549     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
   5550     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   5551     ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
   5552     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   5553     .if 0
   5554     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   5555     beq     common_errDivideByZero
   5556     .endif
   5557     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   5558     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5559     adds    r0, r0, r2                           @ optional op; may set condition codes
   5560     adc     r1, r1, r3                              @ result<- op, r0-r3 changed
   5561     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5562     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   5563     GOTO_OPCODE ip                      @ jump to next instruction
   5564     /* 12-15 instructions */
   5565 
   5566 
   5567 /* ------------------------------ */
   5568     .balign 128
   5569 .L_op_sub_long_2addr: /* 0xbc */
   5570 /* File: arm/op_sub_long_2addr.S */
   5571 /* File: arm/binopWide2addr.S */
   5572     /*
   5573      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   5574      * that specifies an instruction that performs "result = r0-r1 op r2-r3".
   5575      * This could be an ARM instruction or a function call.  (If the result
   5576      * comes back in a register other than r0, you can override "result".)
   5577      *
   5578      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5579      * vCC (r1).  Useful for integer division and modulus.
   5580      *
   5581      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   5582      *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
   5583      *      sub-double/2addr, mul-double/2addr, div-double/2addr,
   5584      *      rem-double/2addr
   5585      */
   5586     /* binop/2addr vA, vB */
   5587     mov     r1, rINST, lsr #12          @ r1<- B
   5588     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   5589     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
   5590     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   5591     ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
   5592     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   5593     .if 0
   5594     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   5595     beq     common_errDivideByZero
   5596     .endif
   5597     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   5598     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5599     subs    r0, r0, r2                           @ optional op; may set condition codes
   5600     sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
   5601     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5602     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   5603     GOTO_OPCODE ip                      @ jump to next instruction
   5604     /* 12-15 instructions */
   5605 
   5606 
   5607 /* ------------------------------ */
   5608     .balign 128
   5609 .L_op_mul_long_2addr: /* 0xbd */
   5610 /* File: arm/op_mul_long_2addr.S */
   5611     /*
   5612      * Signed 64-bit integer multiply, "/2addr" version.
   5613      *
   5614      * See op_mul_long for an explanation.
   5615      *
   5616      * We get a little tight on registers, so to avoid looking up &fp[A]
   5617      * again we stuff it into rINST.
   5618      */
   5619     /* mul-long/2addr vA, vB */
   5620     mov     r1, rINST, lsr #12          @ r1<- B
   5621     ubfx    r9, rINST, #8, #4           @ r9<- A
   5622     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
   5623     VREG_INDEX_TO_ADDR rINST, r9        @ rINST<- &fp[A]
   5624     ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
   5625     ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
   5626     mul     ip, r2, r1                  @ ip<- ZxW
   5627     umull   r1, lr, r2, r0              @ r1/lr <- ZxX
   5628     mla     r2, r0, r3, ip              @ r2<- YxX + (ZxW)
   5629     mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
   5630     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5631     add     r2, r2, lr                  @ r2<- r2 + low(ZxW + (YxX))
   5632     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5633     stmia   r0, {r1-r2}                 @ vAA/vAA+1<- r1/r2
   5634     GOTO_OPCODE ip                      @ jump to next instruction
   5635 
   5636 /* ------------------------------ */
   5637     .balign 128
   5638 .L_op_div_long_2addr: /* 0xbe */
   5639 /* File: arm/op_div_long_2addr.S */
   5640 /* File: arm/binopWide2addr.S */
   5641     /*
   5642      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   5643      * that specifies an instruction that performs "result = r0-r1 op r2-r3".
   5644      * This could be an ARM instruction or a function call.  (If the result
   5645      * comes back in a register other than r0, you can override "result".)
   5646      *
   5647      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5648      * vCC (r1).  Useful for integer division and modulus.
   5649      *
   5650      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   5651      *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
   5652      *      sub-double/2addr, mul-double/2addr, div-double/2addr,
   5653      *      rem-double/2addr
   5654      */
   5655     /* binop/2addr vA, vB */
   5656     mov     r1, rINST, lsr #12          @ r1<- B
   5657     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   5658     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
   5659     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   5660     ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
   5661     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   5662     .if 1
   5663     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   5664     beq     common_errDivideByZero
   5665     .endif
   5666     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   5667     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5668                                @ optional op; may set condition codes
   5669     bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
   5670     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5671     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   5672     GOTO_OPCODE ip                      @ jump to next instruction
   5673     /* 12-15 instructions */
   5674 
   5675 
   5676 /* ------------------------------ */
   5677     .balign 128
   5678 .L_op_rem_long_2addr: /* 0xbf */
   5679 /* File: arm/op_rem_long_2addr.S */
   5680 /* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
   5681 /* File: arm/binopWide2addr.S */
   5682     /*
   5683      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   5684      * that specifies an instruction that performs "result = r0-r1 op r2-r3".
   5685      * This could be an ARM instruction or a function call.  (If the result
   5686      * comes back in a register other than r0, you can override "result".)
   5687      *
   5688      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5689      * vCC (r1).  Useful for integer division and modulus.
   5690      *
   5691      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   5692      *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
   5693      *      sub-double/2addr, mul-double/2addr, div-double/2addr,
   5694      *      rem-double/2addr
   5695      */
   5696     /* binop/2addr vA, vB */
   5697     mov     r1, rINST, lsr #12          @ r1<- B
   5698     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   5699     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
   5700     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   5701     ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
   5702     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   5703     .if 1
   5704     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   5705     beq     common_errDivideByZero
   5706     .endif
   5707     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   5708     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5709                                @ optional op; may set condition codes
   5710     bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
   5711     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5712     stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
   5713     GOTO_OPCODE ip                      @ jump to next instruction
   5714     /* 12-15 instructions */
   5715 
   5716 
   5717 /* ------------------------------ */
   5718     .balign 128
   5719 .L_op_and_long_2addr: /* 0xc0 */
   5720 /* File: arm/op_and_long_2addr.S */
   5721 /* File: arm/binopWide2addr.S */
   5722     /*
   5723      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   5724      * that specifies an instruction that performs "result = r0-r1 op r2-r3".
   5725      * This could be an ARM instruction or a function call.  (If the result
   5726      * comes back in a register other than r0, you can override "result".)
   5727      *
   5728      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5729      * vCC (r1).  Useful for integer division and modulus.
   5730      *
   5731      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   5732      *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
   5733      *      sub-double/2addr, mul-double/2addr, div-double/2addr,
   5734      *      rem-double/2addr
   5735      */
   5736     /* binop/2addr vA, vB */
   5737     mov     r1, rINST, lsr #12          @ r1<- B
   5738     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   5739     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
   5740     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   5741     ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
   5742     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   5743     .if 0
   5744     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   5745     beq     common_errDivideByZero
   5746     .endif
   5747     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   5748     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5749     and     r0, r0, r2                           @ optional op; may set condition codes
   5750     and     r1, r1, r3                              @ result<- op, r0-r3 changed
   5751     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5752     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   5753     GOTO_OPCODE ip                      @ jump to next instruction
   5754     /* 12-15 instructions */
   5755 
   5756 
   5757 /* ------------------------------ */
   5758     .balign 128
   5759 .L_op_or_long_2addr: /* 0xc1 */
   5760 /* File: arm/op_or_long_2addr.S */
   5761 /* File: arm/binopWide2addr.S */
   5762     /*
   5763      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   5764      * that specifies an instruction that performs "result = r0-r1 op r2-r3".
   5765      * This could be an ARM instruction or a function call.  (If the result
   5766      * comes back in a register other than r0, you can override "result".)
   5767      *
   5768      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5769      * vCC (r1).  Useful for integer division and modulus.
   5770      *
   5771      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   5772      *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
   5773      *      sub-double/2addr, mul-double/2addr, div-double/2addr,
   5774      *      rem-double/2addr
   5775      */
   5776     /* binop/2addr vA, vB */
   5777     mov     r1, rINST, lsr #12          @ r1<- B
   5778     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   5779     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
   5780     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   5781     ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
   5782     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   5783     .if 0
   5784     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   5785     beq     common_errDivideByZero
   5786     .endif
   5787     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   5788     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5789     orr     r0, r0, r2                           @ optional op; may set condition codes
   5790     orr     r1, r1, r3                              @ result<- op, r0-r3 changed
   5791     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5792     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   5793     GOTO_OPCODE ip                      @ jump to next instruction
   5794     /* 12-15 instructions */
   5795 
   5796 
   5797 /* ------------------------------ */
   5798     .balign 128
   5799 .L_op_xor_long_2addr: /* 0xc2 */
   5800 /* File: arm/op_xor_long_2addr.S */
   5801 /* File: arm/binopWide2addr.S */
   5802     /*
   5803      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   5804      * that specifies an instruction that performs "result = r0-r1 op r2-r3".
   5805      * This could be an ARM instruction or a function call.  (If the result
   5806      * comes back in a register other than r0, you can override "result".)
   5807      *
   5808      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5809      * vCC (r1).  Useful for integer division and modulus.
   5810      *
   5811      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   5812      *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
   5813      *      sub-double/2addr, mul-double/2addr, div-double/2addr,
   5814      *      rem-double/2addr
   5815      */
   5816     /* binop/2addr vA, vB */
   5817     mov     r1, rINST, lsr #12          @ r1<- B
   5818     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   5819     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
   5820     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   5821     ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
   5822     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   5823     .if 0
   5824     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   5825     beq     common_errDivideByZero
   5826     .endif
   5827     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   5828     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5829     eor     r0, r0, r2                           @ optional op; may set condition codes
   5830     eor     r1, r1, r3                              @ result<- op, r0-r3 changed
   5831     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5832     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   5833     GOTO_OPCODE ip                      @ jump to next instruction
   5834     /* 12-15 instructions */
   5835 
   5836 
   5837 /* ------------------------------ */
   5838     .balign 128
   5839 .L_op_shl_long_2addr: /* 0xc3 */
   5840 /* File: arm/op_shl_long_2addr.S */
   5841     /*
   5842      * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
   5843      * 32-bit shift distance.
   5844      */
   5845     /* shl-long/2addr vA, vB */
   5846     mov     r3, rINST, lsr #12          @ r3<- B
   5847     ubfx    r9, rINST, #8, #4           @ r9<- A
   5848     GET_VREG r2, r3                     @ r2<- vB
   5849     CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
   5850     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[A]
   5851     and     r2, r2, #63                 @ r2<- r2 & 0x3f
   5852     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   5853     mov     r1, r1, asl r2              @ r1<- r1 << r2
   5854     rsb     r3, r2, #32                 @ r3<- 32 - r2
   5855     orr     r1, r1, r0, lsr r3          @ r1<- r1 | (r0 << (32-r2))
   5856     subs    ip, r2, #32                 @ ip<- r2 - 32
   5857     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5858     movpl   r1, r0, asl ip              @ if r2 >= 32, r1<- r0 << (r2-32)
   5859     mov     r0, r0, asl r2              @ r0<- r0 << r2
   5860     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5861     stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
   5862     GOTO_OPCODE ip                      @ jump to next instruction
   5863 
   5864 /* ------------------------------ */
   5865     .balign 128
   5866 .L_op_shr_long_2addr: /* 0xc4 */
   5867 /* File: arm/op_shr_long_2addr.S */
   5868     /*
   5869      * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
   5870      * 32-bit shift distance.
   5871      */
   5872     /* shr-long/2addr vA, vB */
   5873     mov     r3, rINST, lsr #12          @ r3<- B
   5874     ubfx    r9, rINST, #8, #4           @ r9<- A
   5875     GET_VREG r2, r3                     @ r2<- vB
   5876     CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
   5877     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[A]
   5878     and     r2, r2, #63                 @ r2<- r2 & 0x3f
   5879     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   5880     mov     r0, r0, lsr r2              @ r0<- r2 >> r2
   5881     rsb     r3, r2, #32                 @ r3<- 32 - r2
   5882     orr     r0, r0, r1, asl r3          @ r0<- r0 | (r1 << (32-r2))
   5883     subs    ip, r2, #32                 @ ip<- r2 - 32
   5884     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5885     movpl   r0, r1, asr ip              @ if r2 >= 32, r0<-r1 >> (r2-32)
   5886     mov     r1, r1, asr r2              @ r1<- r1 >> r2
   5887     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5888     stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
   5889     GOTO_OPCODE ip                      @ jump to next instruction
   5890 
   5891 /* ------------------------------ */
   5892     .balign 128
   5893 .L_op_ushr_long_2addr: /* 0xc5 */
   5894 /* File: arm/op_ushr_long_2addr.S */
   5895     /*
   5896      * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
   5897      * 32-bit shift distance.
   5898      */
   5899     /* ushr-long/2addr vA, vB */
   5900     mov     r3, rINST, lsr #12          @ r3<- B
   5901     ubfx    r9, rINST, #8, #4           @ r9<- A
   5902     GET_VREG r2, r3                     @ r2<- vB
   5903     CLEAR_SHADOW_PAIR r9, lr, ip        @ Zero out the shadow regs
   5904     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &fp[A]
   5905     and     r2, r2, #63                 @ r2<- r2 & 0x3f
   5906     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   5907     mov     r0, r0, lsr r2              @ r0<- r2 >> r2
   5908     rsb     r3, r2, #32                 @ r3<- 32 - r2
   5909     orr     r0, r0, r1, asl r3          @ r0<- r0 | (r1 << (32-r2))
   5910     subs    ip, r2, #32                 @ ip<- r2 - 32
   5911     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5912     movpl   r0, r1, lsr ip              @ if r2 >= 32, r0<-r1 >>> (r2-32)
   5913     mov     r1, r1, lsr r2              @ r1<- r1 >>> r2
   5914     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5915     stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
   5916     GOTO_OPCODE ip                      @ jump to next instruction
   5917 
   5918 /* ------------------------------ */
   5919     .balign 128
   5920 .L_op_add_float_2addr: /* 0xc6 */
   5921 /* File: arm/op_add_float_2addr.S */
   5922 /* File: arm/fbinop2addr.S */
   5923     /*
   5924      * Generic 32-bit floating point "/2addr" binary operation.  Provide
   5925      * an "instr" line that specifies an instruction that performs
   5926      * "s2 = s0 op s1".
   5927      *
   5928      * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
   5929      */
   5930     /* binop/2addr vA, vB */
   5931     mov     r3, rINST, lsr #12          @ r3<- B
   5932     ubfx    r9, rINST, #8, #4           @ r9<- A
   5933     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   5934     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   5935     flds    s1, [r3]                    @ s1<- vB
   5936     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5937     flds    s0, [r9]                    @ s0<- vA
   5938     fadds   s2, s0, s1                              @ s2<- op
   5939     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5940     fsts    s2, [r9]                    @ vAA<- s2
   5941     GOTO_OPCODE ip                      @ jump to next instruction
   5942 
   5943 
   5944 /* ------------------------------ */
   5945     .balign 128
   5946 .L_op_sub_float_2addr: /* 0xc7 */
   5947 /* File: arm/op_sub_float_2addr.S */
   5948 /* File: arm/fbinop2addr.S */
   5949     /*
   5950      * Generic 32-bit floating point "/2addr" binary operation.  Provide
   5951      * an "instr" line that specifies an instruction that performs
   5952      * "s2 = s0 op s1".
   5953      *
   5954      * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
   5955      */
   5956     /* binop/2addr vA, vB */
   5957     mov     r3, rINST, lsr #12          @ r3<- B
   5958     ubfx    r9, rINST, #8, #4           @ r9<- A
   5959     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   5960     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   5961     flds    s1, [r3]                    @ s1<- vB
   5962     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5963     flds    s0, [r9]                    @ s0<- vA
   5964     fsubs   s2, s0, s1                              @ s2<- op
   5965     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5966     fsts    s2, [r9]                    @ vAA<- s2
   5967     GOTO_OPCODE ip                      @ jump to next instruction
   5968 
   5969 
   5970 /* ------------------------------ */
   5971     .balign 128
   5972 .L_op_mul_float_2addr: /* 0xc8 */
   5973 /* File: arm/op_mul_float_2addr.S */
   5974 /* File: arm/fbinop2addr.S */
   5975     /*
   5976      * Generic 32-bit floating point "/2addr" binary operation.  Provide
   5977      * an "instr" line that specifies an instruction that performs
   5978      * "s2 = s0 op s1".
   5979      *
   5980      * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
   5981      */
   5982     /* binop/2addr vA, vB */
   5983     mov     r3, rINST, lsr #12          @ r3<- B
   5984     ubfx    r9, rINST, #8, #4           @ r9<- A
   5985     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   5986     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   5987     flds    s1, [r3]                    @ s1<- vB
   5988     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   5989     flds    s0, [r9]                    @ s0<- vA
   5990     fmuls   s2, s0, s1                              @ s2<- op
   5991     GET_INST_OPCODE ip                  @ extract opcode from rINST
   5992     fsts    s2, [r9]                    @ vAA<- s2
   5993     GOTO_OPCODE ip                      @ jump to next instruction
   5994 
   5995 
   5996 /* ------------------------------ */
   5997     .balign 128
   5998 .L_op_div_float_2addr: /* 0xc9 */
   5999 /* File: arm/op_div_float_2addr.S */
   6000 /* File: arm/fbinop2addr.S */
   6001     /*
   6002      * Generic 32-bit floating point "/2addr" binary operation.  Provide
   6003      * an "instr" line that specifies an instruction that performs
   6004      * "s2 = s0 op s1".
   6005      *
   6006      * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
   6007      */
   6008     /* binop/2addr vA, vB */
   6009     mov     r3, rINST, lsr #12          @ r3<- B
   6010     ubfx    r9, rINST, #8, #4           @ r9<- A
   6011     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   6012     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   6013     flds    s1, [r3]                    @ s1<- vB
   6014     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   6015     flds    s0, [r9]                    @ s0<- vA
   6016     fdivs   s2, s0, s1                              @ s2<- op
   6017     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6018     fsts    s2, [r9]                    @ vAA<- s2
   6019     GOTO_OPCODE ip                      @ jump to next instruction
   6020 
   6021 
   6022 /* ------------------------------ */
   6023     .balign 128
   6024 .L_op_rem_float_2addr: /* 0xca */
   6025 /* File: arm/op_rem_float_2addr.S */
   6026 /* EABI doesn't define a float remainder function, but libm does */
   6027 /* File: arm/binop2addr.S */
   6028     /*
   6029      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6030      * that specifies an instruction that performs "result = r0 op r1".
   6031      * This could be an ARM instruction or a function call.  (If the result
   6032      * comes back in a register other than r0, you can override "result".)
   6033      *
   6034      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6035      * vCC (r1).  Useful for integer division and modulus.
   6036      *
   6037      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6038      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6039      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
   6040      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
   6041      */
   6042     /* binop/2addr vA, vB */
   6043     mov     r3, rINST, lsr #12          @ r3<- B
   6044     ubfx    r9, rINST, #8, #4           @ r9<- A
   6045     GET_VREG r1, r3                     @ r1<- vB
   6046     GET_VREG r0, r9                     @ r0<- vA
   6047     .if 0
   6048     cmp     r1, #0                      @ is second operand zero?
   6049     beq     common_errDivideByZero
   6050     .endif
   6051     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   6052 
   6053                                @ optional op; may set condition codes
   6054     bl      fmodf                              @ r0<- op, r0-r3 changed
   6055     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6056     SET_VREG r0, r9                @ vAA<- r0
   6057     GOTO_OPCODE ip                      @ jump to next instruction
   6058     /* 10-13 instructions */
   6059 
   6060 
   6061 /* ------------------------------ */
   6062     .balign 128
   6063 .L_op_add_double_2addr: /* 0xcb */
   6064 /* File: arm/op_add_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     faddd   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_sub_double_2addr: /* 0xcc */
   6092 /* File: arm/op_sub_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     fsubd   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_mul_double_2addr: /* 0xcd */
   6120 /* File: arm/op_mul_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     fmuld   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_div_double_2addr: /* 0xce */
   6148 /* File: arm/op_div_double_2addr.S */
   6149 /* File: arm/fbinopWide2addr.S */
   6150     /*
   6151      * Generic 64-bit floating point "/2addr" binary operation.  Provide
   6152      * an "instr" line that specifies an instruction that performs
   6153      * "d2 = d0 op d1".
   6154      *
   6155      * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
   6156      *      div-double/2addr
   6157      */
   6158     /* binop/2addr vA, vB */
   6159     mov     r3, rINST, lsr #12          @ r3<- B
   6160     ubfx    r9, rINST, #8, #4           @ r9<- A
   6161     VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vB
   6162     CLEAR_SHADOW_PAIR r9, ip, r0        @ Zero out shadow regs
   6163     fldd    d1, [r3]                    @ d1<- vB
   6164     VREG_INDEX_TO_ADDR r9, r9           @ r9<- &vA
   6165     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   6166     fldd    d0, [r9]                    @ d0<- vA
   6167     fdivd   d2, d0, d1                              @ d2<- op
   6168     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6169     fstd    d2, [r9]                    @ vAA<- d2
   6170     GOTO_OPCODE ip                      @ jump to next instruction
   6171 
   6172 
   6173 /* ------------------------------ */
   6174     .balign 128
   6175 .L_op_rem_double_2addr: /* 0xcf */
   6176 /* File: arm/op_rem_double_2addr.S */
   6177 /* EABI doesn't define a double remainder function, but libm does */
   6178 /* File: arm/binopWide2addr.S */
   6179     /*
   6180      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   6181      * that specifies an instruction that performs "result = r0-r1 op r2-r3".
   6182      * This could be an ARM instruction or a function call.  (If the result
   6183      * comes back in a register other than r0, you can override "result".)
   6184      *
   6185      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6186      * vCC (r1).  Useful for integer division and modulus.
   6187      *
   6188      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   6189      *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
   6190      *      sub-double/2addr, mul-double/2addr, div-double/2addr,
   6191      *      rem-double/2addr
   6192      */
   6193     /* binop/2addr vA, vB */
   6194     mov     r1, rINST, lsr #12          @ r1<- B
   6195     ubfx    rINST, rINST, #8, #4        @ rINST<- A
   6196     VREG_INDEX_TO_ADDR r1, r1           @ r1<- &fp[B]
   6197     VREG_INDEX_TO_ADDR r9, rINST        @ r9<- &fp[A]
   6198     ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
   6199     ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
   6200     .if 0
   6201     orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
   6202     beq     common_errDivideByZero
   6203     .endif
   6204     CLEAR_SHADOW_PAIR rINST, ip, lr     @ Zero shadow regs
   6205     FETCH_ADVANCE_INST 1                @ advance rPC, load rINST
   6206                                @ optional op; may set condition codes
   6207     bl      fmod                              @ result<- op, r0-r3 changed
   6208     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6209     stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
   6210     GOTO_OPCODE ip                      @ jump to next instruction
   6211     /* 12-15 instructions */
   6212 
   6213 
   6214 /* ------------------------------ */
   6215     .balign 128
   6216 .L_op_add_int_lit16: /* 0xd0 */
   6217 /* File: arm/op_add_int_lit16.S */
   6218 /* File: arm/binopLit16.S */
   6219     /*
   6220      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   6221      * that specifies an instruction that performs "result = r0 op r1".
   6222      * This could be an ARM instruction or a function call.  (If the result
   6223      * comes back in a register other than r0, you can override "result".)
   6224      *
   6225      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6226      * vCC (r1).  Useful for integer division and modulus.
   6227      *
   6228      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   6229      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   6230      */
   6231     /* binop/lit16 vA, vB, #+CCCC */
   6232     FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
   6233     mov     r2, rINST, lsr #12          @ r2<- B
   6234     ubfx    r9, rINST, #8, #4           @ r9<- A
   6235     GET_VREG r0, r2                     @ r0<- vB
   6236     .if 0
   6237     cmp     r1, #0                      @ is second operand zero?
   6238     beq     common_errDivideByZero
   6239     .endif
   6240     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6241 
   6242     add     r0, r0, r1                              @ r0<- op, r0-r3 changed
   6243     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6244     SET_VREG r0, r9                @ vAA<- r0
   6245     GOTO_OPCODE ip                      @ jump to next instruction
   6246     /* 10-13 instructions */
   6247 
   6248 
   6249 /* ------------------------------ */
   6250     .balign 128
   6251 .L_op_rsub_int: /* 0xd1 */
   6252 /* File: arm/op_rsub_int.S */
   6253 /* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
   6254 /* File: arm/binopLit16.S */
   6255     /*
   6256      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   6257      * that specifies an instruction that performs "result = r0 op r1".
   6258      * This could be an ARM instruction or a function call.  (If the result
   6259      * comes back in a register other than r0, you can override "result".)
   6260      *
   6261      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6262      * vCC (r1).  Useful for integer division and modulus.
   6263      *
   6264      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   6265      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   6266      */
   6267     /* binop/lit16 vA, vB, #+CCCC */
   6268     FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
   6269     mov     r2, rINST, lsr #12          @ r2<- B
   6270     ubfx    r9, rINST, #8, #4           @ r9<- A
   6271     GET_VREG r0, r2                     @ r0<- vB
   6272     .if 0
   6273     cmp     r1, #0                      @ is second operand zero?
   6274     beq     common_errDivideByZero
   6275     .endif
   6276     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6277 
   6278     rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
   6279     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6280     SET_VREG r0, r9                @ vAA<- r0
   6281     GOTO_OPCODE ip                      @ jump to next instruction
   6282     /* 10-13 instructions */
   6283 
   6284 
   6285 /* ------------------------------ */
   6286     .balign 128
   6287 .L_op_mul_int_lit16: /* 0xd2 */
   6288 /* File: arm/op_mul_int_lit16.S */
   6289 /* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
   6290 /* File: arm/binopLit16.S */
   6291     /*
   6292      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   6293      * that specifies an instruction that performs "result = r0 op r1".
   6294      * This could be an ARM instruction or a function call.  (If the result
   6295      * comes back in a register other than r0, you can override "result".)
   6296      *
   6297      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6298      * vCC (r1).  Useful for integer division and modulus.
   6299      *
   6300      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   6301      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   6302      */
   6303     /* binop/lit16 vA, vB, #+CCCC */
   6304     FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
   6305     mov     r2, rINST, lsr #12          @ r2<- B
   6306     ubfx    r9, rINST, #8, #4           @ r9<- A
   6307     GET_VREG r0, r2                     @ r0<- vB
   6308     .if 0
   6309     cmp     r1, #0                      @ is second operand zero?
   6310     beq     common_errDivideByZero
   6311     .endif
   6312     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6313 
   6314     mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
   6315     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6316     SET_VREG r0, r9                @ vAA<- r0
   6317     GOTO_OPCODE ip                      @ jump to next instruction
   6318     /* 10-13 instructions */
   6319 
   6320 
   6321 /* ------------------------------ */
   6322     .balign 128
   6323 .L_op_div_int_lit16: /* 0xd3 */
   6324 /* File: arm/op_div_int_lit16.S */
   6325     /*
   6326      * Specialized 32-bit binary operation
   6327      *
   6328      * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
   6329      * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
   6330      * ARMv7 CPUs that have hardware division support).
   6331      *
   6332      * div-int/lit16
   6333      *
   6334      */
   6335     FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
   6336     mov     r2, rINST, lsr #12          @ r2<- B
   6337     ubfx    r9, rINST, #8, #4           @ r9<- A
   6338     GET_VREG r0, r2                     @ r0<- vB
   6339     cmp     r1, #0                      @ is second operand zero?
   6340     beq     common_errDivideByZero
   6341     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6342 
   6343 #ifdef __ARM_ARCH_EXT_IDIV__
   6344     sdiv    r0, r0, r1                  @ r0<- op
   6345 #else
   6346     bl       __aeabi_idiv               @ r0<- op, r0-r3 changed
   6347 #endif
   6348     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6349     SET_VREG r0, r9                     @ vAA<- r0
   6350     GOTO_OPCODE ip                      @ jump to next instruction
   6351     /* 10-13 instructions */
   6352 
   6353 /* ------------------------------ */
   6354     .balign 128
   6355 .L_op_rem_int_lit16: /* 0xd4 */
   6356 /* File: arm/op_rem_int_lit16.S */
   6357     /*
   6358      * Specialized 32-bit binary operation
   6359      *
   6360      * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
   6361      * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
   6362      * ARMv7 CPUs that have hardware division support).
   6363      *
   6364      * NOTE: idivmod returns quotient in r0 and remainder in r1
   6365      *
   6366      * rem-int/lit16
   6367      *
   6368      */
   6369     FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
   6370     mov     r2, rINST, lsr #12          @ r2<- B
   6371     ubfx    r9, rINST, #8, #4           @ r9<- A
   6372     GET_VREG r0, r2                     @ r0<- vB
   6373     cmp     r1, #0                      @ is second operand zero?
   6374     beq     common_errDivideByZero
   6375     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6376 
   6377 #ifdef __ARM_ARCH_EXT_IDIV__
   6378     sdiv    r2, r0, r1
   6379     mls     r1, r1, r2, r0              @ r1<- op
   6380 #else
   6381     bl     __aeabi_idivmod              @ r1<- op, r0-r3 changed
   6382 #endif
   6383     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6384     SET_VREG r1, r9                     @ vAA<- r1
   6385     GOTO_OPCODE ip                      @ jump to next instruction
   6386     /* 10-13 instructions */
   6387 
   6388 /* ------------------------------ */
   6389     .balign 128
   6390 .L_op_and_int_lit16: /* 0xd5 */
   6391 /* File: arm/op_and_int_lit16.S */
   6392 /* File: arm/binopLit16.S */
   6393     /*
   6394      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   6395      * that specifies an instruction that performs "result = r0 op r1".
   6396      * This could be an ARM instruction or a function call.  (If the result
   6397      * comes back in a register other than r0, you can override "result".)
   6398      *
   6399      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6400      * vCC (r1).  Useful for integer division and modulus.
   6401      *
   6402      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   6403      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   6404      */
   6405     /* binop/lit16 vA, vB, #+CCCC */
   6406     FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
   6407     mov     r2, rINST, lsr #12          @ r2<- B
   6408     ubfx    r9, rINST, #8, #4           @ r9<- A
   6409     GET_VREG r0, r2                     @ r0<- vB
   6410     .if 0
   6411     cmp     r1, #0                      @ is second operand zero?
   6412     beq     common_errDivideByZero
   6413     .endif
   6414     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6415 
   6416     and     r0, r0, r1                              @ r0<- op, r0-r3 changed
   6417     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6418     SET_VREG r0, r9                @ vAA<- r0
   6419     GOTO_OPCODE ip                      @ jump to next instruction
   6420     /* 10-13 instructions */
   6421 
   6422 
   6423 /* ------------------------------ */
   6424     .balign 128
   6425 .L_op_or_int_lit16: /* 0xd6 */
   6426 /* File: arm/op_or_int_lit16.S */
   6427 /* File: arm/binopLit16.S */
   6428     /*
   6429      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   6430      * that specifies an instruction that performs "result = r0 op r1".
   6431      * This could be an ARM instruction or a function call.  (If the result
   6432      * comes back in a register other than r0, you can override "result".)
   6433      *
   6434      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6435      * vCC (r1).  Useful for integer division and modulus.
   6436      *
   6437      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   6438      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   6439      */
   6440     /* binop/lit16 vA, vB, #+CCCC */
   6441     FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
   6442     mov     r2, rINST, lsr #12          @ r2<- B
   6443     ubfx    r9, rINST, #8, #4           @ r9<- A
   6444     GET_VREG r0, r2                     @ r0<- vB
   6445     .if 0
   6446     cmp     r1, #0                      @ is second operand zero?
   6447     beq     common_errDivideByZero
   6448     .endif
   6449     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6450 
   6451     orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
   6452     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6453     SET_VREG r0, r9                @ vAA<- r0
   6454     GOTO_OPCODE ip                      @ jump to next instruction
   6455     /* 10-13 instructions */
   6456 
   6457 
   6458 /* ------------------------------ */
   6459     .balign 128
   6460 .L_op_xor_int_lit16: /* 0xd7 */
   6461 /* File: arm/op_xor_int_lit16.S */
   6462 /* File: arm/binopLit16.S */
   6463     /*
   6464      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   6465      * that specifies an instruction that performs "result = r0 op r1".
   6466      * This could be an ARM instruction or a function call.  (If the result
   6467      * comes back in a register other than r0, you can override "result".)
   6468      *
   6469      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6470      * vCC (r1).  Useful for integer division and modulus.
   6471      *
   6472      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   6473      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   6474      */
   6475     /* binop/lit16 vA, vB, #+CCCC */
   6476     FETCH_S r1, 1                       @ r1<- ssssCCCC (sign-extended)
   6477     mov     r2, rINST, lsr #12          @ r2<- B
   6478     ubfx    r9, rINST, #8, #4           @ r9<- A
   6479     GET_VREG r0, r2                     @ r0<- vB
   6480     .if 0
   6481     cmp     r1, #0                      @ is second operand zero?
   6482     beq     common_errDivideByZero
   6483     .endif
   6484     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6485 
   6486     eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
   6487     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6488     SET_VREG r0, r9                @ vAA<- r0
   6489     GOTO_OPCODE ip                      @ jump to next instruction
   6490     /* 10-13 instructions */
   6491 
   6492 
   6493 /* ------------------------------ */
   6494     .balign 128
   6495 .L_op_add_int_lit8: /* 0xd8 */
   6496 /* File: arm/op_add_int_lit8.S */
   6497 /* File: arm/binopLit8.S */
   6498     /*
   6499      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   6500      * that specifies an instruction that performs "result = r0 op r1".
   6501      * This could be an ARM instruction or a function call.  (If the result
   6502      * comes back in a register other than r0, you can override "result".)
   6503      *
   6504      * You can override "extract" if the extraction of the literal value
   6505      * from r3 to r1 is not the default "asr r1, r3, #8". The extraction
   6506      * can be omitted completely if the shift is embedded in "instr".
   6507      *
   6508      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6509      * vCC (r1).  Useful for integer division and modulus.
   6510      *
   6511      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   6512      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   6513      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   6514      */
   6515     /* binop/lit8 vAA, vBB, #+CC */
   6516     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
   6517     mov     r9, rINST, lsr #8           @ r9<- AA
   6518     and     r2, r3, #255                @ r2<- BB
   6519     GET_VREG r0, r2                     @ r0<- vBB
   6520                                 @ optional; typically r1<- ssssssCC (sign extended)
   6521     .if 0
   6522     @cmp     r1, #0                     @ is second operand zero?
   6523     beq     common_errDivideByZero
   6524     .endif
   6525     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6526 
   6527     add     r0, r0, r3, asr #8                              @ r0<- op, r0-r3 changed
   6528     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6529     SET_VREG r0, r9                @ vAA<- r0
   6530     GOTO_OPCODE ip                      @ jump to next instruction
   6531     /* 10-12 instructions */
   6532 
   6533 
   6534 /* ------------------------------ */
   6535     .balign 128
   6536 .L_op_rsub_int_lit8: /* 0xd9 */
   6537 /* File: arm/op_rsub_int_lit8.S */
   6538 /* File: arm/binopLit8.S */
   6539     /*
   6540      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   6541      * that specifies an instruction that performs "result = r0 op r1".
   6542      * This could be an ARM instruction or a function call.  (If the result
   6543      * comes back in a register other than r0, you can override "result".)
   6544      *
   6545      * You can override "extract" if the extraction of the literal value
   6546      * from r3 to r1 is not the default "asr r1, r3, #8". The extraction
   6547      * can be omitted completely if the shift is embedded in "instr".
   6548      *
   6549      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6550      * vCC (r1).  Useful for integer division and modulus.
   6551      *
   6552      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   6553      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   6554      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   6555      */
   6556     /* binop/lit8 vAA, vBB, #+CC */
   6557     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
   6558     mov     r9, rINST, lsr #8           @ r9<- AA
   6559     and     r2, r3, #255                @ r2<- BB
   6560     GET_VREG r0, r2                     @ r0<- vBB
   6561                                 @ optional; typically r1<- ssssssCC (sign extended)
   6562     .if 0
   6563     @cmp     r1, #0                     @ is second operand zero?
   6564     beq     common_errDivideByZero
   6565     .endif
   6566     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6567 
   6568     rsb     r0, r0, r3, asr #8                              @ r0<- op, r0-r3 changed
   6569     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6570     SET_VREG r0, r9                @ vAA<- r0
   6571     GOTO_OPCODE ip                      @ jump to next instruction
   6572     /* 10-12 instructions */
   6573 
   6574 
   6575 /* ------------------------------ */
   6576     .balign 128
   6577 .L_op_mul_int_lit8: /* 0xda */
   6578 /* File: arm/op_mul_int_lit8.S */
   6579 /* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
   6580 /* File: arm/binopLit8.S */
   6581     /*
   6582      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   6583      * that specifies an instruction that performs "result = r0 op r1".
   6584      * This could be an ARM instruction or a function call.  (If the result
   6585      * comes back in a register other than r0, you can override "result".)
   6586      *
   6587      * You can override "extract" if the extraction of the literal value
   6588      * from r3 to r1 is not the default "asr r1, r3, #8". The extraction
   6589      * can be omitted completely if the shift is embedded in "instr".
   6590      *
   6591      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6592      * vCC (r1).  Useful for integer division and modulus.
   6593      *
   6594      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   6595      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   6596      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   6597      */
   6598     /* binop/lit8 vAA, vBB, #+CC */
   6599     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
   6600     mov     r9, rINST, lsr #8           @ r9<- AA
   6601     and     r2, r3, #255                @ r2<- BB
   6602     GET_VREG r0, r2                     @ r0<- vBB
   6603     asr     r1, r3, #8                            @ optional; typically r1<- ssssssCC (sign extended)
   6604     .if 0
   6605     @cmp     r1, #0                     @ is second operand zero?
   6606     beq     common_errDivideByZero
   6607     .endif
   6608     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6609 
   6610     mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
   6611     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6612     SET_VREG r0, r9                @ vAA<- r0
   6613     GOTO_OPCODE ip                      @ jump to next instruction
   6614     /* 10-12 instructions */
   6615 
   6616 
   6617 /* ------------------------------ */
   6618     .balign 128
   6619 .L_op_div_int_lit8: /* 0xdb */
   6620 /* File: arm/op_div_int_lit8.S */
   6621     /*
   6622      * Specialized 32-bit binary operation
   6623      *
   6624      * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
   6625      * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
   6626      * ARMv7 CPUs that have hardware division support).
   6627      *
   6628      * div-int/lit8
   6629      *
   6630      */
   6631     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC
   6632     mov     r9, rINST, lsr #8           @ r9<- AA
   6633     and     r2, r3, #255                @ r2<- BB
   6634     GET_VREG r0, r2                     @ r0<- vBB
   6635     movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
   6636     @cmp     r1, #0                     @ is second operand zero?
   6637     beq     common_errDivideByZero
   6638     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6639 
   6640 #ifdef __ARM_ARCH_EXT_IDIV__
   6641     sdiv    r0, r0, r1                  @ r0<- op
   6642 #else
   6643     bl   __aeabi_idiv                   @ r0<- op, r0-r3 changed
   6644 #endif
   6645     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6646     SET_VREG r0, r9                     @ vAA<- r0
   6647     GOTO_OPCODE ip                      @ jump to next instruction
   6648     /* 10-12 instructions */
   6649 
   6650 /* ------------------------------ */
   6651     .balign 128
   6652 .L_op_rem_int_lit8: /* 0xdc */
   6653 /* File: arm/op_rem_int_lit8.S */
   6654     /*
   6655      * Specialized 32-bit binary operation
   6656      *
   6657      * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
   6658      * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
   6659      * ARMv7 CPUs that have hardware division support).
   6660      *
   6661      * NOTE: idivmod returns quotient in r0 and remainder in r1
   6662      *
   6663      * rem-int/lit8
   6664      *
   6665      */
   6666     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
   6667     mov     r9, rINST, lsr #8           @ r9<- AA
   6668     and     r2, r3, #255                @ r2<- BB
   6669     GET_VREG r0, r2                     @ r0<- vBB
   6670     movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
   6671     @cmp     r1, #0                     @ is second operand zero?
   6672     beq     common_errDivideByZero
   6673     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6674 
   6675 #ifdef __ARM_ARCH_EXT_IDIV__
   6676     sdiv    r2, r0, r1
   6677     mls     r1, r1, r2, r0              @ r1<- op
   6678 #else
   6679     bl       __aeabi_idivmod            @ r1<- op, r0-r3 changed
   6680 #endif
   6681     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6682     SET_VREG r1, r9                     @ vAA<- r1
   6683     GOTO_OPCODE ip                      @ jump to next instruction
   6684     /* 10-12 instructions */
   6685 
   6686 /* ------------------------------ */
   6687     .balign 128
   6688 .L_op_and_int_lit8: /* 0xdd */
   6689 /* File: arm/op_and_int_lit8.S */
   6690 /* File: arm/binopLit8.S */
   6691     /*
   6692      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   6693      * that specifies an instruction that performs "result = r0 op r1".
   6694      * This could be an ARM instruction or a function call.  (If the result
   6695      * comes back in a register other than r0, you can override "result".)
   6696      *
   6697      * You can override "extract" if the extraction of the literal value
   6698      * from r3 to r1 is not the default "asr r1, r3, #8". The extraction
   6699      * can be omitted completely if the shift is embedded in "instr".
   6700      *
   6701      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6702      * vCC (r1).  Useful for integer division and modulus.
   6703      *
   6704      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   6705      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   6706      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   6707      */
   6708     /* binop/lit8 vAA, vBB, #+CC */
   6709     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
   6710     mov     r9, rINST, lsr #8           @ r9<- AA
   6711     and     r2, r3, #255                @ r2<- BB
   6712     GET_VREG r0, r2                     @ r0<- vBB
   6713                                 @ optional; typically r1<- ssssssCC (sign extended)
   6714     .if 0
   6715     @cmp     r1, #0                     @ is second operand zero?
   6716     beq     common_errDivideByZero
   6717     .endif
   6718     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6719 
   6720     and     r0, r0, r3, asr #8                              @ r0<- op, r0-r3 changed
   6721     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6722     SET_VREG r0, r9                @ vAA<- r0
   6723     GOTO_OPCODE ip                      @ jump to next instruction
   6724     /* 10-12 instructions */
   6725 
   6726 
   6727 /* ------------------------------ */
   6728     .balign 128
   6729 .L_op_or_int_lit8: /* 0xde */
   6730 /* File: arm/op_or_int_lit8.S */
   6731 /* File: arm/binopLit8.S */
   6732     /*
   6733      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   6734      * that specifies an instruction that performs "result = r0 op r1".
   6735      * This could be an ARM instruction or a function call.  (If the result
   6736      * comes back in a register other than r0, you can override "result".)
   6737      *
   6738      * You can override "extract" if the extraction of the literal value
   6739      * from r3 to r1 is not the default "asr r1, r3, #8". The extraction
   6740      * can be omitted completely if the shift is embedded in "instr".
   6741      *
   6742      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6743      * vCC (r1).  Useful for integer division and modulus.
   6744      *
   6745      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   6746      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   6747      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   6748      */
   6749     /* binop/lit8 vAA, vBB, #+CC */
   6750     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
   6751     mov     r9, rINST, lsr #8           @ r9<- AA
   6752     and     r2, r3, #255                @ r2<- BB
   6753     GET_VREG r0, r2                     @ r0<- vBB
   6754                                 @ optional; typically r1<- ssssssCC (sign extended)
   6755     .if 0
   6756     @cmp     r1, #0                     @ is second operand zero?
   6757     beq     common_errDivideByZero
   6758     .endif
   6759     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6760 
   6761     orr     r0, r0, r3, asr #8                              @ r0<- op, r0-r3 changed
   6762     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6763     SET_VREG r0, r9                @ vAA<- r0
   6764     GOTO_OPCODE ip                      @ jump to next instruction
   6765     /* 10-12 instructions */
   6766 
   6767 
   6768 /* ------------------------------ */
   6769     .balign 128
   6770 .L_op_xor_int_lit8: /* 0xdf */
   6771 /* File: arm/op_xor_int_lit8.S */
   6772 /* File: arm/binopLit8.S */
   6773     /*
   6774      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   6775      * that specifies an instruction that performs "result = r0 op r1".
   6776      * This could be an ARM instruction or a function call.  (If the result
   6777      * comes back in a register other than r0, you can override "result".)
   6778      *
   6779      * You can override "extract" if the extraction of the literal value
   6780      * from r3 to r1 is not the default "asr r1, r3, #8". The extraction
   6781      * can be omitted completely if the shift is embedded in "instr".
   6782      *
   6783      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6784      * vCC (r1).  Useful for integer division and modulus.
   6785      *
   6786      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   6787      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   6788      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   6789      */
   6790     /* binop/lit8 vAA, vBB, #+CC */
   6791     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
   6792     mov     r9, rINST, lsr #8           @ r9<- AA
   6793     and     r2, r3, #255                @ r2<- BB
   6794     GET_VREG r0, r2                     @ r0<- vBB
   6795                                 @ optional; typically r1<- ssssssCC (sign extended)
   6796     .if 0
   6797     @cmp     r1, #0                     @ is second operand zero?
   6798     beq     common_errDivideByZero
   6799     .endif
   6800     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6801 
   6802     eor     r0, r0, r3, asr #8                              @ r0<- op, r0-r3 changed
   6803     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6804     SET_VREG r0, r9                @ vAA<- r0
   6805     GOTO_OPCODE ip                      @ jump to next instruction
   6806     /* 10-12 instructions */
   6807 
   6808 
   6809 /* ------------------------------ */
   6810     .balign 128
   6811 .L_op_shl_int_lit8: /* 0xe0 */
   6812 /* File: arm/op_shl_int_lit8.S */
   6813 /* File: arm/binopLit8.S */
   6814     /*
   6815      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   6816      * that specifies an instruction that performs "result = r0 op r1".
   6817      * This could be an ARM instruction or a function call.  (If the result
   6818      * comes back in a register other than r0, you can override "result".)
   6819      *
   6820      * You can override "extract" if the extraction of the literal value
   6821      * from r3 to r1 is not the default "asr r1, r3, #8". The extraction
   6822      * can be omitted completely if the shift is embedded in "instr".
   6823      *
   6824      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6825      * vCC (r1).  Useful for integer division and modulus.
   6826      *
   6827      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   6828      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   6829      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   6830      */
   6831     /* binop/lit8 vAA, vBB, #+CC */
   6832     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
   6833     mov     r9, rINST, lsr #8           @ r9<- AA
   6834     and     r2, r3, #255                @ r2<- BB
   6835     GET_VREG r0, r2                     @ r0<- vBB
   6836     ubfx    r1, r3, #8, #5                            @ optional; typically r1<- ssssssCC (sign extended)
   6837     .if 0
   6838     @cmp     r1, #0                     @ is second operand zero?
   6839     beq     common_errDivideByZero
   6840     .endif
   6841     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6842 
   6843     mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
   6844     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6845     SET_VREG r0, r9                @ vAA<- r0
   6846     GOTO_OPCODE ip                      @ jump to next instruction
   6847     /* 10-12 instructions */
   6848 
   6849 
   6850 /* ------------------------------ */
   6851     .balign 128
   6852 .L_op_shr_int_lit8: /* 0xe1 */
   6853 /* File: arm/op_shr_int_lit8.S */
   6854 /* File: arm/binopLit8.S */
   6855     /*
   6856      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   6857      * that specifies an instruction that performs "result = r0 op r1".
   6858      * This could be an ARM instruction or a function call.  (If the result
   6859      * comes back in a register other than r0, you can override "result".)
   6860      *
   6861      * You can override "extract" if the extraction of the literal value
   6862      * from r3 to r1 is not the default "asr r1, r3, #8". The extraction
   6863      * can be omitted completely if the shift is embedded in "instr".
   6864      *
   6865      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6866      * vCC (r1).  Useful for integer division and modulus.
   6867      *
   6868      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   6869      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   6870      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   6871      */
   6872     /* binop/lit8 vAA, vBB, #+CC */
   6873     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
   6874     mov     r9, rINST, lsr #8           @ r9<- AA
   6875     and     r2, r3, #255                @ r2<- BB
   6876     GET_VREG r0, r2                     @ r0<- vBB
   6877     ubfx    r1, r3, #8, #5                            @ optional; typically r1<- ssssssCC (sign extended)
   6878     .if 0
   6879     @cmp     r1, #0                     @ is second operand zero?
   6880     beq     common_errDivideByZero
   6881     .endif
   6882     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6883 
   6884     mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
   6885     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6886     SET_VREG r0, r9                @ vAA<- r0
   6887     GOTO_OPCODE ip                      @ jump to next instruction
   6888     /* 10-12 instructions */
   6889 
   6890 
   6891 /* ------------------------------ */
   6892     .balign 128
   6893 .L_op_ushr_int_lit8: /* 0xe2 */
   6894 /* File: arm/op_ushr_int_lit8.S */
   6895 /* File: arm/binopLit8.S */
   6896     /*
   6897      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   6898      * that specifies an instruction that performs "result = r0 op r1".
   6899      * This could be an ARM instruction or a function call.  (If the result
   6900      * comes back in a register other than r0, you can override "result".)
   6901      *
   6902      * You can override "extract" if the extraction of the literal value
   6903      * from r3 to r1 is not the default "asr r1, r3, #8". The extraction
   6904      * can be omitted completely if the shift is embedded in "instr".
   6905      *
   6906      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6907      * vCC (r1).  Useful for integer division and modulus.
   6908      *
   6909      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   6910      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   6911      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   6912      */
   6913     /* binop/lit8 vAA, vBB, #+CC */
   6914     FETCH_S r3, 1                       @ r3<- ssssCCBB (sign-extended for CC)
   6915     mov     r9, rINST, lsr #8           @ r9<- AA
   6916     and     r2, r3, #255                @ r2<- BB
   6917     GET_VREG r0, r2                     @ r0<- vBB
   6918     ubfx    r1, r3, #8, #5                            @ optional; typically r1<- ssssssCC (sign extended)
   6919     .if 0
   6920     @cmp     r1, #0                     @ is second operand zero?
   6921     beq     common_errDivideByZero
   6922     .endif
   6923     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6924 
   6925     mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
   6926     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6927     SET_VREG r0, r9                @ vAA<- r0
   6928     GOTO_OPCODE ip                      @ jump to next instruction
   6929     /* 10-12 instructions */
   6930 
   6931 
   6932 /* ------------------------------ */
   6933     .balign 128
   6934 .L_op_iget_quick: /* 0xe3 */
   6935 /* File: arm/op_iget_quick.S */
   6936     /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
   6937     /* op vA, vB, offset@CCCC */
   6938     mov     r2, rINST, lsr #12          @ r2<- B
   6939     FETCH r1, 1                         @ r1<- field byte offset
   6940     GET_VREG r3, r2                     @ r3<- object we're operating on
   6941     ubfx    r2, rINST, #8, #4           @ r2<- A
   6942     cmp     r3, #0                      @ check object for null
   6943     beq     common_errNullObject        @ object was null
   6944     ldr   r0, [r3, r1]                @ r0<- obj.field
   6945     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6946     SET_VREG r0, r2                     @ fp[A]<- r0
   6947     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6948     GOTO_OPCODE ip                      @ jump to next instruction
   6949 
   6950 /* ------------------------------ */
   6951     .balign 128
   6952 .L_op_iget_wide_quick: /* 0xe4 */
   6953 /* File: arm/op_iget_wide_quick.S */
   6954     /* iget-wide-quick vA, vB, offset@CCCC */
   6955     mov     r2, rINST, lsr #12          @ r2<- B
   6956     FETCH ip, 1                         @ ip<- field byte offset
   6957     GET_VREG r3, r2                     @ r3<- object we're operating on
   6958     ubfx    r2, rINST, #8, #4           @ r2<- A
   6959     cmp     r3, #0                      @ check object for null
   6960     beq     common_errNullObject        @ object was null
   6961     ldrd    r0, [r3, ip]                @ r0<- obj.field (64 bits, aligned)
   6962     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   6963     VREG_INDEX_TO_ADDR r3, r2           @ r3<- &fp[A]
   6964     CLEAR_SHADOW_PAIR r2, ip, lr        @ Zero out the shadow regs
   6965     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6966     stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
   6967     GOTO_OPCODE ip                      @ jump to next instruction
   6968 
   6969 /* ------------------------------ */
   6970     .balign 128
   6971 .L_op_iget_object_quick: /* 0xe5 */
   6972 /* File: arm/op_iget_object_quick.S */
   6973     /* For: iget-object-quick */
   6974     /* op vA, vB, offset@CCCC */
   6975     mov     r2, rINST, lsr #12          @ r2<- B
   6976     FETCH r1, 1                         @ r1<- field byte offset
   6977     EXPORT_PC
   6978     GET_VREG r0, r2                     @ r0<- object we're operating on
   6979     bl      artIGetObjectFromMterp      @ (obj, offset)
   6980     ldr     r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
   6981     ubfx    r2, rINST, #8, #4           @ r2<- A
   6982     PREFETCH_INST 2
   6983     cmp     r3, #0
   6984     bne     MterpPossibleException      @ bail out
   6985     SET_VREG_OBJECT r0, r2              @ fp[A]<- r0
   6986     ADVANCE 2                           @ advance rPC
   6987     GET_INST_OPCODE ip                  @ extract opcode from rINST
   6988     GOTO_OPCODE ip                      @ jump to next instruction
   6989 
   6990 /* ------------------------------ */
   6991     .balign 128
   6992 .L_op_iput_quick: /* 0xe6 */
   6993 /* File: arm/op_iput_quick.S */
   6994     /* For: iput-quick, iput-object-quick */
   6995     /* op vA, vB, offset@CCCC */
   6996     mov     r2, rINST, lsr #12          @ r2<- B
   6997     FETCH r1, 1                         @ r1<- field byte offset
   6998     GET_VREG r3, r2                     @ r3<- fp[B], the object pointer
   6999     ubfx    r2, rINST, #8, #4           @ r2<- A
   7000     cmp     r3, #0                      @ check object for null
   7001     beq     common_errNullObject        @ object was null
   7002     GET_VREG r0, r2                     @ r0<- fp[A]
   7003     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7004     str     r0, [r3, r1]             @ obj.field<- r0
   7005     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7006     GOTO_OPCODE ip                      @ jump to next instruction
   7007 
   7008 /* ------------------------------ */
   7009     .balign 128
   7010 .L_op_iput_wide_quick: /* 0xe7 */
   7011 /* File: arm/op_iput_wide_quick.S */
   7012     /* iput-wide-quick vA, vB, offset@CCCC */
   7013     mov     r2, rINST, lsr #12          @ r2<- B
   7014     FETCH r3, 1                         @ r3<- field byte offset
   7015     GET_VREG r2, r2                     @ r2<- fp[B], the object pointer
   7016     ubfx    r0, rINST, #8, #4           @ r0<- A
   7017     cmp     r2, #0                      @ check object for null
   7018     beq     common_errNullObject        @ object was null
   7019     VREG_INDEX_TO_ADDR r0, r0           @ r0<- &fp[A]
   7020     ldmia   r0, {r0-r1}                 @ r0/r1<- fp[A]/fp[A+1]
   7021     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7022     strd    r0, [r2, r3]                @ obj.field<- r0/r1
   7023     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7024     GOTO_OPCODE ip                      @ jump to next instruction
   7025 
   7026 /* ------------------------------ */
   7027     .balign 128
   7028 .L_op_iput_object_quick: /* 0xe8 */
   7029 /* File: arm/op_iput_object_quick.S */
   7030     EXPORT_PC
   7031     add     r0, rFP, #OFF_FP_SHADOWFRAME
   7032     mov     r1, rPC
   7033     mov     r2, rINST
   7034     bl      MterpIputObjectQuick
   7035     cmp     r0, #0
   7036     beq     MterpException
   7037     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7038     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7039     GOTO_OPCODE ip                      @ jump to next instruction
   7040 
   7041 /* ------------------------------ */
   7042     .balign 128
   7043 .L_op_invoke_virtual_quick: /* 0xe9 */
   7044 /* File: arm/op_invoke_virtual_quick.S */
   7045 /* File: arm/invoke.S */
   7046     /*
   7047      * Generic invoke handler wrapper.
   7048      */
   7049     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   7050     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   7051     .extern MterpInvokeVirtualQuick
   7052     EXPORT_PC
   7053     mov     r0, rSELF
   7054     add     r1, rFP, #OFF_FP_SHADOWFRAME
   7055     mov     r2, rPC
   7056     mov     r3, rINST
   7057     bl      MterpInvokeVirtualQuick
   7058     cmp     r0, #0
   7059     beq     MterpException
   7060     FETCH_ADVANCE_INST 3
   7061     bl      MterpShouldSwitchInterpreters
   7062     cmp     r0, #0
   7063     bne     MterpFallback
   7064     GET_INST_OPCODE ip
   7065     GOTO_OPCODE ip
   7066 
   7067 
   7068 
   7069 /* ------------------------------ */
   7070     .balign 128
   7071 .L_op_invoke_virtual_range_quick: /* 0xea */
   7072 /* File: arm/op_invoke_virtual_range_quick.S */
   7073 /* File: arm/invoke.S */
   7074     /*
   7075      * Generic invoke handler wrapper.
   7076      */
   7077     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   7078     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   7079     .extern MterpInvokeVirtualQuickRange
   7080     EXPORT_PC
   7081     mov     r0, rSELF
   7082     add     r1, rFP, #OFF_FP_SHADOWFRAME
   7083     mov     r2, rPC
   7084     mov     r3, rINST
   7085     bl      MterpInvokeVirtualQuickRange
   7086     cmp     r0, #0
   7087     beq     MterpException
   7088     FETCH_ADVANCE_INST 3
   7089     bl      MterpShouldSwitchInterpreters
   7090     cmp     r0, #0
   7091     bne     MterpFallback
   7092     GET_INST_OPCODE ip
   7093     GOTO_OPCODE ip
   7094 
   7095 
   7096 
   7097 /* ------------------------------ */
   7098     .balign 128
   7099 .L_op_iput_boolean_quick: /* 0xeb */
   7100 /* File: arm/op_iput_boolean_quick.S */
   7101 /* File: arm/op_iput_quick.S */
   7102     /* For: iput-quick, iput-object-quick */
   7103     /* op vA, vB, offset@CCCC */
   7104     mov     r2, rINST, lsr #12          @ r2<- B
   7105     FETCH r1, 1                         @ r1<- field byte offset
   7106     GET_VREG r3, r2                     @ r3<- fp[B], the object pointer
   7107     ubfx    r2, rINST, #8, #4           @ r2<- A
   7108     cmp     r3, #0                      @ check object for null
   7109     beq     common_errNullObject        @ object was null
   7110     GET_VREG r0, r2                     @ r0<- fp[A]
   7111     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7112     strb     r0, [r3, r1]             @ obj.field<- r0
   7113     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7114     GOTO_OPCODE ip                      @ jump to next instruction
   7115 
   7116 
   7117 /* ------------------------------ */
   7118     .balign 128
   7119 .L_op_iput_byte_quick: /* 0xec */
   7120 /* File: arm/op_iput_byte_quick.S */
   7121 /* File: arm/op_iput_quick.S */
   7122     /* For: iput-quick, iput-object-quick */
   7123     /* op vA, vB, offset@CCCC */
   7124     mov     r2, rINST, lsr #12          @ r2<- B
   7125     FETCH r1, 1                         @ r1<- field byte offset
   7126     GET_VREG r3, r2                     @ r3<- fp[B], the object pointer
   7127     ubfx    r2, rINST, #8, #4           @ r2<- A
   7128     cmp     r3, #0                      @ check object for null
   7129     beq     common_errNullObject        @ object was null
   7130     GET_VREG r0, r2                     @ r0<- fp[A]
   7131     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7132     strb     r0, [r3, r1]             @ obj.field<- r0
   7133     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7134     GOTO_OPCODE ip                      @ jump to next instruction
   7135 
   7136 
   7137 /* ------------------------------ */
   7138     .balign 128
   7139 .L_op_iput_char_quick: /* 0xed */
   7140 /* File: arm/op_iput_char_quick.S */
   7141 /* File: arm/op_iput_quick.S */
   7142     /* For: iput-quick, iput-object-quick */
   7143     /* op vA, vB, offset@CCCC */
   7144     mov     r2, rINST, lsr #12          @ r2<- B
   7145     FETCH r1, 1                         @ r1<- field byte offset
   7146     GET_VREG r3, r2                     @ r3<- fp[B], the object pointer
   7147     ubfx    r2, rINST, #8, #4           @ r2<- A
   7148     cmp     r3, #0                      @ check object for null
   7149     beq     common_errNullObject        @ object was null
   7150     GET_VREG r0, r2                     @ r0<- fp[A]
   7151     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7152     strh     r0, [r3, r1]             @ obj.field<- r0
   7153     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7154     GOTO_OPCODE ip                      @ jump to next instruction
   7155 
   7156 
   7157 /* ------------------------------ */
   7158     .balign 128
   7159 .L_op_iput_short_quick: /* 0xee */
   7160 /* File: arm/op_iput_short_quick.S */
   7161 /* File: arm/op_iput_quick.S */
   7162     /* For: iput-quick, iput-object-quick */
   7163     /* op vA, vB, offset@CCCC */
   7164     mov     r2, rINST, lsr #12          @ r2<- B
   7165     FETCH r1, 1                         @ r1<- field byte offset
   7166     GET_VREG r3, r2                     @ r3<- fp[B], the object pointer
   7167     ubfx    r2, rINST, #8, #4           @ r2<- A
   7168     cmp     r3, #0                      @ check object for null
   7169     beq     common_errNullObject        @ object was null
   7170     GET_VREG r0, r2                     @ r0<- fp[A]
   7171     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7172     strh     r0, [r3, r1]             @ obj.field<- r0
   7173     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7174     GOTO_OPCODE ip                      @ jump to next instruction
   7175 
   7176 
   7177 /* ------------------------------ */
   7178     .balign 128
   7179 .L_op_iget_boolean_quick: /* 0xef */
   7180 /* File: arm/op_iget_boolean_quick.S */
   7181 /* File: arm/op_iget_quick.S */
   7182     /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
   7183     /* op vA, vB, offset@CCCC */
   7184     mov     r2, rINST, lsr #12          @ r2<- B
   7185     FETCH r1, 1                         @ r1<- field byte offset
   7186     GET_VREG r3, r2                     @ r3<- object we're operating on
   7187     ubfx    r2, rINST, #8, #4           @ r2<- A
   7188     cmp     r3, #0                      @ check object for null
   7189     beq     common_errNullObject        @ object was null
   7190     ldrb   r0, [r3, r1]                @ r0<- obj.field
   7191     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7192     SET_VREG r0, r2                     @ fp[A]<- r0
   7193     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7194     GOTO_OPCODE ip                      @ jump to next instruction
   7195 
   7196 
   7197 /* ------------------------------ */
   7198     .balign 128
   7199 .L_op_iget_byte_quick: /* 0xf0 */
   7200 /* File: arm/op_iget_byte_quick.S */
   7201 /* File: arm/op_iget_quick.S */
   7202     /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
   7203     /* op vA, vB, offset@CCCC */
   7204     mov     r2, rINST, lsr #12          @ r2<- B
   7205     FETCH r1, 1                         @ r1<- field byte offset
   7206     GET_VREG r3, r2                     @ r3<- object we're operating on
   7207     ubfx    r2, rINST, #8, #4           @ r2<- A
   7208     cmp     r3, #0                      @ check object for null
   7209     beq     common_errNullObject        @ object was null
   7210     ldrsb   r0, [r3, r1]                @ r0<- obj.field
   7211     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7212     SET_VREG r0, r2                     @ fp[A]<- r0
   7213     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7214     GOTO_OPCODE ip                      @ jump to next instruction
   7215 
   7216 
   7217 /* ------------------------------ */
   7218     .balign 128
   7219 .L_op_iget_char_quick: /* 0xf1 */
   7220 /* File: arm/op_iget_char_quick.S */
   7221 /* File: arm/op_iget_quick.S */
   7222     /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
   7223     /* op vA, vB, offset@CCCC */
   7224     mov     r2, rINST, lsr #12          @ r2<- B
   7225     FETCH r1, 1                         @ r1<- field byte offset
   7226     GET_VREG r3, r2                     @ r3<- object we're operating on
   7227     ubfx    r2, rINST, #8, #4           @ r2<- A
   7228     cmp     r3, #0                      @ check object for null
   7229     beq     common_errNullObject        @ object was null
   7230     ldrh   r0, [r3, r1]                @ r0<- obj.field
   7231     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7232     SET_VREG r0, r2                     @ fp[A]<- r0
   7233     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7234     GOTO_OPCODE ip                      @ jump to next instruction
   7235 
   7236 
   7237 /* ------------------------------ */
   7238     .balign 128
   7239 .L_op_iget_short_quick: /* 0xf2 */
   7240 /* File: arm/op_iget_short_quick.S */
   7241 /* File: arm/op_iget_quick.S */
   7242     /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
   7243     /* op vA, vB, offset@CCCC */
   7244     mov     r2, rINST, lsr #12          @ r2<- B
   7245     FETCH r1, 1                         @ r1<- field byte offset
   7246     GET_VREG r3, r2                     @ r3<- object we're operating on
   7247     ubfx    r2, rINST, #8, #4           @ r2<- A
   7248     cmp     r3, #0                      @ check object for null
   7249     beq     common_errNullObject        @ object was null
   7250     ldrsh   r0, [r3, r1]                @ r0<- obj.field
   7251     FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
   7252     SET_VREG r0, r2                     @ fp[A]<- r0
   7253     GET_INST_OPCODE ip                  @ extract opcode from rINST
   7254     GOTO_OPCODE ip                      @ jump to next instruction
   7255 
   7256 
   7257 /* ------------------------------ */
   7258     .balign 128
   7259 .L_op_unused_f3: /* 0xf3 */
   7260 /* File: arm/op_unused_f3.S */
   7261 /* File: arm/unused.S */
   7262 /*
   7263  * Bail to reference interpreter to throw.
   7264  */
   7265   b MterpFallback
   7266 
   7267 
   7268 /* ------------------------------ */
   7269     .balign 128
   7270 .L_op_unused_f4: /* 0xf4 */
   7271 /* File: arm/op_unused_f4.S */
   7272 /* File: arm/unused.S */
   7273 /*
   7274  * Bail to reference interpreter to throw.
   7275  */
   7276   b MterpFallback
   7277 
   7278 
   7279 /* ------------------------------ */
   7280     .balign 128
   7281 .L_op_unused_f5: /* 0xf5 */
   7282 /* File: arm/op_unused_f5.S */
   7283 /* File: arm/unused.S */
   7284 /*
   7285  * Bail to reference interpreter to throw.
   7286  */
   7287   b MterpFallback
   7288 
   7289 
   7290 /* ------------------------------ */
   7291     .balign 128
   7292 .L_op_unused_f6: /* 0xf6 */
   7293 /* File: arm/op_unused_f6.S */
   7294 /* File: arm/unused.S */
   7295 /*
   7296  * Bail to reference interpreter to throw.
   7297  */
   7298   b MterpFallback
   7299 
   7300 
   7301 /* ------------------------------ */
   7302     .balign 128
   7303 .L_op_unused_f7: /* 0xf7 */
   7304 /* File: arm/op_unused_f7.S */
   7305 /* File: arm/unused.S */
   7306 /*
   7307  * Bail to reference interpreter to throw.
   7308  */
   7309   b MterpFallback
   7310 
   7311 
   7312 /* ------------------------------ */
   7313     .balign 128
   7314 .L_op_unused_f8: /* 0xf8 */
   7315 /* File: arm/op_unused_f8.S */
   7316 /* File: arm/unused.S */
   7317 /*
   7318  * Bail to reference interpreter to throw.
   7319  */
   7320   b MterpFallback
   7321 
   7322 
   7323 /* ------------------------------ */
   7324     .balign 128
   7325 .L_op_unused_f9: /* 0xf9 */
   7326 /* File: arm/op_unused_f9.S */
   7327 /* File: arm/unused.S */
   7328 /*
   7329  * Bail to reference interpreter to throw.
   7330  */
   7331   b MterpFallback
   7332 
   7333 
   7334 /* ------------------------------ */
   7335     .balign 128
   7336 .L_op_invoke_polymorphic: /* 0xfa */
   7337 /* Transfer stub to alternate interpreter */
   7338     b    MterpFallback
   7339 
   7340 
   7341 /* ------------------------------ */
   7342     .balign 128
   7343 .L_op_invoke_polymorphic_range: /* 0xfb */
   7344 /* Transfer stub to alternate interpreter */
   7345     b    MterpFallback
   7346 
   7347 
   7348 /* ------------------------------ */
   7349     .balign 128
   7350 .L_op_invoke_custom: /* 0xfc */
   7351 /* Transfer stub to alternate interpreter */
   7352     b    MterpFallback
   7353 
   7354 
   7355 /* ------------------------------ */
   7356     .balign 128
   7357 .L_op_invoke_custom_range: /* 0xfd */
   7358 /* Transfer stub to alternate interpreter */
   7359     b    MterpFallback
   7360 
   7361 
   7362 /* ------------------------------ */
   7363     .balign 128
   7364 .L_op_unused_fe: /* 0xfe */
   7365 /* File: arm/op_unused_fe.S */
   7366 /* File: arm/unused.S */
   7367 /*
   7368  * Bail to reference interpreter to throw.
   7369  */
   7370   b MterpFallback
   7371 
   7372 
   7373 /* ------------------------------ */
   7374     .balign 128
   7375 .L_op_unused_ff: /* 0xff */
   7376 /* File: arm/op_unused_ff.S */
   7377 /* File: arm/unused.S */
   7378 /*
   7379  * Bail to reference interpreter to throw.
   7380  */
   7381   b MterpFallback
   7382 
   7383 
   7384     .balign 128
   7385     .size   artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
   7386     .global artMterpAsmInstructionEnd
   7387 artMterpAsmInstructionEnd:
   7388 
   7389 /*
   7390  * ===========================================================================
   7391  *  Sister implementations
   7392  * ===========================================================================
   7393  */
   7394     .global artMterpAsmSisterStart
   7395     .type   artMterpAsmSisterStart, %function
   7396     .text
   7397     .balign 4
   7398 artMterpAsmSisterStart:
   7399 
   7400 /* continuation for op_float_to_long */
   7401 /*
   7402  * Convert the float in r0 to a long in r0/r1.
   7403  *
   7404  * We have to clip values to long min/max per the specification.  The
   7405  * expected common case is a "reasonable" value that converts directly
   7406  * to modest integer.  The EABI convert function isn't doing this for us.
   7407  */
   7408 f2l_doconv:
   7409     ubfx    r2, r0, #23, #8             @ grab the exponent
   7410     cmp     r2, #0xbe                   @ MININT < x > MAXINT?
   7411     bhs     f2l_special_cases
   7412     b       __aeabi_f2lz                @ tail call to convert float to long
   7413 f2l_special_cases:
   7414     cmp     r2, #0xff                   @ NaN or infinity?
   7415     beq     f2l_maybeNaN
   7416 f2l_notNaN:
   7417     adds    r0, r0, r0                  @ sign bit to carry
   7418     mov     r0, #0xffffffff             @ assume maxlong for lsw
   7419     mov     r1, #0x7fffffff             @ assume maxlong for msw
   7420     adc     r0, r0, #0
   7421     adc     r1, r1, #0                  @ convert maxlong to minlong if exp negative
   7422     bx      lr                          @ return
   7423 f2l_maybeNaN:
   7424     lsls    r3, r0, #9
   7425     beq     f2l_notNaN                  @ if fraction is non-zero, it's a NaN
   7426     mov     r0, #0
   7427     mov     r1, #0
   7428     bx      lr                          @ return 0 for NaN
   7429 
   7430 /* continuation for op_double_to_long */
   7431 /*
   7432  * Convert the double in r0/r1 to a long in r0/r1.
   7433  *
   7434  * We have to clip values to long min/max per the specification.  The
   7435  * expected common case is a "reasonable" value that converts directly
   7436  * to modest integer.  The EABI convert function isn't doing this for us.
   7437  */
   7438 d2l_doconv:
   7439     ubfx    r2, r1, #20, #11            @ grab the exponent
   7440     movw    r3, #0x43e
   7441     cmp     r2, r3                      @ MINLONG < x > MAXLONG?
   7442     bhs     d2l_special_cases
   7443     b       __aeabi_d2lz                @ tail call to convert double to long
   7444 d2l_special_cases:
   7445     movw    r3, #0x7ff
   7446     cmp     r2, r3
   7447     beq     d2l_maybeNaN                @ NaN?
   7448 d2l_notNaN:
   7449     adds    r1, r1, r1                  @ sign bit to carry
   7450     mov     r0, #0xffffffff             @ assume maxlong for lsw
   7451     mov     r1, #0x7fffffff             @ assume maxlong for msw
   7452     adc     r0, r0, #0
   7453     adc     r1, r1, #0                  @ convert maxlong to minlong if exp negative
   7454     bx      lr                          @ return
   7455 d2l_maybeNaN:
   7456     orrs    r3, r0, r1, lsl #12
   7457     beq     d2l_notNaN                  @ if fraction is non-zero, it's a NaN
   7458     mov     r0, #0
   7459     mov     r1, #0
   7460     bx      lr                          @ return 0 for NaN
   7461 
   7462     .size   artMterpAsmSisterStart, .-artMterpAsmSisterStart
   7463     .global artMterpAsmSisterEnd
   7464 artMterpAsmSisterEnd:
   7465 
   7466 
   7467     .global artMterpAsmAltInstructionStart
   7468     .type   artMterpAsmAltInstructionStart, %function
   7469     .text
   7470 
   7471 artMterpAsmAltInstructionStart = .L_ALT_op_nop
   7472 /* ------------------------------ */
   7473     .balign 128
   7474 .L_ALT_op_nop: /* 0x00 */
   7475 /* File: arm/alt_stub.S */
   7476 /*
   7477  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7478  * any interesting requests and then jump to the real instruction
   7479  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7480  */
   7481     .extern MterpCheckBefore
   7482     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7483     adrl   lr, artMterpAsmInstructionStart + (0 * 128)       @ Addr of primary handler.
   7484     mov    r0, rSELF
   7485     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7486     mov    r2, rPC
   7487     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7488 
   7489 /* ------------------------------ */
   7490     .balign 128
   7491 .L_ALT_op_move: /* 0x01 */
   7492 /* File: arm/alt_stub.S */
   7493 /*
   7494  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7495  * any interesting requests and then jump to the real instruction
   7496  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7497  */
   7498     .extern MterpCheckBefore
   7499     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7500     adrl   lr, artMterpAsmInstructionStart + (1 * 128)       @ Addr of primary handler.
   7501     mov    r0, rSELF
   7502     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7503     mov    r2, rPC
   7504     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7505 
   7506 /* ------------------------------ */
   7507     .balign 128
   7508 .L_ALT_op_move_from16: /* 0x02 */
   7509 /* File: arm/alt_stub.S */
   7510 /*
   7511  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7512  * any interesting requests and then jump to the real instruction
   7513  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7514  */
   7515     .extern MterpCheckBefore
   7516     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7517     adrl   lr, artMterpAsmInstructionStart + (2 * 128)       @ Addr of primary handler.
   7518     mov    r0, rSELF
   7519     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7520     mov    r2, rPC
   7521     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7522 
   7523 /* ------------------------------ */
   7524     .balign 128
   7525 .L_ALT_op_move_16: /* 0x03 */
   7526 /* File: arm/alt_stub.S */
   7527 /*
   7528  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7529  * any interesting requests and then jump to the real instruction
   7530  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7531  */
   7532     .extern MterpCheckBefore
   7533     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7534     adrl   lr, artMterpAsmInstructionStart + (3 * 128)       @ Addr of primary handler.
   7535     mov    r0, rSELF
   7536     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7537     mov    r2, rPC
   7538     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7539 
   7540 /* ------------------------------ */
   7541     .balign 128
   7542 .L_ALT_op_move_wide: /* 0x04 */
   7543 /* File: arm/alt_stub.S */
   7544 /*
   7545  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7546  * any interesting requests and then jump to the real instruction
   7547  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7548  */
   7549     .extern MterpCheckBefore
   7550     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7551     adrl   lr, artMterpAsmInstructionStart + (4 * 128)       @ Addr of primary handler.
   7552     mov    r0, rSELF
   7553     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7554     mov    r2, rPC
   7555     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7556 
   7557 /* ------------------------------ */
   7558     .balign 128
   7559 .L_ALT_op_move_wide_from16: /* 0x05 */
   7560 /* File: arm/alt_stub.S */
   7561 /*
   7562  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7563  * any interesting requests and then jump to the real instruction
   7564  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7565  */
   7566     .extern MterpCheckBefore
   7567     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7568     adrl   lr, artMterpAsmInstructionStart + (5 * 128)       @ Addr of primary handler.
   7569     mov    r0, rSELF
   7570     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7571     mov    r2, rPC
   7572     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7573 
   7574 /* ------------------------------ */
   7575     .balign 128
   7576 .L_ALT_op_move_wide_16: /* 0x06 */
   7577 /* File: arm/alt_stub.S */
   7578 /*
   7579  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7580  * any interesting requests and then jump to the real instruction
   7581  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7582  */
   7583     .extern MterpCheckBefore
   7584     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7585     adrl   lr, artMterpAsmInstructionStart + (6 * 128)       @ Addr of primary handler.
   7586     mov    r0, rSELF
   7587     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7588     mov    r2, rPC
   7589     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7590 
   7591 /* ------------------------------ */
   7592     .balign 128
   7593 .L_ALT_op_move_object: /* 0x07 */
   7594 /* File: arm/alt_stub.S */
   7595 /*
   7596  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7597  * any interesting requests and then jump to the real instruction
   7598  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7599  */
   7600     .extern MterpCheckBefore
   7601     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7602     adrl   lr, artMterpAsmInstructionStart + (7 * 128)       @ Addr of primary handler.
   7603     mov    r0, rSELF
   7604     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7605     mov    r2, rPC
   7606     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7607 
   7608 /* ------------------------------ */
   7609     .balign 128
   7610 .L_ALT_op_move_object_from16: /* 0x08 */
   7611 /* File: arm/alt_stub.S */
   7612 /*
   7613  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7614  * any interesting requests and then jump to the real instruction
   7615  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7616  */
   7617     .extern MterpCheckBefore
   7618     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7619     adrl   lr, artMterpAsmInstructionStart + (8 * 128)       @ Addr of primary handler.
   7620     mov    r0, rSELF
   7621     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7622     mov    r2, rPC
   7623     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7624 
   7625 /* ------------------------------ */
   7626     .balign 128
   7627 .L_ALT_op_move_object_16: /* 0x09 */
   7628 /* File: arm/alt_stub.S */
   7629 /*
   7630  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7631  * any interesting requests and then jump to the real instruction
   7632  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7633  */
   7634     .extern MterpCheckBefore
   7635     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7636     adrl   lr, artMterpAsmInstructionStart + (9 * 128)       @ Addr of primary handler.
   7637     mov    r0, rSELF
   7638     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7639     mov    r2, rPC
   7640     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7641 
   7642 /* ------------------------------ */
   7643     .balign 128
   7644 .L_ALT_op_move_result: /* 0x0a */
   7645 /* File: arm/alt_stub.S */
   7646 /*
   7647  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7648  * any interesting requests and then jump to the real instruction
   7649  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7650  */
   7651     .extern MterpCheckBefore
   7652     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7653     adrl   lr, artMterpAsmInstructionStart + (10 * 128)       @ Addr of primary handler.
   7654     mov    r0, rSELF
   7655     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7656     mov    r2, rPC
   7657     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7658 
   7659 /* ------------------------------ */
   7660     .balign 128
   7661 .L_ALT_op_move_result_wide: /* 0x0b */
   7662 /* File: arm/alt_stub.S */
   7663 /*
   7664  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7665  * any interesting requests and then jump to the real instruction
   7666  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7667  */
   7668     .extern MterpCheckBefore
   7669     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7670     adrl   lr, artMterpAsmInstructionStart + (11 * 128)       @ Addr of primary handler.
   7671     mov    r0, rSELF
   7672     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7673     mov    r2, rPC
   7674     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7675 
   7676 /* ------------------------------ */
   7677     .balign 128
   7678 .L_ALT_op_move_result_object: /* 0x0c */
   7679 /* File: arm/alt_stub.S */
   7680 /*
   7681  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7682  * any interesting requests and then jump to the real instruction
   7683  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7684  */
   7685     .extern MterpCheckBefore
   7686     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7687     adrl   lr, artMterpAsmInstructionStart + (12 * 128)       @ Addr of primary handler.
   7688     mov    r0, rSELF
   7689     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7690     mov    r2, rPC
   7691     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7692 
   7693 /* ------------------------------ */
   7694     .balign 128
   7695 .L_ALT_op_move_exception: /* 0x0d */
   7696 /* File: arm/alt_stub.S */
   7697 /*
   7698  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7699  * any interesting requests and then jump to the real instruction
   7700  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7701  */
   7702     .extern MterpCheckBefore
   7703     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7704     adrl   lr, artMterpAsmInstructionStart + (13 * 128)       @ Addr of primary handler.
   7705     mov    r0, rSELF
   7706     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7707     mov    r2, rPC
   7708     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7709 
   7710 /* ------------------------------ */
   7711     .balign 128
   7712 .L_ALT_op_return_void: /* 0x0e */
   7713 /* File: arm/alt_stub.S */
   7714 /*
   7715  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7716  * any interesting requests and then jump to the real instruction
   7717  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7718  */
   7719     .extern MterpCheckBefore
   7720     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7721     adrl   lr, artMterpAsmInstructionStart + (14 * 128)       @ Addr of primary handler.
   7722     mov    r0, rSELF
   7723     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7724     mov    r2, rPC
   7725     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7726 
   7727 /* ------------------------------ */
   7728     .balign 128
   7729 .L_ALT_op_return: /* 0x0f */
   7730 /* File: arm/alt_stub.S */
   7731 /*
   7732  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7733  * any interesting requests and then jump to the real instruction
   7734  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7735  */
   7736     .extern MterpCheckBefore
   7737     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7738     adrl   lr, artMterpAsmInstructionStart + (15 * 128)       @ Addr of primary handler.
   7739     mov    r0, rSELF
   7740     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7741     mov    r2, rPC
   7742     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7743 
   7744 /* ------------------------------ */
   7745     .balign 128
   7746 .L_ALT_op_return_wide: /* 0x10 */
   7747 /* File: arm/alt_stub.S */
   7748 /*
   7749  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7750  * any interesting requests and then jump to the real instruction
   7751  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7752  */
   7753     .extern MterpCheckBefore
   7754     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7755     adrl   lr, artMterpAsmInstructionStart + (16 * 128)       @ Addr of primary handler.
   7756     mov    r0, rSELF
   7757     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7758     mov    r2, rPC
   7759     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7760 
   7761 /* ------------------------------ */
   7762     .balign 128
   7763 .L_ALT_op_return_object: /* 0x11 */
   7764 /* File: arm/alt_stub.S */
   7765 /*
   7766  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7767  * any interesting requests and then jump to the real instruction
   7768  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7769  */
   7770     .extern MterpCheckBefore
   7771     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7772     adrl   lr, artMterpAsmInstructionStart + (17 * 128)       @ Addr of primary handler.
   7773     mov    r0, rSELF
   7774     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7775     mov    r2, rPC
   7776     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7777 
   7778 /* ------------------------------ */
   7779     .balign 128
   7780 .L_ALT_op_const_4: /* 0x12 */
   7781 /* File: arm/alt_stub.S */
   7782 /*
   7783  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7784  * any interesting requests and then jump to the real instruction
   7785  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7786  */
   7787     .extern MterpCheckBefore
   7788     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7789     adrl   lr, artMterpAsmInstructionStart + (18 * 128)       @ Addr of primary handler.
   7790     mov    r0, rSELF
   7791     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7792     mov    r2, rPC
   7793     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7794 
   7795 /* ------------------------------ */
   7796     .balign 128
   7797 .L_ALT_op_const_16: /* 0x13 */
   7798 /* File: arm/alt_stub.S */
   7799 /*
   7800  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7801  * any interesting requests and then jump to the real instruction
   7802  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7803  */
   7804     .extern MterpCheckBefore
   7805     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7806     adrl   lr, artMterpAsmInstructionStart + (19 * 128)       @ Addr of primary handler.
   7807     mov    r0, rSELF
   7808     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7809     mov    r2, rPC
   7810     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7811 
   7812 /* ------------------------------ */
   7813     .balign 128
   7814 .L_ALT_op_const: /* 0x14 */
   7815 /* File: arm/alt_stub.S */
   7816 /*
   7817  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7818  * any interesting requests and then jump to the real instruction
   7819  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7820  */
   7821     .extern MterpCheckBefore
   7822     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7823     adrl   lr, artMterpAsmInstructionStart + (20 * 128)       @ Addr of primary handler.
   7824     mov    r0, rSELF
   7825     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7826     mov    r2, rPC
   7827     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7828 
   7829 /* ------------------------------ */
   7830     .balign 128
   7831 .L_ALT_op_const_high16: /* 0x15 */
   7832 /* File: arm/alt_stub.S */
   7833 /*
   7834  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7835  * any interesting requests and then jump to the real instruction
   7836  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7837  */
   7838     .extern MterpCheckBefore
   7839     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7840     adrl   lr, artMterpAsmInstructionStart + (21 * 128)       @ Addr of primary handler.
   7841     mov    r0, rSELF
   7842     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7843     mov    r2, rPC
   7844     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7845 
   7846 /* ------------------------------ */
   7847     .balign 128
   7848 .L_ALT_op_const_wide_16: /* 0x16 */
   7849 /* File: arm/alt_stub.S */
   7850 /*
   7851  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7852  * any interesting requests and then jump to the real instruction
   7853  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7854  */
   7855     .extern MterpCheckBefore
   7856     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7857     adrl   lr, artMterpAsmInstructionStart + (22 * 128)       @ Addr of primary handler.
   7858     mov    r0, rSELF
   7859     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7860     mov    r2, rPC
   7861     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7862 
   7863 /* ------------------------------ */
   7864     .balign 128
   7865 .L_ALT_op_const_wide_32: /* 0x17 */
   7866 /* File: arm/alt_stub.S */
   7867 /*
   7868  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7869  * any interesting requests and then jump to the real instruction
   7870  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7871  */
   7872     .extern MterpCheckBefore
   7873     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7874     adrl   lr, artMterpAsmInstructionStart + (23 * 128)       @ Addr of primary handler.
   7875     mov    r0, rSELF
   7876     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7877     mov    r2, rPC
   7878     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7879 
   7880 /* ------------------------------ */
   7881     .balign 128
   7882 .L_ALT_op_const_wide: /* 0x18 */
   7883 /* File: arm/alt_stub.S */
   7884 /*
   7885  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7886  * any interesting requests and then jump to the real instruction
   7887  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7888  */
   7889     .extern MterpCheckBefore
   7890     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7891     adrl   lr, artMterpAsmInstructionStart + (24 * 128)       @ Addr of primary handler.
   7892     mov    r0, rSELF
   7893     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7894     mov    r2, rPC
   7895     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7896 
   7897 /* ------------------------------ */
   7898     .balign 128
   7899 .L_ALT_op_const_wide_high16: /* 0x19 */
   7900 /* File: arm/alt_stub.S */
   7901 /*
   7902  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7903  * any interesting requests and then jump to the real instruction
   7904  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7905  */
   7906     .extern MterpCheckBefore
   7907     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7908     adrl   lr, artMterpAsmInstructionStart + (25 * 128)       @ Addr of primary handler.
   7909     mov    r0, rSELF
   7910     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7911     mov    r2, rPC
   7912     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7913 
   7914 /* ------------------------------ */
   7915     .balign 128
   7916 .L_ALT_op_const_string: /* 0x1a */
   7917 /* File: arm/alt_stub.S */
   7918 /*
   7919  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7920  * any interesting requests and then jump to the real instruction
   7921  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7922  */
   7923     .extern MterpCheckBefore
   7924     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7925     adrl   lr, artMterpAsmInstructionStart + (26 * 128)       @ Addr of primary handler.
   7926     mov    r0, rSELF
   7927     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7928     mov    r2, rPC
   7929     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7930 
   7931 /* ------------------------------ */
   7932     .balign 128
   7933 .L_ALT_op_const_string_jumbo: /* 0x1b */
   7934 /* File: arm/alt_stub.S */
   7935 /*
   7936  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7937  * any interesting requests and then jump to the real instruction
   7938  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7939  */
   7940     .extern MterpCheckBefore
   7941     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7942     adrl   lr, artMterpAsmInstructionStart + (27 * 128)       @ Addr of primary handler.
   7943     mov    r0, rSELF
   7944     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7945     mov    r2, rPC
   7946     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7947 
   7948 /* ------------------------------ */
   7949     .balign 128
   7950 .L_ALT_op_const_class: /* 0x1c */
   7951 /* File: arm/alt_stub.S */
   7952 /*
   7953  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7954  * any interesting requests and then jump to the real instruction
   7955  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7956  */
   7957     .extern MterpCheckBefore
   7958     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7959     adrl   lr, artMterpAsmInstructionStart + (28 * 128)       @ Addr of primary handler.
   7960     mov    r0, rSELF
   7961     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7962     mov    r2, rPC
   7963     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7964 
   7965 /* ------------------------------ */
   7966     .balign 128
   7967 .L_ALT_op_monitor_enter: /* 0x1d */
   7968 /* File: arm/alt_stub.S */
   7969 /*
   7970  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7971  * any interesting requests and then jump to the real instruction
   7972  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7973  */
   7974     .extern MterpCheckBefore
   7975     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7976     adrl   lr, artMterpAsmInstructionStart + (29 * 128)       @ Addr of primary handler.
   7977     mov    r0, rSELF
   7978     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7979     mov    r2, rPC
   7980     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7981 
   7982 /* ------------------------------ */
   7983     .balign 128
   7984 .L_ALT_op_monitor_exit: /* 0x1e */
   7985 /* File: arm/alt_stub.S */
   7986 /*
   7987  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   7988  * any interesting requests and then jump to the real instruction
   7989  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   7990  */
   7991     .extern MterpCheckBefore
   7992     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   7993     adrl   lr, artMterpAsmInstructionStart + (30 * 128)       @ Addr of primary handler.
   7994     mov    r0, rSELF
   7995     add    r1, rFP, #OFF_FP_SHADOWFRAME
   7996     mov    r2, rPC
   7997     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   7998 
   7999 /* ------------------------------ */
   8000     .balign 128
   8001 .L_ALT_op_check_cast: /* 0x1f */
   8002 /* File: arm/alt_stub.S */
   8003 /*
   8004  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8005  * any interesting requests and then jump to the real instruction
   8006  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8007  */
   8008     .extern MterpCheckBefore
   8009     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8010     adrl   lr, artMterpAsmInstructionStart + (31 * 128)       @ Addr of primary handler.
   8011     mov    r0, rSELF
   8012     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8013     mov    r2, rPC
   8014     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8015 
   8016 /* ------------------------------ */
   8017     .balign 128
   8018 .L_ALT_op_instance_of: /* 0x20 */
   8019 /* File: arm/alt_stub.S */
   8020 /*
   8021  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8022  * any interesting requests and then jump to the real instruction
   8023  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8024  */
   8025     .extern MterpCheckBefore
   8026     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8027     adrl   lr, artMterpAsmInstructionStart + (32 * 128)       @ Addr of primary handler.
   8028     mov    r0, rSELF
   8029     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8030     mov    r2, rPC
   8031     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8032 
   8033 /* ------------------------------ */
   8034     .balign 128
   8035 .L_ALT_op_array_length: /* 0x21 */
   8036 /* File: arm/alt_stub.S */
   8037 /*
   8038  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8039  * any interesting requests and then jump to the real instruction
   8040  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8041  */
   8042     .extern MterpCheckBefore
   8043     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8044     adrl   lr, artMterpAsmInstructionStart + (33 * 128)       @ Addr of primary handler.
   8045     mov    r0, rSELF
   8046     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8047     mov    r2, rPC
   8048     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8049 
   8050 /* ------------------------------ */
   8051     .balign 128
   8052 .L_ALT_op_new_instance: /* 0x22 */
   8053 /* File: arm/alt_stub.S */
   8054 /*
   8055  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8056  * any interesting requests and then jump to the real instruction
   8057  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8058  */
   8059     .extern MterpCheckBefore
   8060     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8061     adrl   lr, artMterpAsmInstructionStart + (34 * 128)       @ Addr of primary handler.
   8062     mov    r0, rSELF
   8063     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8064     mov    r2, rPC
   8065     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8066 
   8067 /* ------------------------------ */
   8068     .balign 128
   8069 .L_ALT_op_new_array: /* 0x23 */
   8070 /* File: arm/alt_stub.S */
   8071 /*
   8072  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8073  * any interesting requests and then jump to the real instruction
   8074  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8075  */
   8076     .extern MterpCheckBefore
   8077     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8078     adrl   lr, artMterpAsmInstructionStart + (35 * 128)       @ Addr of primary handler.
   8079     mov    r0, rSELF
   8080     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8081     mov    r2, rPC
   8082     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8083 
   8084 /* ------------------------------ */
   8085     .balign 128
   8086 .L_ALT_op_filled_new_array: /* 0x24 */
   8087 /* File: arm/alt_stub.S */
   8088 /*
   8089  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8090  * any interesting requests and then jump to the real instruction
   8091  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8092  */
   8093     .extern MterpCheckBefore
   8094     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8095     adrl   lr, artMterpAsmInstructionStart + (36 * 128)       @ Addr of primary handler.
   8096     mov    r0, rSELF
   8097     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8098     mov    r2, rPC
   8099     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8100 
   8101 /* ------------------------------ */
   8102     .balign 128
   8103 .L_ALT_op_filled_new_array_range: /* 0x25 */
   8104 /* File: arm/alt_stub.S */
   8105 /*
   8106  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8107  * any interesting requests and then jump to the real instruction
   8108  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8109  */
   8110     .extern MterpCheckBefore
   8111     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8112     adrl   lr, artMterpAsmInstructionStart + (37 * 128)       @ Addr of primary handler.
   8113     mov    r0, rSELF
   8114     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8115     mov    r2, rPC
   8116     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8117 
   8118 /* ------------------------------ */
   8119     .balign 128
   8120 .L_ALT_op_fill_array_data: /* 0x26 */
   8121 /* File: arm/alt_stub.S */
   8122 /*
   8123  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8124  * any interesting requests and then jump to the real instruction
   8125  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8126  */
   8127     .extern MterpCheckBefore
   8128     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8129     adrl   lr, artMterpAsmInstructionStart + (38 * 128)       @ Addr of primary handler.
   8130     mov    r0, rSELF
   8131     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8132     mov    r2, rPC
   8133     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8134 
   8135 /* ------------------------------ */
   8136     .balign 128
   8137 .L_ALT_op_throw: /* 0x27 */
   8138 /* File: arm/alt_stub.S */
   8139 /*
   8140  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8141  * any interesting requests and then jump to the real instruction
   8142  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8143  */
   8144     .extern MterpCheckBefore
   8145     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8146     adrl   lr, artMterpAsmInstructionStart + (39 * 128)       @ Addr of primary handler.
   8147     mov    r0, rSELF
   8148     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8149     mov    r2, rPC
   8150     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8151 
   8152 /* ------------------------------ */
   8153     .balign 128
   8154 .L_ALT_op_goto: /* 0x28 */
   8155 /* File: arm/alt_stub.S */
   8156 /*
   8157  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8158  * any interesting requests and then jump to the real instruction
   8159  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8160  */
   8161     .extern MterpCheckBefore
   8162     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8163     adrl   lr, artMterpAsmInstructionStart + (40 * 128)       @ Addr of primary handler.
   8164     mov    r0, rSELF
   8165     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8166     mov    r2, rPC
   8167     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8168 
   8169 /* ------------------------------ */
   8170     .balign 128
   8171 .L_ALT_op_goto_16: /* 0x29 */
   8172 /* File: arm/alt_stub.S */
   8173 /*
   8174  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8175  * any interesting requests and then jump to the real instruction
   8176  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8177  */
   8178     .extern MterpCheckBefore
   8179     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8180     adrl   lr, artMterpAsmInstructionStart + (41 * 128)       @ Addr of primary handler.
   8181     mov    r0, rSELF
   8182     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8183     mov    r2, rPC
   8184     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8185 
   8186 /* ------------------------------ */
   8187     .balign 128
   8188 .L_ALT_op_goto_32: /* 0x2a */
   8189 /* File: arm/alt_stub.S */
   8190 /*
   8191  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8192  * any interesting requests and then jump to the real instruction
   8193  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8194  */
   8195     .extern MterpCheckBefore
   8196     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8197     adrl   lr, artMterpAsmInstructionStart + (42 * 128)       @ Addr of primary handler.
   8198     mov    r0, rSELF
   8199     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8200     mov    r2, rPC
   8201     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8202 
   8203 /* ------------------------------ */
   8204     .balign 128
   8205 .L_ALT_op_packed_switch: /* 0x2b */
   8206 /* File: arm/alt_stub.S */
   8207 /*
   8208  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8209  * any interesting requests and then jump to the real instruction
   8210  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8211  */
   8212     .extern MterpCheckBefore
   8213     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8214     adrl   lr, artMterpAsmInstructionStart + (43 * 128)       @ Addr of primary handler.
   8215     mov    r0, rSELF
   8216     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8217     mov    r2, rPC
   8218     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8219 
   8220 /* ------------------------------ */
   8221     .balign 128
   8222 .L_ALT_op_sparse_switch: /* 0x2c */
   8223 /* File: arm/alt_stub.S */
   8224 /*
   8225  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8226  * any interesting requests and then jump to the real instruction
   8227  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8228  */
   8229     .extern MterpCheckBefore
   8230     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8231     adrl   lr, artMterpAsmInstructionStart + (44 * 128)       @ Addr of primary handler.
   8232     mov    r0, rSELF
   8233     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8234     mov    r2, rPC
   8235     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8236 
   8237 /* ------------------------------ */
   8238     .balign 128
   8239 .L_ALT_op_cmpl_float: /* 0x2d */
   8240 /* File: arm/alt_stub.S */
   8241 /*
   8242  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8243  * any interesting requests and then jump to the real instruction
   8244  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8245  */
   8246     .extern MterpCheckBefore
   8247     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8248     adrl   lr, artMterpAsmInstructionStart + (45 * 128)       @ Addr of primary handler.
   8249     mov    r0, rSELF
   8250     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8251     mov    r2, rPC
   8252     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8253 
   8254 /* ------------------------------ */
   8255     .balign 128
   8256 .L_ALT_op_cmpg_float: /* 0x2e */
   8257 /* File: arm/alt_stub.S */
   8258 /*
   8259  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8260  * any interesting requests and then jump to the real instruction
   8261  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8262  */
   8263     .extern MterpCheckBefore
   8264     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8265     adrl   lr, artMterpAsmInstructionStart + (46 * 128)       @ Addr of primary handler.
   8266     mov    r0, rSELF
   8267     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8268     mov    r2, rPC
   8269     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8270 
   8271 /* ------------------------------ */
   8272     .balign 128
   8273 .L_ALT_op_cmpl_double: /* 0x2f */
   8274 /* File: arm/alt_stub.S */
   8275 /*
   8276  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8277  * any interesting requests and then jump to the real instruction
   8278  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8279  */
   8280     .extern MterpCheckBefore
   8281     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8282     adrl   lr, artMterpAsmInstructionStart + (47 * 128)       @ Addr of primary handler.
   8283     mov    r0, rSELF
   8284     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8285     mov    r2, rPC
   8286     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8287 
   8288 /* ------------------------------ */
   8289     .balign 128
   8290 .L_ALT_op_cmpg_double: /* 0x30 */
   8291 /* File: arm/alt_stub.S */
   8292 /*
   8293  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8294  * any interesting requests and then jump to the real instruction
   8295  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8296  */
   8297     .extern MterpCheckBefore
   8298     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8299     adrl   lr, artMterpAsmInstructionStart + (48 * 128)       @ Addr of primary handler.
   8300     mov    r0, rSELF
   8301     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8302     mov    r2, rPC
   8303     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8304 
   8305 /* ------------------------------ */
   8306     .balign 128
   8307 .L_ALT_op_cmp_long: /* 0x31 */
   8308 /* File: arm/alt_stub.S */
   8309 /*
   8310  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8311  * any interesting requests and then jump to the real instruction
   8312  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8313  */
   8314     .extern MterpCheckBefore
   8315     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8316     adrl   lr, artMterpAsmInstructionStart + (49 * 128)       @ Addr of primary handler.
   8317     mov    r0, rSELF
   8318     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8319     mov    r2, rPC
   8320     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8321 
   8322 /* ------------------------------ */
   8323     .balign 128
   8324 .L_ALT_op_if_eq: /* 0x32 */
   8325 /* File: arm/alt_stub.S */
   8326 /*
   8327  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8328  * any interesting requests and then jump to the real instruction
   8329  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8330  */
   8331     .extern MterpCheckBefore
   8332     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8333     adrl   lr, artMterpAsmInstructionStart + (50 * 128)       @ Addr of primary handler.
   8334     mov    r0, rSELF
   8335     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8336     mov    r2, rPC
   8337     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8338 
   8339 /* ------------------------------ */
   8340     .balign 128
   8341 .L_ALT_op_if_ne: /* 0x33 */
   8342 /* File: arm/alt_stub.S */
   8343 /*
   8344  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8345  * any interesting requests and then jump to the real instruction
   8346  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8347  */
   8348     .extern MterpCheckBefore
   8349     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8350     adrl   lr, artMterpAsmInstructionStart + (51 * 128)       @ Addr of primary handler.
   8351     mov    r0, rSELF
   8352     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8353     mov    r2, rPC
   8354     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8355 
   8356 /* ------------------------------ */
   8357     .balign 128
   8358 .L_ALT_op_if_lt: /* 0x34 */
   8359 /* File: arm/alt_stub.S */
   8360 /*
   8361  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8362  * any interesting requests and then jump to the real instruction
   8363  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8364  */
   8365     .extern MterpCheckBefore
   8366     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8367     adrl   lr, artMterpAsmInstructionStart + (52 * 128)       @ Addr of primary handler.
   8368     mov    r0, rSELF
   8369     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8370     mov    r2, rPC
   8371     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8372 
   8373 /* ------------------------------ */
   8374     .balign 128
   8375 .L_ALT_op_if_ge: /* 0x35 */
   8376 /* File: arm/alt_stub.S */
   8377 /*
   8378  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8379  * any interesting requests and then jump to the real instruction
   8380  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8381  */
   8382     .extern MterpCheckBefore
   8383     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8384     adrl   lr, artMterpAsmInstructionStart + (53 * 128)       @ Addr of primary handler.
   8385     mov    r0, rSELF
   8386     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8387     mov    r2, rPC
   8388     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8389 
   8390 /* ------------------------------ */
   8391     .balign 128
   8392 .L_ALT_op_if_gt: /* 0x36 */
   8393 /* File: arm/alt_stub.S */
   8394 /*
   8395  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8396  * any interesting requests and then jump to the real instruction
   8397  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8398  */
   8399     .extern MterpCheckBefore
   8400     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8401     adrl   lr, artMterpAsmInstructionStart + (54 * 128)       @ Addr of primary handler.
   8402     mov    r0, rSELF
   8403     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8404     mov    r2, rPC
   8405     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8406 
   8407 /* ------------------------------ */
   8408     .balign 128
   8409 .L_ALT_op_if_le: /* 0x37 */
   8410 /* File: arm/alt_stub.S */
   8411 /*
   8412  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8413  * any interesting requests and then jump to the real instruction
   8414  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8415  */
   8416     .extern MterpCheckBefore
   8417     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8418     adrl   lr, artMterpAsmInstructionStart + (55 * 128)       @ Addr of primary handler.
   8419     mov    r0, rSELF
   8420     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8421     mov    r2, rPC
   8422     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8423 
   8424 /* ------------------------------ */
   8425     .balign 128
   8426 .L_ALT_op_if_eqz: /* 0x38 */
   8427 /* File: arm/alt_stub.S */
   8428 /*
   8429  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8430  * any interesting requests and then jump to the real instruction
   8431  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8432  */
   8433     .extern MterpCheckBefore
   8434     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8435     adrl   lr, artMterpAsmInstructionStart + (56 * 128)       @ Addr of primary handler.
   8436     mov    r0, rSELF
   8437     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8438     mov    r2, rPC
   8439     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8440 
   8441 /* ------------------------------ */
   8442     .balign 128
   8443 .L_ALT_op_if_nez: /* 0x39 */
   8444 /* File: arm/alt_stub.S */
   8445 /*
   8446  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8447  * any interesting requests and then jump to the real instruction
   8448  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8449  */
   8450     .extern MterpCheckBefore
   8451     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8452     adrl   lr, artMterpAsmInstructionStart + (57 * 128)       @ Addr of primary handler.
   8453     mov    r0, rSELF
   8454     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8455     mov    r2, rPC
   8456     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8457 
   8458 /* ------------------------------ */
   8459     .balign 128
   8460 .L_ALT_op_if_ltz: /* 0x3a */
   8461 /* File: arm/alt_stub.S */
   8462 /*
   8463  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8464  * any interesting requests and then jump to the real instruction
   8465  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8466  */
   8467     .extern MterpCheckBefore
   8468     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8469     adrl   lr, artMterpAsmInstructionStart + (58 * 128)       @ Addr of primary handler.
   8470     mov    r0, rSELF
   8471     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8472     mov    r2, rPC
   8473     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8474 
   8475 /* ------------------------------ */
   8476     .balign 128
   8477 .L_ALT_op_if_gez: /* 0x3b */
   8478 /* File: arm/alt_stub.S */
   8479 /*
   8480  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8481  * any interesting requests and then jump to the real instruction
   8482  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8483  */
   8484     .extern MterpCheckBefore
   8485     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8486     adrl   lr, artMterpAsmInstructionStart + (59 * 128)       @ Addr of primary handler.
   8487     mov    r0, rSELF
   8488     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8489     mov    r2, rPC
   8490     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8491 
   8492 /* ------------------------------ */
   8493     .balign 128
   8494 .L_ALT_op_if_gtz: /* 0x3c */
   8495 /* File: arm/alt_stub.S */
   8496 /*
   8497  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8498  * any interesting requests and then jump to the real instruction
   8499  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8500  */
   8501     .extern MterpCheckBefore
   8502     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8503     adrl   lr, artMterpAsmInstructionStart + (60 * 128)       @ Addr of primary handler.
   8504     mov    r0, rSELF
   8505     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8506     mov    r2, rPC
   8507     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8508 
   8509 /* ------------------------------ */
   8510     .balign 128
   8511 .L_ALT_op_if_lez: /* 0x3d */
   8512 /* File: arm/alt_stub.S */
   8513 /*
   8514  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8515  * any interesting requests and then jump to the real instruction
   8516  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8517  */
   8518     .extern MterpCheckBefore
   8519     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8520     adrl   lr, artMterpAsmInstructionStart + (61 * 128)       @ Addr of primary handler.
   8521     mov    r0, rSELF
   8522     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8523     mov    r2, rPC
   8524     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8525 
   8526 /* ------------------------------ */
   8527     .balign 128
   8528 .L_ALT_op_unused_3e: /* 0x3e */
   8529 /* File: arm/alt_stub.S */
   8530 /*
   8531  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8532  * any interesting requests and then jump to the real instruction
   8533  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8534  */
   8535     .extern MterpCheckBefore
   8536     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8537     adrl   lr, artMterpAsmInstructionStart + (62 * 128)       @ Addr of primary handler.
   8538     mov    r0, rSELF
   8539     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8540     mov    r2, rPC
   8541     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8542 
   8543 /* ------------------------------ */
   8544     .balign 128
   8545 .L_ALT_op_unused_3f: /* 0x3f */
   8546 /* File: arm/alt_stub.S */
   8547 /*
   8548  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8549  * any interesting requests and then jump to the real instruction
   8550  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8551  */
   8552     .extern MterpCheckBefore
   8553     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8554     adrl   lr, artMterpAsmInstructionStart + (63 * 128)       @ Addr of primary handler.
   8555     mov    r0, rSELF
   8556     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8557     mov    r2, rPC
   8558     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8559 
   8560 /* ------------------------------ */
   8561     .balign 128
   8562 .L_ALT_op_unused_40: /* 0x40 */
   8563 /* File: arm/alt_stub.S */
   8564 /*
   8565  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8566  * any interesting requests and then jump to the real instruction
   8567  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8568  */
   8569     .extern MterpCheckBefore
   8570     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8571     adrl   lr, artMterpAsmInstructionStart + (64 * 128)       @ Addr of primary handler.
   8572     mov    r0, rSELF
   8573     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8574     mov    r2, rPC
   8575     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8576 
   8577 /* ------------------------------ */
   8578     .balign 128
   8579 .L_ALT_op_unused_41: /* 0x41 */
   8580 /* File: arm/alt_stub.S */
   8581 /*
   8582  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8583  * any interesting requests and then jump to the real instruction
   8584  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8585  */
   8586     .extern MterpCheckBefore
   8587     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8588     adrl   lr, artMterpAsmInstructionStart + (65 * 128)       @ Addr of primary handler.
   8589     mov    r0, rSELF
   8590     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8591     mov    r2, rPC
   8592     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8593 
   8594 /* ------------------------------ */
   8595     .balign 128
   8596 .L_ALT_op_unused_42: /* 0x42 */
   8597 /* File: arm/alt_stub.S */
   8598 /*
   8599  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8600  * any interesting requests and then jump to the real instruction
   8601  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8602  */
   8603     .extern MterpCheckBefore
   8604     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8605     adrl   lr, artMterpAsmInstructionStart + (66 * 128)       @ Addr of primary handler.
   8606     mov    r0, rSELF
   8607     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8608     mov    r2, rPC
   8609     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8610 
   8611 /* ------------------------------ */
   8612     .balign 128
   8613 .L_ALT_op_unused_43: /* 0x43 */
   8614 /* File: arm/alt_stub.S */
   8615 /*
   8616  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8617  * any interesting requests and then jump to the real instruction
   8618  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8619  */
   8620     .extern MterpCheckBefore
   8621     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8622     adrl   lr, artMterpAsmInstructionStart + (67 * 128)       @ Addr of primary handler.
   8623     mov    r0, rSELF
   8624     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8625     mov    r2, rPC
   8626     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8627 
   8628 /* ------------------------------ */
   8629     .balign 128
   8630 .L_ALT_op_aget: /* 0x44 */
   8631 /* File: arm/alt_stub.S */
   8632 /*
   8633  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8634  * any interesting requests and then jump to the real instruction
   8635  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8636  */
   8637     .extern MterpCheckBefore
   8638     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8639     adrl   lr, artMterpAsmInstructionStart + (68 * 128)       @ Addr of primary handler.
   8640     mov    r0, rSELF
   8641     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8642     mov    r2, rPC
   8643     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8644 
   8645 /* ------------------------------ */
   8646     .balign 128
   8647 .L_ALT_op_aget_wide: /* 0x45 */
   8648 /* File: arm/alt_stub.S */
   8649 /*
   8650  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8651  * any interesting requests and then jump to the real instruction
   8652  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8653  */
   8654     .extern MterpCheckBefore
   8655     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8656     adrl   lr, artMterpAsmInstructionStart + (69 * 128)       @ Addr of primary handler.
   8657     mov    r0, rSELF
   8658     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8659     mov    r2, rPC
   8660     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8661 
   8662 /* ------------------------------ */
   8663     .balign 128
   8664 .L_ALT_op_aget_object: /* 0x46 */
   8665 /* File: arm/alt_stub.S */
   8666 /*
   8667  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8668  * any interesting requests and then jump to the real instruction
   8669  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8670  */
   8671     .extern MterpCheckBefore
   8672     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8673     adrl   lr, artMterpAsmInstructionStart + (70 * 128)       @ Addr of primary handler.
   8674     mov    r0, rSELF
   8675     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8676     mov    r2, rPC
   8677     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8678 
   8679 /* ------------------------------ */
   8680     .balign 128
   8681 .L_ALT_op_aget_boolean: /* 0x47 */
   8682 /* File: arm/alt_stub.S */
   8683 /*
   8684  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8685  * any interesting requests and then jump to the real instruction
   8686  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8687  */
   8688     .extern MterpCheckBefore
   8689     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8690     adrl   lr, artMterpAsmInstructionStart + (71 * 128)       @ Addr of primary handler.
   8691     mov    r0, rSELF
   8692     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8693     mov    r2, rPC
   8694     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8695 
   8696 /* ------------------------------ */
   8697     .balign 128
   8698 .L_ALT_op_aget_byte: /* 0x48 */
   8699 /* File: arm/alt_stub.S */
   8700 /*
   8701  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8702  * any interesting requests and then jump to the real instruction
   8703  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8704  */
   8705     .extern MterpCheckBefore
   8706     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8707     adrl   lr, artMterpAsmInstructionStart + (72 * 128)       @ Addr of primary handler.
   8708     mov    r0, rSELF
   8709     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8710     mov    r2, rPC
   8711     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8712 
   8713 /* ------------------------------ */
   8714     .balign 128
   8715 .L_ALT_op_aget_char: /* 0x49 */
   8716 /* File: arm/alt_stub.S */
   8717 /*
   8718  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8719  * any interesting requests and then jump to the real instruction
   8720  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8721  */
   8722     .extern MterpCheckBefore
   8723     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8724     adrl   lr, artMterpAsmInstructionStart + (73 * 128)       @ Addr of primary handler.
   8725     mov    r0, rSELF
   8726     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8727     mov    r2, rPC
   8728     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8729 
   8730 /* ------------------------------ */
   8731     .balign 128
   8732 .L_ALT_op_aget_short: /* 0x4a */
   8733 /* File: arm/alt_stub.S */
   8734 /*
   8735  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8736  * any interesting requests and then jump to the real instruction
   8737  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8738  */
   8739     .extern MterpCheckBefore
   8740     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8741     adrl   lr, artMterpAsmInstructionStart + (74 * 128)       @ Addr of primary handler.
   8742     mov    r0, rSELF
   8743     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8744     mov    r2, rPC
   8745     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8746 
   8747 /* ------------------------------ */
   8748     .balign 128
   8749 .L_ALT_op_aput: /* 0x4b */
   8750 /* File: arm/alt_stub.S */
   8751 /*
   8752  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8753  * any interesting requests and then jump to the real instruction
   8754  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8755  */
   8756     .extern MterpCheckBefore
   8757     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8758     adrl   lr, artMterpAsmInstructionStart + (75 * 128)       @ Addr of primary handler.
   8759     mov    r0, rSELF
   8760     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8761     mov    r2, rPC
   8762     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8763 
   8764 /* ------------------------------ */
   8765     .balign 128
   8766 .L_ALT_op_aput_wide: /* 0x4c */
   8767 /* File: arm/alt_stub.S */
   8768 /*
   8769  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8770  * any interesting requests and then jump to the real instruction
   8771  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8772  */
   8773     .extern MterpCheckBefore
   8774     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8775     adrl   lr, artMterpAsmInstructionStart + (76 * 128)       @ Addr of primary handler.
   8776     mov    r0, rSELF
   8777     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8778     mov    r2, rPC
   8779     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8780 
   8781 /* ------------------------------ */
   8782     .balign 128
   8783 .L_ALT_op_aput_object: /* 0x4d */
   8784 /* File: arm/alt_stub.S */
   8785 /*
   8786  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8787  * any interesting requests and then jump to the real instruction
   8788  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8789  */
   8790     .extern MterpCheckBefore
   8791     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8792     adrl   lr, artMterpAsmInstructionStart + (77 * 128)       @ Addr of primary handler.
   8793     mov    r0, rSELF
   8794     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8795     mov    r2, rPC
   8796     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8797 
   8798 /* ------------------------------ */
   8799     .balign 128
   8800 .L_ALT_op_aput_boolean: /* 0x4e */
   8801 /* File: arm/alt_stub.S */
   8802 /*
   8803  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8804  * any interesting requests and then jump to the real instruction
   8805  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8806  */
   8807     .extern MterpCheckBefore
   8808     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8809     adrl   lr, artMterpAsmInstructionStart + (78 * 128)       @ Addr of primary handler.
   8810     mov    r0, rSELF
   8811     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8812     mov    r2, rPC
   8813     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8814 
   8815 /* ------------------------------ */
   8816     .balign 128
   8817 .L_ALT_op_aput_byte: /* 0x4f */
   8818 /* File: arm/alt_stub.S */
   8819 /*
   8820  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8821  * any interesting requests and then jump to the real instruction
   8822  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8823  */
   8824     .extern MterpCheckBefore
   8825     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8826     adrl   lr, artMterpAsmInstructionStart + (79 * 128)       @ Addr of primary handler.
   8827     mov    r0, rSELF
   8828     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8829     mov    r2, rPC
   8830     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8831 
   8832 /* ------------------------------ */
   8833     .balign 128
   8834 .L_ALT_op_aput_char: /* 0x50 */
   8835 /* File: arm/alt_stub.S */
   8836 /*
   8837  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8838  * any interesting requests and then jump to the real instruction
   8839  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8840  */
   8841     .extern MterpCheckBefore
   8842     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8843     adrl   lr, artMterpAsmInstructionStart + (80 * 128)       @ Addr of primary handler.
   8844     mov    r0, rSELF
   8845     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8846     mov    r2, rPC
   8847     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8848 
   8849 /* ------------------------------ */
   8850     .balign 128
   8851 .L_ALT_op_aput_short: /* 0x51 */
   8852 /* File: arm/alt_stub.S */
   8853 /*
   8854  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8855  * any interesting requests and then jump to the real instruction
   8856  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8857  */
   8858     .extern MterpCheckBefore
   8859     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8860     adrl   lr, artMterpAsmInstructionStart + (81 * 128)       @ Addr of primary handler.
   8861     mov    r0, rSELF
   8862     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8863     mov    r2, rPC
   8864     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8865 
   8866 /* ------------------------------ */
   8867     .balign 128
   8868 .L_ALT_op_iget: /* 0x52 */
   8869 /* File: arm/alt_stub.S */
   8870 /*
   8871  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8872  * any interesting requests and then jump to the real instruction
   8873  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8874  */
   8875     .extern MterpCheckBefore
   8876     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8877     adrl   lr, artMterpAsmInstructionStart + (82 * 128)       @ Addr of primary handler.
   8878     mov    r0, rSELF
   8879     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8880     mov    r2, rPC
   8881     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8882 
   8883 /* ------------------------------ */
   8884     .balign 128
   8885 .L_ALT_op_iget_wide: /* 0x53 */
   8886 /* File: arm/alt_stub.S */
   8887 /*
   8888  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8889  * any interesting requests and then jump to the real instruction
   8890  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8891  */
   8892     .extern MterpCheckBefore
   8893     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8894     adrl   lr, artMterpAsmInstructionStart + (83 * 128)       @ Addr of primary handler.
   8895     mov    r0, rSELF
   8896     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8897     mov    r2, rPC
   8898     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8899 
   8900 /* ------------------------------ */
   8901     .balign 128
   8902 .L_ALT_op_iget_object: /* 0x54 */
   8903 /* File: arm/alt_stub.S */
   8904 /*
   8905  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8906  * any interesting requests and then jump to the real instruction
   8907  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8908  */
   8909     .extern MterpCheckBefore
   8910     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8911     adrl   lr, artMterpAsmInstructionStart + (84 * 128)       @ Addr of primary handler.
   8912     mov    r0, rSELF
   8913     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8914     mov    r2, rPC
   8915     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8916 
   8917 /* ------------------------------ */
   8918     .balign 128
   8919 .L_ALT_op_iget_boolean: /* 0x55 */
   8920 /* File: arm/alt_stub.S */
   8921 /*
   8922  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8923  * any interesting requests and then jump to the real instruction
   8924  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8925  */
   8926     .extern MterpCheckBefore
   8927     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8928     adrl   lr, artMterpAsmInstructionStart + (85 * 128)       @ Addr of primary handler.
   8929     mov    r0, rSELF
   8930     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8931     mov    r2, rPC
   8932     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8933 
   8934 /* ------------------------------ */
   8935     .balign 128
   8936 .L_ALT_op_iget_byte: /* 0x56 */
   8937 /* File: arm/alt_stub.S */
   8938 /*
   8939  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8940  * any interesting requests and then jump to the real instruction
   8941  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8942  */
   8943     .extern MterpCheckBefore
   8944     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8945     adrl   lr, artMterpAsmInstructionStart + (86 * 128)       @ Addr of primary handler.
   8946     mov    r0, rSELF
   8947     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8948     mov    r2, rPC
   8949     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8950 
   8951 /* ------------------------------ */
   8952     .balign 128
   8953 .L_ALT_op_iget_char: /* 0x57 */
   8954 /* File: arm/alt_stub.S */
   8955 /*
   8956  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8957  * any interesting requests and then jump to the real instruction
   8958  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8959  */
   8960     .extern MterpCheckBefore
   8961     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8962     adrl   lr, artMterpAsmInstructionStart + (87 * 128)       @ Addr of primary handler.
   8963     mov    r0, rSELF
   8964     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8965     mov    r2, rPC
   8966     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8967 
   8968 /* ------------------------------ */
   8969     .balign 128
   8970 .L_ALT_op_iget_short: /* 0x58 */
   8971 /* File: arm/alt_stub.S */
   8972 /*
   8973  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8974  * any interesting requests and then jump to the real instruction
   8975  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8976  */
   8977     .extern MterpCheckBefore
   8978     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8979     adrl   lr, artMterpAsmInstructionStart + (88 * 128)       @ Addr of primary handler.
   8980     mov    r0, rSELF
   8981     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8982     mov    r2, rPC
   8983     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   8984 
   8985 /* ------------------------------ */
   8986     .balign 128
   8987 .L_ALT_op_iput: /* 0x59 */
   8988 /* File: arm/alt_stub.S */
   8989 /*
   8990  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   8991  * any interesting requests and then jump to the real instruction
   8992  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   8993  */
   8994     .extern MterpCheckBefore
   8995     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   8996     adrl   lr, artMterpAsmInstructionStart + (89 * 128)       @ Addr of primary handler.
   8997     mov    r0, rSELF
   8998     add    r1, rFP, #OFF_FP_SHADOWFRAME
   8999     mov    r2, rPC
   9000     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9001 
   9002 /* ------------------------------ */
   9003     .balign 128
   9004 .L_ALT_op_iput_wide: /* 0x5a */
   9005 /* File: arm/alt_stub.S */
   9006 /*
   9007  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9008  * any interesting requests and then jump to the real instruction
   9009  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9010  */
   9011     .extern MterpCheckBefore
   9012     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9013     adrl   lr, artMterpAsmInstructionStart + (90 * 128)       @ Addr of primary handler.
   9014     mov    r0, rSELF
   9015     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9016     mov    r2, rPC
   9017     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9018 
   9019 /* ------------------------------ */
   9020     .balign 128
   9021 .L_ALT_op_iput_object: /* 0x5b */
   9022 /* File: arm/alt_stub.S */
   9023 /*
   9024  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9025  * any interesting requests and then jump to the real instruction
   9026  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9027  */
   9028     .extern MterpCheckBefore
   9029     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9030     adrl   lr, artMterpAsmInstructionStart + (91 * 128)       @ Addr of primary handler.
   9031     mov    r0, rSELF
   9032     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9033     mov    r2, rPC
   9034     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9035 
   9036 /* ------------------------------ */
   9037     .balign 128
   9038 .L_ALT_op_iput_boolean: /* 0x5c */
   9039 /* File: arm/alt_stub.S */
   9040 /*
   9041  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9042  * any interesting requests and then jump to the real instruction
   9043  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9044  */
   9045     .extern MterpCheckBefore
   9046     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9047     adrl   lr, artMterpAsmInstructionStart + (92 * 128)       @ Addr of primary handler.
   9048     mov    r0, rSELF
   9049     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9050     mov    r2, rPC
   9051     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9052 
   9053 /* ------------------------------ */
   9054     .balign 128
   9055 .L_ALT_op_iput_byte: /* 0x5d */
   9056 /* File: arm/alt_stub.S */
   9057 /*
   9058  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9059  * any interesting requests and then jump to the real instruction
   9060  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9061  */
   9062     .extern MterpCheckBefore
   9063     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9064     adrl   lr, artMterpAsmInstructionStart + (93 * 128)       @ Addr of primary handler.
   9065     mov    r0, rSELF
   9066     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9067     mov    r2, rPC
   9068     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9069 
   9070 /* ------------------------------ */
   9071     .balign 128
   9072 .L_ALT_op_iput_char: /* 0x5e */
   9073 /* File: arm/alt_stub.S */
   9074 /*
   9075  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9076  * any interesting requests and then jump to the real instruction
   9077  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9078  */
   9079     .extern MterpCheckBefore
   9080     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9081     adrl   lr, artMterpAsmInstructionStart + (94 * 128)       @ Addr of primary handler.
   9082     mov    r0, rSELF
   9083     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9084     mov    r2, rPC
   9085     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9086 
   9087 /* ------------------------------ */
   9088     .balign 128
   9089 .L_ALT_op_iput_short: /* 0x5f */
   9090 /* File: arm/alt_stub.S */
   9091 /*
   9092  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9093  * any interesting requests and then jump to the real instruction
   9094  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9095  */
   9096     .extern MterpCheckBefore
   9097     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9098     adrl   lr, artMterpAsmInstructionStart + (95 * 128)       @ Addr of primary handler.
   9099     mov    r0, rSELF
   9100     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9101     mov    r2, rPC
   9102     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9103 
   9104 /* ------------------------------ */
   9105     .balign 128
   9106 .L_ALT_op_sget: /* 0x60 */
   9107 /* File: arm/alt_stub.S */
   9108 /*
   9109  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9110  * any interesting requests and then jump to the real instruction
   9111  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9112  */
   9113     .extern MterpCheckBefore
   9114     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9115     adrl   lr, artMterpAsmInstructionStart + (96 * 128)       @ Addr of primary handler.
   9116     mov    r0, rSELF
   9117     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9118     mov    r2, rPC
   9119     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9120 
   9121 /* ------------------------------ */
   9122     .balign 128
   9123 .L_ALT_op_sget_wide: /* 0x61 */
   9124 /* File: arm/alt_stub.S */
   9125 /*
   9126  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9127  * any interesting requests and then jump to the real instruction
   9128  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9129  */
   9130     .extern MterpCheckBefore
   9131     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9132     adrl   lr, artMterpAsmInstructionStart + (97 * 128)       @ Addr of primary handler.
   9133     mov    r0, rSELF
   9134     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9135     mov    r2, rPC
   9136     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9137 
   9138 /* ------------------------------ */
   9139     .balign 128
   9140 .L_ALT_op_sget_object: /* 0x62 */
   9141 /* File: arm/alt_stub.S */
   9142 /*
   9143  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9144  * any interesting requests and then jump to the real instruction
   9145  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9146  */
   9147     .extern MterpCheckBefore
   9148     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9149     adrl   lr, artMterpAsmInstructionStart + (98 * 128)       @ Addr of primary handler.
   9150     mov    r0, rSELF
   9151     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9152     mov    r2, rPC
   9153     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9154 
   9155 /* ------------------------------ */
   9156     .balign 128
   9157 .L_ALT_op_sget_boolean: /* 0x63 */
   9158 /* File: arm/alt_stub.S */
   9159 /*
   9160  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9161  * any interesting requests and then jump to the real instruction
   9162  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9163  */
   9164     .extern MterpCheckBefore
   9165     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9166     adrl   lr, artMterpAsmInstructionStart + (99 * 128)       @ Addr of primary handler.
   9167     mov    r0, rSELF
   9168     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9169     mov    r2, rPC
   9170     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9171 
   9172 /* ------------------------------ */
   9173     .balign 128
   9174 .L_ALT_op_sget_byte: /* 0x64 */
   9175 /* File: arm/alt_stub.S */
   9176 /*
   9177  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9178  * any interesting requests and then jump to the real instruction
   9179  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9180  */
   9181     .extern MterpCheckBefore
   9182     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9183     adrl   lr, artMterpAsmInstructionStart + (100 * 128)       @ Addr of primary handler.
   9184     mov    r0, rSELF
   9185     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9186     mov    r2, rPC
   9187     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9188 
   9189 /* ------------------------------ */
   9190     .balign 128
   9191 .L_ALT_op_sget_char: /* 0x65 */
   9192 /* File: arm/alt_stub.S */
   9193 /*
   9194  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9195  * any interesting requests and then jump to the real instruction
   9196  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9197  */
   9198     .extern MterpCheckBefore
   9199     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9200     adrl   lr, artMterpAsmInstructionStart + (101 * 128)       @ Addr of primary handler.
   9201     mov    r0, rSELF
   9202     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9203     mov    r2, rPC
   9204     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9205 
   9206 /* ------------------------------ */
   9207     .balign 128
   9208 .L_ALT_op_sget_short: /* 0x66 */
   9209 /* File: arm/alt_stub.S */
   9210 /*
   9211  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9212  * any interesting requests and then jump to the real instruction
   9213  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9214  */
   9215     .extern MterpCheckBefore
   9216     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9217     adrl   lr, artMterpAsmInstructionStart + (102 * 128)       @ Addr of primary handler.
   9218     mov    r0, rSELF
   9219     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9220     mov    r2, rPC
   9221     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9222 
   9223 /* ------------------------------ */
   9224     .balign 128
   9225 .L_ALT_op_sput: /* 0x67 */
   9226 /* File: arm/alt_stub.S */
   9227 /*
   9228  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9229  * any interesting requests and then jump to the real instruction
   9230  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9231  */
   9232     .extern MterpCheckBefore
   9233     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9234     adrl   lr, artMterpAsmInstructionStart + (103 * 128)       @ Addr of primary handler.
   9235     mov    r0, rSELF
   9236     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9237     mov    r2, rPC
   9238     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9239 
   9240 /* ------------------------------ */
   9241     .balign 128
   9242 .L_ALT_op_sput_wide: /* 0x68 */
   9243 /* File: arm/alt_stub.S */
   9244 /*
   9245  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9246  * any interesting requests and then jump to the real instruction
   9247  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9248  */
   9249     .extern MterpCheckBefore
   9250     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9251     adrl   lr, artMterpAsmInstructionStart + (104 * 128)       @ Addr of primary handler.
   9252     mov    r0, rSELF
   9253     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9254     mov    r2, rPC
   9255     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9256 
   9257 /* ------------------------------ */
   9258     .balign 128
   9259 .L_ALT_op_sput_object: /* 0x69 */
   9260 /* File: arm/alt_stub.S */
   9261 /*
   9262  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9263  * any interesting requests and then jump to the real instruction
   9264  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9265  */
   9266     .extern MterpCheckBefore
   9267     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9268     adrl   lr, artMterpAsmInstructionStart + (105 * 128)       @ Addr of primary handler.
   9269     mov    r0, rSELF
   9270     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9271     mov    r2, rPC
   9272     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9273 
   9274 /* ------------------------------ */
   9275     .balign 128
   9276 .L_ALT_op_sput_boolean: /* 0x6a */
   9277 /* File: arm/alt_stub.S */
   9278 /*
   9279  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9280  * any interesting requests and then jump to the real instruction
   9281  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9282  */
   9283     .extern MterpCheckBefore
   9284     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9285     adrl   lr, artMterpAsmInstructionStart + (106 * 128)       @ Addr of primary handler.
   9286     mov    r0, rSELF
   9287     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9288     mov    r2, rPC
   9289     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9290 
   9291 /* ------------------------------ */
   9292     .balign 128
   9293 .L_ALT_op_sput_byte: /* 0x6b */
   9294 /* File: arm/alt_stub.S */
   9295 /*
   9296  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9297  * any interesting requests and then jump to the real instruction
   9298  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9299  */
   9300     .extern MterpCheckBefore
   9301     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9302     adrl   lr, artMterpAsmInstructionStart + (107 * 128)       @ Addr of primary handler.
   9303     mov    r0, rSELF
   9304     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9305     mov    r2, rPC
   9306     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9307 
   9308 /* ------------------------------ */
   9309     .balign 128
   9310 .L_ALT_op_sput_char: /* 0x6c */
   9311 /* File: arm/alt_stub.S */
   9312 /*
   9313  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9314  * any interesting requests and then jump to the real instruction
   9315  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9316  */
   9317     .extern MterpCheckBefore
   9318     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9319     adrl   lr, artMterpAsmInstructionStart + (108 * 128)       @ Addr of primary handler.
   9320     mov    r0, rSELF
   9321     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9322     mov    r2, rPC
   9323     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9324 
   9325 /* ------------------------------ */
   9326     .balign 128
   9327 .L_ALT_op_sput_short: /* 0x6d */
   9328 /* File: arm/alt_stub.S */
   9329 /*
   9330  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9331  * any interesting requests and then jump to the real instruction
   9332  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9333  */
   9334     .extern MterpCheckBefore
   9335     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9336     adrl   lr, artMterpAsmInstructionStart + (109 * 128)       @ Addr of primary handler.
   9337     mov    r0, rSELF
   9338     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9339     mov    r2, rPC
   9340     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9341 
   9342 /* ------------------------------ */
   9343     .balign 128
   9344 .L_ALT_op_invoke_virtual: /* 0x6e */
   9345 /* File: arm/alt_stub.S */
   9346 /*
   9347  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9348  * any interesting requests and then jump to the real instruction
   9349  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9350  */
   9351     .extern MterpCheckBefore
   9352     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9353     adrl   lr, artMterpAsmInstructionStart + (110 * 128)       @ Addr of primary handler.
   9354     mov    r0, rSELF
   9355     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9356     mov    r2, rPC
   9357     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9358 
   9359 /* ------------------------------ */
   9360     .balign 128
   9361 .L_ALT_op_invoke_super: /* 0x6f */
   9362 /* File: arm/alt_stub.S */
   9363 /*
   9364  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9365  * any interesting requests and then jump to the real instruction
   9366  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9367  */
   9368     .extern MterpCheckBefore
   9369     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9370     adrl   lr, artMterpAsmInstructionStart + (111 * 128)       @ Addr of primary handler.
   9371     mov    r0, rSELF
   9372     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9373     mov    r2, rPC
   9374     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9375 
   9376 /* ------------------------------ */
   9377     .balign 128
   9378 .L_ALT_op_invoke_direct: /* 0x70 */
   9379 /* File: arm/alt_stub.S */
   9380 /*
   9381  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9382  * any interesting requests and then jump to the real instruction
   9383  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9384  */
   9385     .extern MterpCheckBefore
   9386     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9387     adrl   lr, artMterpAsmInstructionStart + (112 * 128)       @ Addr of primary handler.
   9388     mov    r0, rSELF
   9389     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9390     mov    r2, rPC
   9391     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9392 
   9393 /* ------------------------------ */
   9394     .balign 128
   9395 .L_ALT_op_invoke_static: /* 0x71 */
   9396 /* File: arm/alt_stub.S */
   9397 /*
   9398  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9399  * any interesting requests and then jump to the real instruction
   9400  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9401  */
   9402     .extern MterpCheckBefore
   9403     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9404     adrl   lr, artMterpAsmInstructionStart + (113 * 128)       @ Addr of primary handler.
   9405     mov    r0, rSELF
   9406     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9407     mov    r2, rPC
   9408     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9409 
   9410 /* ------------------------------ */
   9411     .balign 128
   9412 .L_ALT_op_invoke_interface: /* 0x72 */
   9413 /* File: arm/alt_stub.S */
   9414 /*
   9415  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9416  * any interesting requests and then jump to the real instruction
   9417  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9418  */
   9419     .extern MterpCheckBefore
   9420     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9421     adrl   lr, artMterpAsmInstructionStart + (114 * 128)       @ Addr of primary handler.
   9422     mov    r0, rSELF
   9423     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9424     mov    r2, rPC
   9425     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9426 
   9427 /* ------------------------------ */
   9428     .balign 128
   9429 .L_ALT_op_return_void_no_barrier: /* 0x73 */
   9430 /* File: arm/alt_stub.S */
   9431 /*
   9432  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9433  * any interesting requests and then jump to the real instruction
   9434  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9435  */
   9436     .extern MterpCheckBefore
   9437     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9438     adrl   lr, artMterpAsmInstructionStart + (115 * 128)       @ Addr of primary handler.
   9439     mov    r0, rSELF
   9440     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9441     mov    r2, rPC
   9442     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9443 
   9444 /* ------------------------------ */
   9445     .balign 128
   9446 .L_ALT_op_invoke_virtual_range: /* 0x74 */
   9447 /* File: arm/alt_stub.S */
   9448 /*
   9449  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9450  * any interesting requests and then jump to the real instruction
   9451  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9452  */
   9453     .extern MterpCheckBefore
   9454     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9455     adrl   lr, artMterpAsmInstructionStart + (116 * 128)       @ Addr of primary handler.
   9456     mov    r0, rSELF
   9457     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9458     mov    r2, rPC
   9459     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9460 
   9461 /* ------------------------------ */
   9462     .balign 128
   9463 .L_ALT_op_invoke_super_range: /* 0x75 */
   9464 /* File: arm/alt_stub.S */
   9465 /*
   9466  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9467  * any interesting requests and then jump to the real instruction
   9468  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9469  */
   9470     .extern MterpCheckBefore
   9471     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9472     adrl   lr, artMterpAsmInstructionStart + (117 * 128)       @ Addr of primary handler.
   9473     mov    r0, rSELF
   9474     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9475     mov    r2, rPC
   9476     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9477 
   9478 /* ------------------------------ */
   9479     .balign 128
   9480 .L_ALT_op_invoke_direct_range: /* 0x76 */
   9481 /* File: arm/alt_stub.S */
   9482 /*
   9483  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9484  * any interesting requests and then jump to the real instruction
   9485  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9486  */
   9487     .extern MterpCheckBefore
   9488     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9489     adrl   lr, artMterpAsmInstructionStart + (118 * 128)       @ Addr of primary handler.
   9490     mov    r0, rSELF
   9491     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9492     mov    r2, rPC
   9493     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9494 
   9495 /* ------------------------------ */
   9496     .balign 128
   9497 .L_ALT_op_invoke_static_range: /* 0x77 */
   9498 /* File: arm/alt_stub.S */
   9499 /*
   9500  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9501  * any interesting requests and then jump to the real instruction
   9502  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9503  */
   9504     .extern MterpCheckBefore
   9505     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9506     adrl   lr, artMterpAsmInstructionStart + (119 * 128)       @ Addr of primary handler.
   9507     mov    r0, rSELF
   9508     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9509     mov    r2, rPC
   9510     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9511 
   9512 /* ------------------------------ */
   9513     .balign 128
   9514 .L_ALT_op_invoke_interface_range: /* 0x78 */
   9515 /* File: arm/alt_stub.S */
   9516 /*
   9517  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9518  * any interesting requests and then jump to the real instruction
   9519  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9520  */
   9521     .extern MterpCheckBefore
   9522     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9523     adrl   lr, artMterpAsmInstructionStart + (120 * 128)       @ Addr of primary handler.
   9524     mov    r0, rSELF
   9525     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9526     mov    r2, rPC
   9527     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9528 
   9529 /* ------------------------------ */
   9530     .balign 128
   9531 .L_ALT_op_unused_79: /* 0x79 */
   9532 /* File: arm/alt_stub.S */
   9533 /*
   9534  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9535  * any interesting requests and then jump to the real instruction
   9536  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9537  */
   9538     .extern MterpCheckBefore
   9539     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9540     adrl   lr, artMterpAsmInstructionStart + (121 * 128)       @ Addr of primary handler.
   9541     mov    r0, rSELF
   9542     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9543     mov    r2, rPC
   9544     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9545 
   9546 /* ------------------------------ */
   9547     .balign 128
   9548 .L_ALT_op_unused_7a: /* 0x7a */
   9549 /* File: arm/alt_stub.S */
   9550 /*
   9551  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9552  * any interesting requests and then jump to the real instruction
   9553  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9554  */
   9555     .extern MterpCheckBefore
   9556     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9557     adrl   lr, artMterpAsmInstructionStart + (122 * 128)       @ Addr of primary handler.
   9558     mov    r0, rSELF
   9559     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9560     mov    r2, rPC
   9561     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9562 
   9563 /* ------------------------------ */
   9564     .balign 128
   9565 .L_ALT_op_neg_int: /* 0x7b */
   9566 /* File: arm/alt_stub.S */
   9567 /*
   9568  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9569  * any interesting requests and then jump to the real instruction
   9570  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9571  */
   9572     .extern MterpCheckBefore
   9573     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9574     adrl   lr, artMterpAsmInstructionStart + (123 * 128)       @ Addr of primary handler.
   9575     mov    r0, rSELF
   9576     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9577     mov    r2, rPC
   9578     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9579 
   9580 /* ------------------------------ */
   9581     .balign 128
   9582 .L_ALT_op_not_int: /* 0x7c */
   9583 /* File: arm/alt_stub.S */
   9584 /*
   9585  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9586  * any interesting requests and then jump to the real instruction
   9587  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9588  */
   9589     .extern MterpCheckBefore
   9590     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9591     adrl   lr, artMterpAsmInstructionStart + (124 * 128)       @ Addr of primary handler.
   9592     mov    r0, rSELF
   9593     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9594     mov    r2, rPC
   9595     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9596 
   9597 /* ------------------------------ */
   9598     .balign 128
   9599 .L_ALT_op_neg_long: /* 0x7d */
   9600 /* File: arm/alt_stub.S */
   9601 /*
   9602  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9603  * any interesting requests and then jump to the real instruction
   9604  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9605  */
   9606     .extern MterpCheckBefore
   9607     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9608     adrl   lr, artMterpAsmInstructionStart + (125 * 128)       @ Addr of primary handler.
   9609     mov    r0, rSELF
   9610     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9611     mov    r2, rPC
   9612     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9613 
   9614 /* ------------------------------ */
   9615     .balign 128
   9616 .L_ALT_op_not_long: /* 0x7e */
   9617 /* File: arm/alt_stub.S */
   9618 /*
   9619  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9620  * any interesting requests and then jump to the real instruction
   9621  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9622  */
   9623     .extern MterpCheckBefore
   9624     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9625     adrl   lr, artMterpAsmInstructionStart + (126 * 128)       @ Addr of primary handler.
   9626     mov    r0, rSELF
   9627     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9628     mov    r2, rPC
   9629     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9630 
   9631 /* ------------------------------ */
   9632     .balign 128
   9633 .L_ALT_op_neg_float: /* 0x7f */
   9634 /* File: arm/alt_stub.S */
   9635 /*
   9636  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9637  * any interesting requests and then jump to the real instruction
   9638  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9639  */
   9640     .extern MterpCheckBefore
   9641     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9642     adrl   lr, artMterpAsmInstructionStart + (127 * 128)       @ Addr of primary handler.
   9643     mov    r0, rSELF
   9644     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9645     mov    r2, rPC
   9646     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9647 
   9648 /* ------------------------------ */
   9649     .balign 128
   9650 .L_ALT_op_neg_double: /* 0x80 */
   9651 /* File: arm/alt_stub.S */
   9652 /*
   9653  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9654  * any interesting requests and then jump to the real instruction
   9655  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9656  */
   9657     .extern MterpCheckBefore
   9658     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9659     adrl   lr, artMterpAsmInstructionStart + (128 * 128)       @ Addr of primary handler.
   9660     mov    r0, rSELF
   9661     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9662     mov    r2, rPC
   9663     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9664 
   9665 /* ------------------------------ */
   9666     .balign 128
   9667 .L_ALT_op_int_to_long: /* 0x81 */
   9668 /* File: arm/alt_stub.S */
   9669 /*
   9670  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9671  * any interesting requests and then jump to the real instruction
   9672  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9673  */
   9674     .extern MterpCheckBefore
   9675     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9676     adrl   lr, artMterpAsmInstructionStart + (129 * 128)       @ Addr of primary handler.
   9677     mov    r0, rSELF
   9678     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9679     mov    r2, rPC
   9680     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9681 
   9682 /* ------------------------------ */
   9683     .balign 128
   9684 .L_ALT_op_int_to_float: /* 0x82 */
   9685 /* File: arm/alt_stub.S */
   9686 /*
   9687  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9688  * any interesting requests and then jump to the real instruction
   9689  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9690  */
   9691     .extern MterpCheckBefore
   9692     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9693     adrl   lr, artMterpAsmInstructionStart + (130 * 128)       @ Addr of primary handler.
   9694     mov    r0, rSELF
   9695     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9696     mov    r2, rPC
   9697     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9698 
   9699 /* ------------------------------ */
   9700     .balign 128
   9701 .L_ALT_op_int_to_double: /* 0x83 */
   9702 /* File: arm/alt_stub.S */
   9703 /*
   9704  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9705  * any interesting requests and then jump to the real instruction
   9706  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9707  */
   9708     .extern MterpCheckBefore
   9709     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9710     adrl   lr, artMterpAsmInstructionStart + (131 * 128)       @ Addr of primary handler.
   9711     mov    r0, rSELF
   9712     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9713     mov    r2, rPC
   9714     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9715 
   9716 /* ------------------------------ */
   9717     .balign 128
   9718 .L_ALT_op_long_to_int: /* 0x84 */
   9719 /* File: arm/alt_stub.S */
   9720 /*
   9721  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9722  * any interesting requests and then jump to the real instruction
   9723  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9724  */
   9725     .extern MterpCheckBefore
   9726     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9727     adrl   lr, artMterpAsmInstructionStart + (132 * 128)       @ Addr of primary handler.
   9728     mov    r0, rSELF
   9729     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9730     mov    r2, rPC
   9731     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9732 
   9733 /* ------------------------------ */
   9734     .balign 128
   9735 .L_ALT_op_long_to_float: /* 0x85 */
   9736 /* File: arm/alt_stub.S */
   9737 /*
   9738  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9739  * any interesting requests and then jump to the real instruction
   9740  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9741  */
   9742     .extern MterpCheckBefore
   9743     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9744     adrl   lr, artMterpAsmInstructionStart + (133 * 128)       @ Addr of primary handler.
   9745     mov    r0, rSELF
   9746     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9747     mov    r2, rPC
   9748     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9749 
   9750 /* ------------------------------ */
   9751     .balign 128
   9752 .L_ALT_op_long_to_double: /* 0x86 */
   9753 /* File: arm/alt_stub.S */
   9754 /*
   9755  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9756  * any interesting requests and then jump to the real instruction
   9757  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9758  */
   9759     .extern MterpCheckBefore
   9760     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9761     adrl   lr, artMterpAsmInstructionStart + (134 * 128)       @ Addr of primary handler.
   9762     mov    r0, rSELF
   9763     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9764     mov    r2, rPC
   9765     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9766 
   9767 /* ------------------------------ */
   9768     .balign 128
   9769 .L_ALT_op_float_to_int: /* 0x87 */
   9770 /* File: arm/alt_stub.S */
   9771 /*
   9772  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9773  * any interesting requests and then jump to the real instruction
   9774  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9775  */
   9776     .extern MterpCheckBefore
   9777     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9778     adrl   lr, artMterpAsmInstructionStart + (135 * 128)       @ Addr of primary handler.
   9779     mov    r0, rSELF
   9780     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9781     mov    r2, rPC
   9782     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9783 
   9784 /* ------------------------------ */
   9785     .balign 128
   9786 .L_ALT_op_float_to_long: /* 0x88 */
   9787 /* File: arm/alt_stub.S */
   9788 /*
   9789  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9790  * any interesting requests and then jump to the real instruction
   9791  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9792  */
   9793     .extern MterpCheckBefore
   9794     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9795     adrl   lr, artMterpAsmInstructionStart + (136 * 128)       @ Addr of primary handler.
   9796     mov    r0, rSELF
   9797     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9798     mov    r2, rPC
   9799     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9800 
   9801 /* ------------------------------ */
   9802     .balign 128
   9803 .L_ALT_op_float_to_double: /* 0x89 */
   9804 /* File: arm/alt_stub.S */
   9805 /*
   9806  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9807  * any interesting requests and then jump to the real instruction
   9808  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9809  */
   9810     .extern MterpCheckBefore
   9811     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9812     adrl   lr, artMterpAsmInstructionStart + (137 * 128)       @ Addr of primary handler.
   9813     mov    r0, rSELF
   9814     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9815     mov    r2, rPC
   9816     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9817 
   9818 /* ------------------------------ */
   9819     .balign 128
   9820 .L_ALT_op_double_to_int: /* 0x8a */
   9821 /* File: arm/alt_stub.S */
   9822 /*
   9823  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9824  * any interesting requests and then jump to the real instruction
   9825  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9826  */
   9827     .extern MterpCheckBefore
   9828     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9829     adrl   lr, artMterpAsmInstructionStart + (138 * 128)       @ Addr of primary handler.
   9830     mov    r0, rSELF
   9831     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9832     mov    r2, rPC
   9833     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9834 
   9835 /* ------------------------------ */
   9836     .balign 128
   9837 .L_ALT_op_double_to_long: /* 0x8b */
   9838 /* File: arm/alt_stub.S */
   9839 /*
   9840  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9841  * any interesting requests and then jump to the real instruction
   9842  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9843  */
   9844     .extern MterpCheckBefore
   9845     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9846     adrl   lr, artMterpAsmInstructionStart + (139 * 128)       @ Addr of primary handler.
   9847     mov    r0, rSELF
   9848     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9849     mov    r2, rPC
   9850     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9851 
   9852 /* ------------------------------ */
   9853     .balign 128
   9854 .L_ALT_op_double_to_float: /* 0x8c */
   9855 /* File: arm/alt_stub.S */
   9856 /*
   9857  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9858  * any interesting requests and then jump to the real instruction
   9859  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9860  */
   9861     .extern MterpCheckBefore
   9862     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9863     adrl   lr, artMterpAsmInstructionStart + (140 * 128)       @ Addr of primary handler.
   9864     mov    r0, rSELF
   9865     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9866     mov    r2, rPC
   9867     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9868 
   9869 /* ------------------------------ */
   9870     .balign 128
   9871 .L_ALT_op_int_to_byte: /* 0x8d */
   9872 /* File: arm/alt_stub.S */
   9873 /*
   9874  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9875  * any interesting requests and then jump to the real instruction
   9876  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9877  */
   9878     .extern MterpCheckBefore
   9879     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9880     adrl   lr, artMterpAsmInstructionStart + (141 * 128)       @ Addr of primary handler.
   9881     mov    r0, rSELF
   9882     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9883     mov    r2, rPC
   9884     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9885 
   9886 /* ------------------------------ */
   9887     .balign 128
   9888 .L_ALT_op_int_to_char: /* 0x8e */
   9889 /* File: arm/alt_stub.S */
   9890 /*
   9891  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9892  * any interesting requests and then jump to the real instruction
   9893  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9894  */
   9895     .extern MterpCheckBefore
   9896     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9897     adrl   lr, artMterpAsmInstructionStart + (142 * 128)       @ Addr of primary handler.
   9898     mov    r0, rSELF
   9899     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9900     mov    r2, rPC
   9901     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9902 
   9903 /* ------------------------------ */
   9904     .balign 128
   9905 .L_ALT_op_int_to_short: /* 0x8f */
   9906 /* File: arm/alt_stub.S */
   9907 /*
   9908  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9909  * any interesting requests and then jump to the real instruction
   9910  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9911  */
   9912     .extern MterpCheckBefore
   9913     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9914     adrl   lr, artMterpAsmInstructionStart + (143 * 128)       @ Addr of primary handler.
   9915     mov    r0, rSELF
   9916     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9917     mov    r2, rPC
   9918     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9919 
   9920 /* ------------------------------ */
   9921     .balign 128
   9922 .L_ALT_op_add_int: /* 0x90 */
   9923 /* File: arm/alt_stub.S */
   9924 /*
   9925  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9926  * any interesting requests and then jump to the real instruction
   9927  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9928  */
   9929     .extern MterpCheckBefore
   9930     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9931     adrl   lr, artMterpAsmInstructionStart + (144 * 128)       @ Addr of primary handler.
   9932     mov    r0, rSELF
   9933     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9934     mov    r2, rPC
   9935     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9936 
   9937 /* ------------------------------ */
   9938     .balign 128
   9939 .L_ALT_op_sub_int: /* 0x91 */
   9940 /* File: arm/alt_stub.S */
   9941 /*
   9942  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9943  * any interesting requests and then jump to the real instruction
   9944  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9945  */
   9946     .extern MterpCheckBefore
   9947     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9948     adrl   lr, artMterpAsmInstructionStart + (145 * 128)       @ Addr of primary handler.
   9949     mov    r0, rSELF
   9950     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9951     mov    r2, rPC
   9952     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9953 
   9954 /* ------------------------------ */
   9955     .balign 128
   9956 .L_ALT_op_mul_int: /* 0x92 */
   9957 /* File: arm/alt_stub.S */
   9958 /*
   9959  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9960  * any interesting requests and then jump to the real instruction
   9961  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9962  */
   9963     .extern MterpCheckBefore
   9964     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9965     adrl   lr, artMterpAsmInstructionStart + (146 * 128)       @ Addr of primary handler.
   9966     mov    r0, rSELF
   9967     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9968     mov    r2, rPC
   9969     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9970 
   9971 /* ------------------------------ */
   9972     .balign 128
   9973 .L_ALT_op_div_int: /* 0x93 */
   9974 /* File: arm/alt_stub.S */
   9975 /*
   9976  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9977  * any interesting requests and then jump to the real instruction
   9978  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9979  */
   9980     .extern MterpCheckBefore
   9981     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9982     adrl   lr, artMterpAsmInstructionStart + (147 * 128)       @ Addr of primary handler.
   9983     mov    r0, rSELF
   9984     add    r1, rFP, #OFF_FP_SHADOWFRAME
   9985     mov    r2, rPC
   9986     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   9987 
   9988 /* ------------------------------ */
   9989     .balign 128
   9990 .L_ALT_op_rem_int: /* 0x94 */
   9991 /* File: arm/alt_stub.S */
   9992 /*
   9993  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   9994  * any interesting requests and then jump to the real instruction
   9995  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   9996  */
   9997     .extern MterpCheckBefore
   9998     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   9999     adrl   lr, artMterpAsmInstructionStart + (148 * 128)       @ Addr of primary handler.
   10000     mov    r0, rSELF
   10001     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10002     mov    r2, rPC
   10003     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10004 
   10005 /* ------------------------------ */
   10006     .balign 128
   10007 .L_ALT_op_and_int: /* 0x95 */
   10008 /* File: arm/alt_stub.S */
   10009 /*
   10010  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10011  * any interesting requests and then jump to the real instruction
   10012  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10013  */
   10014     .extern MterpCheckBefore
   10015     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10016     adrl   lr, artMterpAsmInstructionStart + (149 * 128)       @ Addr of primary handler.
   10017     mov    r0, rSELF
   10018     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10019     mov    r2, rPC
   10020     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10021 
   10022 /* ------------------------------ */
   10023     .balign 128
   10024 .L_ALT_op_or_int: /* 0x96 */
   10025 /* File: arm/alt_stub.S */
   10026 /*
   10027  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10028  * any interesting requests and then jump to the real instruction
   10029  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10030  */
   10031     .extern MterpCheckBefore
   10032     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10033     adrl   lr, artMterpAsmInstructionStart + (150 * 128)       @ Addr of primary handler.
   10034     mov    r0, rSELF
   10035     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10036     mov    r2, rPC
   10037     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10038 
   10039 /* ------------------------------ */
   10040     .balign 128
   10041 .L_ALT_op_xor_int: /* 0x97 */
   10042 /* File: arm/alt_stub.S */
   10043 /*
   10044  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10045  * any interesting requests and then jump to the real instruction
   10046  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10047  */
   10048     .extern MterpCheckBefore
   10049     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10050     adrl   lr, artMterpAsmInstructionStart + (151 * 128)       @ Addr of primary handler.
   10051     mov    r0, rSELF
   10052     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10053     mov    r2, rPC
   10054     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10055 
   10056 /* ------------------------------ */
   10057     .balign 128
   10058 .L_ALT_op_shl_int: /* 0x98 */
   10059 /* File: arm/alt_stub.S */
   10060 /*
   10061  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10062  * any interesting requests and then jump to the real instruction
   10063  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10064  */
   10065     .extern MterpCheckBefore
   10066     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10067     adrl   lr, artMterpAsmInstructionStart + (152 * 128)       @ Addr of primary handler.
   10068     mov    r0, rSELF
   10069     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10070     mov    r2, rPC
   10071     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10072 
   10073 /* ------------------------------ */
   10074     .balign 128
   10075 .L_ALT_op_shr_int: /* 0x99 */
   10076 /* File: arm/alt_stub.S */
   10077 /*
   10078  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10079  * any interesting requests and then jump to the real instruction
   10080  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10081  */
   10082     .extern MterpCheckBefore
   10083     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10084     adrl   lr, artMterpAsmInstructionStart + (153 * 128)       @ Addr of primary handler.
   10085     mov    r0, rSELF
   10086     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10087     mov    r2, rPC
   10088     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10089 
   10090 /* ------------------------------ */
   10091     .balign 128
   10092 .L_ALT_op_ushr_int: /* 0x9a */
   10093 /* File: arm/alt_stub.S */
   10094 /*
   10095  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10096  * any interesting requests and then jump to the real instruction
   10097  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10098  */
   10099     .extern MterpCheckBefore
   10100     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10101     adrl   lr, artMterpAsmInstructionStart + (154 * 128)       @ Addr of primary handler.
   10102     mov    r0, rSELF
   10103     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10104     mov    r2, rPC
   10105     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10106 
   10107 /* ------------------------------ */
   10108     .balign 128
   10109 .L_ALT_op_add_long: /* 0x9b */
   10110 /* File: arm/alt_stub.S */
   10111 /*
   10112  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10113  * any interesting requests and then jump to the real instruction
   10114  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10115  */
   10116     .extern MterpCheckBefore
   10117     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10118     adrl   lr, artMterpAsmInstructionStart + (155 * 128)       @ Addr of primary handler.
   10119     mov    r0, rSELF
   10120     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10121     mov    r2, rPC
   10122     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10123 
   10124 /* ------------------------------ */
   10125     .balign 128
   10126 .L_ALT_op_sub_long: /* 0x9c */
   10127 /* File: arm/alt_stub.S */
   10128 /*
   10129  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10130  * any interesting requests and then jump to the real instruction
   10131  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10132  */
   10133     .extern MterpCheckBefore
   10134     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10135     adrl   lr, artMterpAsmInstructionStart + (156 * 128)       @ Addr of primary handler.
   10136     mov    r0, rSELF
   10137     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10138     mov    r2, rPC
   10139     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10140 
   10141 /* ------------------------------ */
   10142     .balign 128
   10143 .L_ALT_op_mul_long: /* 0x9d */
   10144 /* File: arm/alt_stub.S */
   10145 /*
   10146  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10147  * any interesting requests and then jump to the real instruction
   10148  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10149  */
   10150     .extern MterpCheckBefore
   10151     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10152     adrl   lr, artMterpAsmInstructionStart + (157 * 128)       @ Addr of primary handler.
   10153     mov    r0, rSELF
   10154     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10155     mov    r2, rPC
   10156     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10157 
   10158 /* ------------------------------ */
   10159     .balign 128
   10160 .L_ALT_op_div_long: /* 0x9e */
   10161 /* File: arm/alt_stub.S */
   10162 /*
   10163  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10164  * any interesting requests and then jump to the real instruction
   10165  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10166  */
   10167     .extern MterpCheckBefore
   10168     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10169     adrl   lr, artMterpAsmInstructionStart + (158 * 128)       @ Addr of primary handler.
   10170     mov    r0, rSELF
   10171     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10172     mov    r2, rPC
   10173     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10174 
   10175 /* ------------------------------ */
   10176     .balign 128
   10177 .L_ALT_op_rem_long: /* 0x9f */
   10178 /* File: arm/alt_stub.S */
   10179 /*
   10180  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10181  * any interesting requests and then jump to the real instruction
   10182  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10183  */
   10184     .extern MterpCheckBefore
   10185     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10186     adrl   lr, artMterpAsmInstructionStart + (159 * 128)       @ Addr of primary handler.
   10187     mov    r0, rSELF
   10188     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10189     mov    r2, rPC
   10190     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10191 
   10192 /* ------------------------------ */
   10193     .balign 128
   10194 .L_ALT_op_and_long: /* 0xa0 */
   10195 /* File: arm/alt_stub.S */
   10196 /*
   10197  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10198  * any interesting requests and then jump to the real instruction
   10199  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10200  */
   10201     .extern MterpCheckBefore
   10202     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10203     adrl   lr, artMterpAsmInstructionStart + (160 * 128)       @ Addr of primary handler.
   10204     mov    r0, rSELF
   10205     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10206     mov    r2, rPC
   10207     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10208 
   10209 /* ------------------------------ */
   10210     .balign 128
   10211 .L_ALT_op_or_long: /* 0xa1 */
   10212 /* File: arm/alt_stub.S */
   10213 /*
   10214  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10215  * any interesting requests and then jump to the real instruction
   10216  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10217  */
   10218     .extern MterpCheckBefore
   10219     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10220     adrl   lr, artMterpAsmInstructionStart + (161 * 128)       @ Addr of primary handler.
   10221     mov    r0, rSELF
   10222     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10223     mov    r2, rPC
   10224     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10225 
   10226 /* ------------------------------ */
   10227     .balign 128
   10228 .L_ALT_op_xor_long: /* 0xa2 */
   10229 /* File: arm/alt_stub.S */
   10230 /*
   10231  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10232  * any interesting requests and then jump to the real instruction
   10233  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10234  */
   10235     .extern MterpCheckBefore
   10236     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10237     adrl   lr, artMterpAsmInstructionStart + (162 * 128)       @ Addr of primary handler.
   10238     mov    r0, rSELF
   10239     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10240     mov    r2, rPC
   10241     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10242 
   10243 /* ------------------------------ */
   10244     .balign 128
   10245 .L_ALT_op_shl_long: /* 0xa3 */
   10246 /* File: arm/alt_stub.S */
   10247 /*
   10248  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10249  * any interesting requests and then jump to the real instruction
   10250  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10251  */
   10252     .extern MterpCheckBefore
   10253     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10254     adrl   lr, artMterpAsmInstructionStart + (163 * 128)       @ Addr of primary handler.
   10255     mov    r0, rSELF
   10256     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10257     mov    r2, rPC
   10258     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10259 
   10260 /* ------------------------------ */
   10261     .balign 128
   10262 .L_ALT_op_shr_long: /* 0xa4 */
   10263 /* File: arm/alt_stub.S */
   10264 /*
   10265  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10266  * any interesting requests and then jump to the real instruction
   10267  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10268  */
   10269     .extern MterpCheckBefore
   10270     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10271     adrl   lr, artMterpAsmInstructionStart + (164 * 128)       @ Addr of primary handler.
   10272     mov    r0, rSELF
   10273     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10274     mov    r2, rPC
   10275     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10276 
   10277 /* ------------------------------ */
   10278     .balign 128
   10279 .L_ALT_op_ushr_long: /* 0xa5 */
   10280 /* File: arm/alt_stub.S */
   10281 /*
   10282  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10283  * any interesting requests and then jump to the real instruction
   10284  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10285  */
   10286     .extern MterpCheckBefore
   10287     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10288     adrl   lr, artMterpAsmInstructionStart + (165 * 128)       @ Addr of primary handler.
   10289     mov    r0, rSELF
   10290     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10291     mov    r2, rPC
   10292     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10293 
   10294 /* ------------------------------ */
   10295     .balign 128
   10296 .L_ALT_op_add_float: /* 0xa6 */
   10297 /* File: arm/alt_stub.S */
   10298 /*
   10299  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10300  * any interesting requests and then jump to the real instruction
   10301  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10302  */
   10303     .extern MterpCheckBefore
   10304     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10305     adrl   lr, artMterpAsmInstructionStart + (166 * 128)       @ Addr of primary handler.
   10306     mov    r0, rSELF
   10307     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10308     mov    r2, rPC
   10309     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10310 
   10311 /* ------------------------------ */
   10312     .balign 128
   10313 .L_ALT_op_sub_float: /* 0xa7 */
   10314 /* File: arm/alt_stub.S */
   10315 /*
   10316  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10317  * any interesting requests and then jump to the real instruction
   10318  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10319  */
   10320     .extern MterpCheckBefore
   10321     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10322     adrl   lr, artMterpAsmInstructionStart + (167 * 128)       @ Addr of primary handler.
   10323     mov    r0, rSELF
   10324     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10325     mov    r2, rPC
   10326     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10327 
   10328 /* ------------------------------ */
   10329     .balign 128
   10330 .L_ALT_op_mul_float: /* 0xa8 */
   10331 /* File: arm/alt_stub.S */
   10332 /*
   10333  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10334  * any interesting requests and then jump to the real instruction
   10335  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10336  */
   10337     .extern MterpCheckBefore
   10338     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10339     adrl   lr, artMterpAsmInstructionStart + (168 * 128)       @ Addr of primary handler.
   10340     mov    r0, rSELF
   10341     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10342     mov    r2, rPC
   10343     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10344 
   10345 /* ------------------------------ */
   10346     .balign 128
   10347 .L_ALT_op_div_float: /* 0xa9 */
   10348 /* File: arm/alt_stub.S */
   10349 /*
   10350  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10351  * any interesting requests and then jump to the real instruction
   10352  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10353  */
   10354     .extern MterpCheckBefore
   10355     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10356     adrl   lr, artMterpAsmInstructionStart + (169 * 128)       @ Addr of primary handler.
   10357     mov    r0, rSELF
   10358     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10359     mov    r2, rPC
   10360     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10361 
   10362 /* ------------------------------ */
   10363     .balign 128
   10364 .L_ALT_op_rem_float: /* 0xaa */
   10365 /* File: arm/alt_stub.S */
   10366 /*
   10367  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10368  * any interesting requests and then jump to the real instruction
   10369  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10370  */
   10371     .extern MterpCheckBefore
   10372     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10373     adrl   lr, artMterpAsmInstructionStart + (170 * 128)       @ Addr of primary handler.
   10374     mov    r0, rSELF
   10375     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10376     mov    r2, rPC
   10377     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10378 
   10379 /* ------------------------------ */
   10380     .balign 128
   10381 .L_ALT_op_add_double: /* 0xab */
   10382 /* File: arm/alt_stub.S */
   10383 /*
   10384  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10385  * any interesting requests and then jump to the real instruction
   10386  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10387  */
   10388     .extern MterpCheckBefore
   10389     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10390     adrl   lr, artMterpAsmInstructionStart + (171 * 128)       @ Addr of primary handler.
   10391     mov    r0, rSELF
   10392     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10393     mov    r2, rPC
   10394     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10395 
   10396 /* ------------------------------ */
   10397     .balign 128
   10398 .L_ALT_op_sub_double: /* 0xac */
   10399 /* File: arm/alt_stub.S */
   10400 /*
   10401  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10402  * any interesting requests and then jump to the real instruction
   10403  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10404  */
   10405     .extern MterpCheckBefore
   10406     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10407     adrl   lr, artMterpAsmInstructionStart + (172 * 128)       @ Addr of primary handler.
   10408     mov    r0, rSELF
   10409     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10410     mov    r2, rPC
   10411     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10412 
   10413 /* ------------------------------ */
   10414     .balign 128
   10415 .L_ALT_op_mul_double: /* 0xad */
   10416 /* File: arm/alt_stub.S */
   10417 /*
   10418  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10419  * any interesting requests and then jump to the real instruction
   10420  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10421  */
   10422     .extern MterpCheckBefore
   10423     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10424     adrl   lr, artMterpAsmInstructionStart + (173 * 128)       @ Addr of primary handler.
   10425     mov    r0, rSELF
   10426     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10427     mov    r2, rPC
   10428     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10429 
   10430 /* ------------------------------ */
   10431     .balign 128
   10432 .L_ALT_op_div_double: /* 0xae */
   10433 /* File: arm/alt_stub.S */
   10434 /*
   10435  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10436  * any interesting requests and then jump to the real instruction
   10437  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10438  */
   10439     .extern MterpCheckBefore
   10440     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10441     adrl   lr, artMterpAsmInstructionStart + (174 * 128)       @ Addr of primary handler.
   10442     mov    r0, rSELF
   10443     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10444     mov    r2, rPC
   10445     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10446 
   10447 /* ------------------------------ */
   10448     .balign 128
   10449 .L_ALT_op_rem_double: /* 0xaf */
   10450 /* File: arm/alt_stub.S */
   10451 /*
   10452  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10453  * any interesting requests and then jump to the real instruction
   10454  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10455  */
   10456     .extern MterpCheckBefore
   10457     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10458     adrl   lr, artMterpAsmInstructionStart + (175 * 128)       @ Addr of primary handler.
   10459     mov    r0, rSELF
   10460     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10461     mov    r2, rPC
   10462     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10463 
   10464 /* ------------------------------ */
   10465     .balign 128
   10466 .L_ALT_op_add_int_2addr: /* 0xb0 */
   10467 /* File: arm/alt_stub.S */
   10468 /*
   10469  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10470  * any interesting requests and then jump to the real instruction
   10471  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10472  */
   10473     .extern MterpCheckBefore
   10474     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10475     adrl   lr, artMterpAsmInstructionStart + (176 * 128)       @ Addr of primary handler.
   10476     mov    r0, rSELF
   10477     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10478     mov    r2, rPC
   10479     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10480 
   10481 /* ------------------------------ */
   10482     .balign 128
   10483 .L_ALT_op_sub_int_2addr: /* 0xb1 */
   10484 /* File: arm/alt_stub.S */
   10485 /*
   10486  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10487  * any interesting requests and then jump to the real instruction
   10488  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10489  */
   10490     .extern MterpCheckBefore
   10491     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10492     adrl   lr, artMterpAsmInstructionStart + (177 * 128)       @ Addr of primary handler.
   10493     mov    r0, rSELF
   10494     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10495     mov    r2, rPC
   10496     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10497 
   10498 /* ------------------------------ */
   10499     .balign 128
   10500 .L_ALT_op_mul_int_2addr: /* 0xb2 */
   10501 /* File: arm/alt_stub.S */
   10502 /*
   10503  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10504  * any interesting requests and then jump to the real instruction
   10505  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10506  */
   10507     .extern MterpCheckBefore
   10508     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10509     adrl   lr, artMterpAsmInstructionStart + (178 * 128)       @ Addr of primary handler.
   10510     mov    r0, rSELF
   10511     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10512     mov    r2, rPC
   10513     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10514 
   10515 /* ------------------------------ */
   10516     .balign 128
   10517 .L_ALT_op_div_int_2addr: /* 0xb3 */
   10518 /* File: arm/alt_stub.S */
   10519 /*
   10520  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10521  * any interesting requests and then jump to the real instruction
   10522  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10523  */
   10524     .extern MterpCheckBefore
   10525     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10526     adrl   lr, artMterpAsmInstructionStart + (179 * 128)       @ Addr of primary handler.
   10527     mov    r0, rSELF
   10528     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10529     mov    r2, rPC
   10530     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10531 
   10532 /* ------------------------------ */
   10533     .balign 128
   10534 .L_ALT_op_rem_int_2addr: /* 0xb4 */
   10535 /* File: arm/alt_stub.S */
   10536 /*
   10537  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10538  * any interesting requests and then jump to the real instruction
   10539  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10540  */
   10541     .extern MterpCheckBefore
   10542     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10543     adrl   lr, artMterpAsmInstructionStart + (180 * 128)       @ Addr of primary handler.
   10544     mov    r0, rSELF
   10545     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10546     mov    r2, rPC
   10547     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10548 
   10549 /* ------------------------------ */
   10550     .balign 128
   10551 .L_ALT_op_and_int_2addr: /* 0xb5 */
   10552 /* File: arm/alt_stub.S */
   10553 /*
   10554  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10555  * any interesting requests and then jump to the real instruction
   10556  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10557  */
   10558     .extern MterpCheckBefore
   10559     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10560     adrl   lr, artMterpAsmInstructionStart + (181 * 128)       @ Addr of primary handler.
   10561     mov    r0, rSELF
   10562     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10563     mov    r2, rPC
   10564     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10565 
   10566 /* ------------------------------ */
   10567     .balign 128
   10568 .L_ALT_op_or_int_2addr: /* 0xb6 */
   10569 /* File: arm/alt_stub.S */
   10570 /*
   10571  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10572  * any interesting requests and then jump to the real instruction
   10573  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10574  */
   10575     .extern MterpCheckBefore
   10576     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10577     adrl   lr, artMterpAsmInstructionStart + (182 * 128)       @ Addr of primary handler.
   10578     mov    r0, rSELF
   10579     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10580     mov    r2, rPC
   10581     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10582 
   10583 /* ------------------------------ */
   10584     .balign 128
   10585 .L_ALT_op_xor_int_2addr: /* 0xb7 */
   10586 /* File: arm/alt_stub.S */
   10587 /*
   10588  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10589  * any interesting requests and then jump to the real instruction
   10590  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10591  */
   10592     .extern MterpCheckBefore
   10593     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10594     adrl   lr, artMterpAsmInstructionStart + (183 * 128)       @ Addr of primary handler.
   10595     mov    r0, rSELF
   10596     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10597     mov    r2, rPC
   10598     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10599 
   10600 /* ------------------------------ */
   10601     .balign 128
   10602 .L_ALT_op_shl_int_2addr: /* 0xb8 */
   10603 /* File: arm/alt_stub.S */
   10604 /*
   10605  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10606  * any interesting requests and then jump to the real instruction
   10607  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10608  */
   10609     .extern MterpCheckBefore
   10610     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10611     adrl   lr, artMterpAsmInstructionStart + (184 * 128)       @ Addr of primary handler.
   10612     mov    r0, rSELF
   10613     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10614     mov    r2, rPC
   10615     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10616 
   10617 /* ------------------------------ */
   10618     .balign 128
   10619 .L_ALT_op_shr_int_2addr: /* 0xb9 */
   10620 /* File: arm/alt_stub.S */
   10621 /*
   10622  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10623  * any interesting requests and then jump to the real instruction
   10624  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10625  */
   10626     .extern MterpCheckBefore
   10627     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10628     adrl   lr, artMterpAsmInstructionStart + (185 * 128)       @ Addr of primary handler.
   10629     mov    r0, rSELF
   10630     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10631     mov    r2, rPC
   10632     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10633 
   10634 /* ------------------------------ */
   10635     .balign 128
   10636 .L_ALT_op_ushr_int_2addr: /* 0xba */
   10637 /* File: arm/alt_stub.S */
   10638 /*
   10639  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10640  * any interesting requests and then jump to the real instruction
   10641  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10642  */
   10643     .extern MterpCheckBefore
   10644     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10645     adrl   lr, artMterpAsmInstructionStart + (186 * 128)       @ Addr of primary handler.
   10646     mov    r0, rSELF
   10647     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10648     mov    r2, rPC
   10649     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10650 
   10651 /* ------------------------------ */
   10652     .balign 128
   10653 .L_ALT_op_add_long_2addr: /* 0xbb */
   10654 /* File: arm/alt_stub.S */
   10655 /*
   10656  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10657  * any interesting requests and then jump to the real instruction
   10658  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10659  */
   10660     .extern MterpCheckBefore
   10661     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10662     adrl   lr, artMterpAsmInstructionStart + (187 * 128)       @ Addr of primary handler.
   10663     mov    r0, rSELF
   10664     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10665     mov    r2, rPC
   10666     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10667 
   10668 /* ------------------------------ */
   10669     .balign 128
   10670 .L_ALT_op_sub_long_2addr: /* 0xbc */
   10671 /* File: arm/alt_stub.S */
   10672 /*
   10673  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10674  * any interesting requests and then jump to the real instruction
   10675  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10676  */
   10677     .extern MterpCheckBefore
   10678     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10679     adrl   lr, artMterpAsmInstructionStart + (188 * 128)       @ Addr of primary handler.
   10680     mov    r0, rSELF
   10681     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10682     mov    r2, rPC
   10683     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10684 
   10685 /* ------------------------------ */
   10686     .balign 128
   10687 .L_ALT_op_mul_long_2addr: /* 0xbd */
   10688 /* File: arm/alt_stub.S */
   10689 /*
   10690  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10691  * any interesting requests and then jump to the real instruction
   10692  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10693  */
   10694     .extern MterpCheckBefore
   10695     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10696     adrl   lr, artMterpAsmInstructionStart + (189 * 128)       @ Addr of primary handler.
   10697     mov    r0, rSELF
   10698     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10699     mov    r2, rPC
   10700     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10701 
   10702 /* ------------------------------ */
   10703     .balign 128
   10704 .L_ALT_op_div_long_2addr: /* 0xbe */
   10705 /* File: arm/alt_stub.S */
   10706 /*
   10707  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10708  * any interesting requests and then jump to the real instruction
   10709  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10710  */
   10711     .extern MterpCheckBefore
   10712     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10713     adrl   lr, artMterpAsmInstructionStart + (190 * 128)       @ Addr of primary handler.
   10714     mov    r0, rSELF
   10715     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10716     mov    r2, rPC
   10717     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10718 
   10719 /* ------------------------------ */
   10720     .balign 128
   10721 .L_ALT_op_rem_long_2addr: /* 0xbf */
   10722 /* File: arm/alt_stub.S */
   10723 /*
   10724  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10725  * any interesting requests and then jump to the real instruction
   10726  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10727  */
   10728     .extern MterpCheckBefore
   10729     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10730     adrl   lr, artMterpAsmInstructionStart + (191 * 128)       @ Addr of primary handler.
   10731     mov    r0, rSELF
   10732     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10733     mov    r2, rPC
   10734     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10735 
   10736 /* ------------------------------ */
   10737     .balign 128
   10738 .L_ALT_op_and_long_2addr: /* 0xc0 */
   10739 /* File: arm/alt_stub.S */
   10740 /*
   10741  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10742  * any interesting requests and then jump to the real instruction
   10743  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10744  */
   10745     .extern MterpCheckBefore
   10746     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10747     adrl   lr, artMterpAsmInstructionStart + (192 * 128)       @ Addr of primary handler.
   10748     mov    r0, rSELF
   10749     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10750     mov    r2, rPC
   10751     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10752 
   10753 /* ------------------------------ */
   10754     .balign 128
   10755 .L_ALT_op_or_long_2addr: /* 0xc1 */
   10756 /* File: arm/alt_stub.S */
   10757 /*
   10758  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10759  * any interesting requests and then jump to the real instruction
   10760  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10761  */
   10762     .extern MterpCheckBefore
   10763     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10764     adrl   lr, artMterpAsmInstructionStart + (193 * 128)       @ Addr of primary handler.
   10765     mov    r0, rSELF
   10766     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10767     mov    r2, rPC
   10768     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10769 
   10770 /* ------------------------------ */
   10771     .balign 128
   10772 .L_ALT_op_xor_long_2addr: /* 0xc2 */
   10773 /* File: arm/alt_stub.S */
   10774 /*
   10775  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10776  * any interesting requests and then jump to the real instruction
   10777  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10778  */
   10779     .extern MterpCheckBefore
   10780     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10781     adrl   lr, artMterpAsmInstructionStart + (194 * 128)       @ Addr of primary handler.
   10782     mov    r0, rSELF
   10783     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10784     mov    r2, rPC
   10785     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10786 
   10787 /* ------------------------------ */
   10788     .balign 128
   10789 .L_ALT_op_shl_long_2addr: /* 0xc3 */
   10790 /* File: arm/alt_stub.S */
   10791 /*
   10792  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10793  * any interesting requests and then jump to the real instruction
   10794  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10795  */
   10796     .extern MterpCheckBefore
   10797     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10798     adrl   lr, artMterpAsmInstructionStart + (195 * 128)       @ Addr of primary handler.
   10799     mov    r0, rSELF
   10800     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10801     mov    r2, rPC
   10802     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10803 
   10804 /* ------------------------------ */
   10805     .balign 128
   10806 .L_ALT_op_shr_long_2addr: /* 0xc4 */
   10807 /* File: arm/alt_stub.S */
   10808 /*
   10809  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10810  * any interesting requests and then jump to the real instruction
   10811  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10812  */
   10813     .extern MterpCheckBefore
   10814     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10815     adrl   lr, artMterpAsmInstructionStart + (196 * 128)       @ Addr of primary handler.
   10816     mov    r0, rSELF
   10817     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10818     mov    r2, rPC
   10819     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10820 
   10821 /* ------------------------------ */
   10822     .balign 128
   10823 .L_ALT_op_ushr_long_2addr: /* 0xc5 */
   10824 /* File: arm/alt_stub.S */
   10825 /*
   10826  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10827  * any interesting requests and then jump to the real instruction
   10828  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10829  */
   10830     .extern MterpCheckBefore
   10831     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10832     adrl   lr, artMterpAsmInstructionStart + (197 * 128)       @ Addr of primary handler.
   10833     mov    r0, rSELF
   10834     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10835     mov    r2, rPC
   10836     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10837 
   10838 /* ------------------------------ */
   10839     .balign 128
   10840 .L_ALT_op_add_float_2addr: /* 0xc6 */
   10841 /* File: arm/alt_stub.S */
   10842 /*
   10843  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10844  * any interesting requests and then jump to the real instruction
   10845  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10846  */
   10847     .extern MterpCheckBefore
   10848     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10849     adrl   lr, artMterpAsmInstructionStart + (198 * 128)       @ Addr of primary handler.
   10850     mov    r0, rSELF
   10851     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10852     mov    r2, rPC
   10853     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10854 
   10855 /* ------------------------------ */
   10856     .balign 128
   10857 .L_ALT_op_sub_float_2addr: /* 0xc7 */
   10858 /* File: arm/alt_stub.S */
   10859 /*
   10860  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10861  * any interesting requests and then jump to the real instruction
   10862  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10863  */
   10864     .extern MterpCheckBefore
   10865     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10866     adrl   lr, artMterpAsmInstructionStart + (199 * 128)       @ Addr of primary handler.
   10867     mov    r0, rSELF
   10868     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10869     mov    r2, rPC
   10870     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10871 
   10872 /* ------------------------------ */
   10873     .balign 128
   10874 .L_ALT_op_mul_float_2addr: /* 0xc8 */
   10875 /* File: arm/alt_stub.S */
   10876 /*
   10877  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10878  * any interesting requests and then jump to the real instruction
   10879  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10880  */
   10881     .extern MterpCheckBefore
   10882     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10883     adrl   lr, artMterpAsmInstructionStart + (200 * 128)       @ Addr of primary handler.
   10884     mov    r0, rSELF
   10885     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10886     mov    r2, rPC
   10887     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10888 
   10889 /* ------------------------------ */
   10890     .balign 128
   10891 .L_ALT_op_div_float_2addr: /* 0xc9 */
   10892 /* File: arm/alt_stub.S */
   10893 /*
   10894  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10895  * any interesting requests and then jump to the real instruction
   10896  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10897  */
   10898     .extern MterpCheckBefore
   10899     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10900     adrl   lr, artMterpAsmInstructionStart + (201 * 128)       @ Addr of primary handler.
   10901     mov    r0, rSELF
   10902     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10903     mov    r2, rPC
   10904     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10905 
   10906 /* ------------------------------ */
   10907     .balign 128
   10908 .L_ALT_op_rem_float_2addr: /* 0xca */
   10909 /* File: arm/alt_stub.S */
   10910 /*
   10911  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10912  * any interesting requests and then jump to the real instruction
   10913  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10914  */
   10915     .extern MterpCheckBefore
   10916     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10917     adrl   lr, artMterpAsmInstructionStart + (202 * 128)       @ Addr of primary handler.
   10918     mov    r0, rSELF
   10919     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10920     mov    r2, rPC
   10921     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10922 
   10923 /* ------------------------------ */
   10924     .balign 128
   10925 .L_ALT_op_add_double_2addr: /* 0xcb */
   10926 /* File: arm/alt_stub.S */
   10927 /*
   10928  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10929  * any interesting requests and then jump to the real instruction
   10930  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10931  */
   10932     .extern MterpCheckBefore
   10933     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10934     adrl   lr, artMterpAsmInstructionStart + (203 * 128)       @ Addr of primary handler.
   10935     mov    r0, rSELF
   10936     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10937     mov    r2, rPC
   10938     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10939 
   10940 /* ------------------------------ */
   10941     .balign 128
   10942 .L_ALT_op_sub_double_2addr: /* 0xcc */
   10943 /* File: arm/alt_stub.S */
   10944 /*
   10945  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10946  * any interesting requests and then jump to the real instruction
   10947  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10948  */
   10949     .extern MterpCheckBefore
   10950     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10951     adrl   lr, artMterpAsmInstructionStart + (204 * 128)       @ Addr of primary handler.
   10952     mov    r0, rSELF
   10953     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10954     mov    r2, rPC
   10955     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10956 
   10957 /* ------------------------------ */
   10958     .balign 128
   10959 .L_ALT_op_mul_double_2addr: /* 0xcd */
   10960 /* File: arm/alt_stub.S */
   10961 /*
   10962  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10963  * any interesting requests and then jump to the real instruction
   10964  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10965  */
   10966     .extern MterpCheckBefore
   10967     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10968     adrl   lr, artMterpAsmInstructionStart + (205 * 128)       @ Addr of primary handler.
   10969     mov    r0, rSELF
   10970     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10971     mov    r2, rPC
   10972     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10973 
   10974 /* ------------------------------ */
   10975     .balign 128
   10976 .L_ALT_op_div_double_2addr: /* 0xce */
   10977 /* File: arm/alt_stub.S */
   10978 /*
   10979  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10980  * any interesting requests and then jump to the real instruction
   10981  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10982  */
   10983     .extern MterpCheckBefore
   10984     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   10985     adrl   lr, artMterpAsmInstructionStart + (206 * 128)       @ Addr of primary handler.
   10986     mov    r0, rSELF
   10987     add    r1, rFP, #OFF_FP_SHADOWFRAME
   10988     mov    r2, rPC
   10989     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   10990 
   10991 /* ------------------------------ */
   10992     .balign 128
   10993 .L_ALT_op_rem_double_2addr: /* 0xcf */
   10994 /* File: arm/alt_stub.S */
   10995 /*
   10996  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   10997  * any interesting requests and then jump to the real instruction
   10998  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   10999  */
   11000     .extern MterpCheckBefore
   11001     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11002     adrl   lr, artMterpAsmInstructionStart + (207 * 128)       @ Addr of primary handler.
   11003     mov    r0, rSELF
   11004     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11005     mov    r2, rPC
   11006     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11007 
   11008 /* ------------------------------ */
   11009     .balign 128
   11010 .L_ALT_op_add_int_lit16: /* 0xd0 */
   11011 /* File: arm/alt_stub.S */
   11012 /*
   11013  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11014  * any interesting requests and then jump to the real instruction
   11015  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11016  */
   11017     .extern MterpCheckBefore
   11018     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11019     adrl   lr, artMterpAsmInstructionStart + (208 * 128)       @ Addr of primary handler.
   11020     mov    r0, rSELF
   11021     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11022     mov    r2, rPC
   11023     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11024 
   11025 /* ------------------------------ */
   11026     .balign 128
   11027 .L_ALT_op_rsub_int: /* 0xd1 */
   11028 /* File: arm/alt_stub.S */
   11029 /*
   11030  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11031  * any interesting requests and then jump to the real instruction
   11032  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11033  */
   11034     .extern MterpCheckBefore
   11035     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11036     adrl   lr, artMterpAsmInstructionStart + (209 * 128)       @ Addr of primary handler.
   11037     mov    r0, rSELF
   11038     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11039     mov    r2, rPC
   11040     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11041 
   11042 /* ------------------------------ */
   11043     .balign 128
   11044 .L_ALT_op_mul_int_lit16: /* 0xd2 */
   11045 /* File: arm/alt_stub.S */
   11046 /*
   11047  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11048  * any interesting requests and then jump to the real instruction
   11049  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11050  */
   11051     .extern MterpCheckBefore
   11052     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11053     adrl   lr, artMterpAsmInstructionStart + (210 * 128)       @ Addr of primary handler.
   11054     mov    r0, rSELF
   11055     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11056     mov    r2, rPC
   11057     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11058 
   11059 /* ------------------------------ */
   11060     .balign 128
   11061 .L_ALT_op_div_int_lit16: /* 0xd3 */
   11062 /* File: arm/alt_stub.S */
   11063 /*
   11064  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11065  * any interesting requests and then jump to the real instruction
   11066  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11067  */
   11068     .extern MterpCheckBefore
   11069     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11070     adrl   lr, artMterpAsmInstructionStart + (211 * 128)       @ Addr of primary handler.
   11071     mov    r0, rSELF
   11072     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11073     mov    r2, rPC
   11074     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11075 
   11076 /* ------------------------------ */
   11077     .balign 128
   11078 .L_ALT_op_rem_int_lit16: /* 0xd4 */
   11079 /* File: arm/alt_stub.S */
   11080 /*
   11081  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11082  * any interesting requests and then jump to the real instruction
   11083  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11084  */
   11085     .extern MterpCheckBefore
   11086     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11087     adrl   lr, artMterpAsmInstructionStart + (212 * 128)       @ Addr of primary handler.
   11088     mov    r0, rSELF
   11089     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11090     mov    r2, rPC
   11091     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11092 
   11093 /* ------------------------------ */
   11094     .balign 128
   11095 .L_ALT_op_and_int_lit16: /* 0xd5 */
   11096 /* File: arm/alt_stub.S */
   11097 /*
   11098  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11099  * any interesting requests and then jump to the real instruction
   11100  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11101  */
   11102     .extern MterpCheckBefore
   11103     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11104     adrl   lr, artMterpAsmInstructionStart + (213 * 128)       @ Addr of primary handler.
   11105     mov    r0, rSELF
   11106     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11107     mov    r2, rPC
   11108     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11109 
   11110 /* ------------------------------ */
   11111     .balign 128
   11112 .L_ALT_op_or_int_lit16: /* 0xd6 */
   11113 /* File: arm/alt_stub.S */
   11114 /*
   11115  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11116  * any interesting requests and then jump to the real instruction
   11117  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11118  */
   11119     .extern MterpCheckBefore
   11120     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11121     adrl   lr, artMterpAsmInstructionStart + (214 * 128)       @ Addr of primary handler.
   11122     mov    r0, rSELF
   11123     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11124     mov    r2, rPC
   11125     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11126 
   11127 /* ------------------------------ */
   11128     .balign 128
   11129 .L_ALT_op_xor_int_lit16: /* 0xd7 */
   11130 /* File: arm/alt_stub.S */
   11131 /*
   11132  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11133  * any interesting requests and then jump to the real instruction
   11134  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11135  */
   11136     .extern MterpCheckBefore
   11137     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11138     adrl   lr, artMterpAsmInstructionStart + (215 * 128)       @ Addr of primary handler.
   11139     mov    r0, rSELF
   11140     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11141     mov    r2, rPC
   11142     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11143 
   11144 /* ------------------------------ */
   11145     .balign 128
   11146 .L_ALT_op_add_int_lit8: /* 0xd8 */
   11147 /* File: arm/alt_stub.S */
   11148 /*
   11149  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11150  * any interesting requests and then jump to the real instruction
   11151  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11152  */
   11153     .extern MterpCheckBefore
   11154     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11155     adrl   lr, artMterpAsmInstructionStart + (216 * 128)       @ Addr of primary handler.
   11156     mov    r0, rSELF
   11157     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11158     mov    r2, rPC
   11159     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11160 
   11161 /* ------------------------------ */
   11162     .balign 128
   11163 .L_ALT_op_rsub_int_lit8: /* 0xd9 */
   11164 /* File: arm/alt_stub.S */
   11165 /*
   11166  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11167  * any interesting requests and then jump to the real instruction
   11168  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11169  */
   11170     .extern MterpCheckBefore
   11171     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11172     adrl   lr, artMterpAsmInstructionStart + (217 * 128)       @ Addr of primary handler.
   11173     mov    r0, rSELF
   11174     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11175     mov    r2, rPC
   11176     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11177 
   11178 /* ------------------------------ */
   11179     .balign 128
   11180 .L_ALT_op_mul_int_lit8: /* 0xda */
   11181 /* File: arm/alt_stub.S */
   11182 /*
   11183  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11184  * any interesting requests and then jump to the real instruction
   11185  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11186  */
   11187     .extern MterpCheckBefore
   11188     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11189     adrl   lr, artMterpAsmInstructionStart + (218 * 128)       @ Addr of primary handler.
   11190     mov    r0, rSELF
   11191     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11192     mov    r2, rPC
   11193     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11194 
   11195 /* ------------------------------ */
   11196     .balign 128
   11197 .L_ALT_op_div_int_lit8: /* 0xdb */
   11198 /* File: arm/alt_stub.S */
   11199 /*
   11200  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11201  * any interesting requests and then jump to the real instruction
   11202  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11203  */
   11204     .extern MterpCheckBefore
   11205     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11206     adrl   lr, artMterpAsmInstructionStart + (219 * 128)       @ Addr of primary handler.
   11207     mov    r0, rSELF
   11208     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11209     mov    r2, rPC
   11210     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11211 
   11212 /* ------------------------------ */
   11213     .balign 128
   11214 .L_ALT_op_rem_int_lit8: /* 0xdc */
   11215 /* File: arm/alt_stub.S */
   11216 /*
   11217  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11218  * any interesting requests and then jump to the real instruction
   11219  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11220  */
   11221     .extern MterpCheckBefore
   11222     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11223     adrl   lr, artMterpAsmInstructionStart + (220 * 128)       @ Addr of primary handler.
   11224     mov    r0, rSELF
   11225     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11226     mov    r2, rPC
   11227     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11228 
   11229 /* ------------------------------ */
   11230     .balign 128
   11231 .L_ALT_op_and_int_lit8: /* 0xdd */
   11232 /* File: arm/alt_stub.S */
   11233 /*
   11234  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11235  * any interesting requests and then jump to the real instruction
   11236  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11237  */
   11238     .extern MterpCheckBefore
   11239     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11240     adrl   lr, artMterpAsmInstructionStart + (221 * 128)       @ Addr of primary handler.
   11241     mov    r0, rSELF
   11242     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11243     mov    r2, rPC
   11244     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11245 
   11246 /* ------------------------------ */
   11247     .balign 128
   11248 .L_ALT_op_or_int_lit8: /* 0xde */
   11249 /* File: arm/alt_stub.S */
   11250 /*
   11251  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11252  * any interesting requests and then jump to the real instruction
   11253  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11254  */
   11255     .extern MterpCheckBefore
   11256     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11257     adrl   lr, artMterpAsmInstructionStart + (222 * 128)       @ Addr of primary handler.
   11258     mov    r0, rSELF
   11259     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11260     mov    r2, rPC
   11261     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11262 
   11263 /* ------------------------------ */
   11264     .balign 128
   11265 .L_ALT_op_xor_int_lit8: /* 0xdf */
   11266 /* File: arm/alt_stub.S */
   11267 /*
   11268  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11269  * any interesting requests and then jump to the real instruction
   11270  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11271  */
   11272     .extern MterpCheckBefore
   11273     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11274     adrl   lr, artMterpAsmInstructionStart + (223 * 128)       @ Addr of primary handler.
   11275     mov    r0, rSELF
   11276     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11277     mov    r2, rPC
   11278     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11279 
   11280 /* ------------------------------ */
   11281     .balign 128
   11282 .L_ALT_op_shl_int_lit8: /* 0xe0 */
   11283 /* File: arm/alt_stub.S */
   11284 /*
   11285  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11286  * any interesting requests and then jump to the real instruction
   11287  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11288  */
   11289     .extern MterpCheckBefore
   11290     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11291     adrl   lr, artMterpAsmInstructionStart + (224 * 128)       @ Addr of primary handler.
   11292     mov    r0, rSELF
   11293     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11294     mov    r2, rPC
   11295     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11296 
   11297 /* ------------------------------ */
   11298     .balign 128
   11299 .L_ALT_op_shr_int_lit8: /* 0xe1 */
   11300 /* File: arm/alt_stub.S */
   11301 /*
   11302  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11303  * any interesting requests and then jump to the real instruction
   11304  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11305  */
   11306     .extern MterpCheckBefore
   11307     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11308     adrl   lr, artMterpAsmInstructionStart + (225 * 128)       @ Addr of primary handler.
   11309     mov    r0, rSELF
   11310     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11311     mov    r2, rPC
   11312     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11313 
   11314 /* ------------------------------ */
   11315     .balign 128
   11316 .L_ALT_op_ushr_int_lit8: /* 0xe2 */
   11317 /* File: arm/alt_stub.S */
   11318 /*
   11319  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11320  * any interesting requests and then jump to the real instruction
   11321  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11322  */
   11323     .extern MterpCheckBefore
   11324     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11325     adrl   lr, artMterpAsmInstructionStart + (226 * 128)       @ Addr of primary handler.
   11326     mov    r0, rSELF
   11327     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11328     mov    r2, rPC
   11329     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11330 
   11331 /* ------------------------------ */
   11332     .balign 128
   11333 .L_ALT_op_iget_quick: /* 0xe3 */
   11334 /* File: arm/alt_stub.S */
   11335 /*
   11336  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11337  * any interesting requests and then jump to the real instruction
   11338  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11339  */
   11340     .extern MterpCheckBefore
   11341     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11342     adrl   lr, artMterpAsmInstructionStart + (227 * 128)       @ Addr of primary handler.
   11343     mov    r0, rSELF
   11344     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11345     mov    r2, rPC
   11346     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11347 
   11348 /* ------------------------------ */
   11349     .balign 128
   11350 .L_ALT_op_iget_wide_quick: /* 0xe4 */
   11351 /* File: arm/alt_stub.S */
   11352 /*
   11353  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11354  * any interesting requests and then jump to the real instruction
   11355  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11356  */
   11357     .extern MterpCheckBefore
   11358     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11359     adrl   lr, artMterpAsmInstructionStart + (228 * 128)       @ Addr of primary handler.
   11360     mov    r0, rSELF
   11361     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11362     mov    r2, rPC
   11363     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11364 
   11365 /* ------------------------------ */
   11366     .balign 128
   11367 .L_ALT_op_iget_object_quick: /* 0xe5 */
   11368 /* File: arm/alt_stub.S */
   11369 /*
   11370  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11371  * any interesting requests and then jump to the real instruction
   11372  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11373  */
   11374     .extern MterpCheckBefore
   11375     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11376     adrl   lr, artMterpAsmInstructionStart + (229 * 128)       @ Addr of primary handler.
   11377     mov    r0, rSELF
   11378     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11379     mov    r2, rPC
   11380     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11381 
   11382 /* ------------------------------ */
   11383     .balign 128
   11384 .L_ALT_op_iput_quick: /* 0xe6 */
   11385 /* File: arm/alt_stub.S */
   11386 /*
   11387  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11388  * any interesting requests and then jump to the real instruction
   11389  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11390  */
   11391     .extern MterpCheckBefore
   11392     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11393     adrl   lr, artMterpAsmInstructionStart + (230 * 128)       @ Addr of primary handler.
   11394     mov    r0, rSELF
   11395     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11396     mov    r2, rPC
   11397     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11398 
   11399 /* ------------------------------ */
   11400     .balign 128
   11401 .L_ALT_op_iput_wide_quick: /* 0xe7 */
   11402 /* File: arm/alt_stub.S */
   11403 /*
   11404  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11405  * any interesting requests and then jump to the real instruction
   11406  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11407  */
   11408     .extern MterpCheckBefore
   11409     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11410     adrl   lr, artMterpAsmInstructionStart + (231 * 128)       @ Addr of primary handler.
   11411     mov    r0, rSELF
   11412     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11413     mov    r2, rPC
   11414     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11415 
   11416 /* ------------------------------ */
   11417     .balign 128
   11418 .L_ALT_op_iput_object_quick: /* 0xe8 */
   11419 /* File: arm/alt_stub.S */
   11420 /*
   11421  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11422  * any interesting requests and then jump to the real instruction
   11423  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11424  */
   11425     .extern MterpCheckBefore
   11426     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11427     adrl   lr, artMterpAsmInstructionStart + (232 * 128)       @ Addr of primary handler.
   11428     mov    r0, rSELF
   11429     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11430     mov    r2, rPC
   11431     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11432 
   11433 /* ------------------------------ */
   11434     .balign 128
   11435 .L_ALT_op_invoke_virtual_quick: /* 0xe9 */
   11436 /* File: arm/alt_stub.S */
   11437 /*
   11438  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11439  * any interesting requests and then jump to the real instruction
   11440  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11441  */
   11442     .extern MterpCheckBefore
   11443     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11444     adrl   lr, artMterpAsmInstructionStart + (233 * 128)       @ Addr of primary handler.
   11445     mov    r0, rSELF
   11446     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11447     mov    r2, rPC
   11448     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11449 
   11450 /* ------------------------------ */
   11451     .balign 128
   11452 .L_ALT_op_invoke_virtual_range_quick: /* 0xea */
   11453 /* File: arm/alt_stub.S */
   11454 /*
   11455  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11456  * any interesting requests and then jump to the real instruction
   11457  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11458  */
   11459     .extern MterpCheckBefore
   11460     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11461     adrl   lr, artMterpAsmInstructionStart + (234 * 128)       @ Addr of primary handler.
   11462     mov    r0, rSELF
   11463     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11464     mov    r2, rPC
   11465     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11466 
   11467 /* ------------------------------ */
   11468     .balign 128
   11469 .L_ALT_op_iput_boolean_quick: /* 0xeb */
   11470 /* File: arm/alt_stub.S */
   11471 /*
   11472  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11473  * any interesting requests and then jump to the real instruction
   11474  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11475  */
   11476     .extern MterpCheckBefore
   11477     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11478     adrl   lr, artMterpAsmInstructionStart + (235 * 128)       @ Addr of primary handler.
   11479     mov    r0, rSELF
   11480     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11481     mov    r2, rPC
   11482     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11483 
   11484 /* ------------------------------ */
   11485     .balign 128
   11486 .L_ALT_op_iput_byte_quick: /* 0xec */
   11487 /* File: arm/alt_stub.S */
   11488 /*
   11489  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11490  * any interesting requests and then jump to the real instruction
   11491  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11492  */
   11493     .extern MterpCheckBefore
   11494     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11495     adrl   lr, artMterpAsmInstructionStart + (236 * 128)       @ Addr of primary handler.
   11496     mov    r0, rSELF
   11497     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11498     mov    r2, rPC
   11499     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11500 
   11501 /* ------------------------------ */
   11502     .balign 128
   11503 .L_ALT_op_iput_char_quick: /* 0xed */
   11504 /* File: arm/alt_stub.S */
   11505 /*
   11506  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11507  * any interesting requests and then jump to the real instruction
   11508  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11509  */
   11510     .extern MterpCheckBefore
   11511     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11512     adrl   lr, artMterpAsmInstructionStart + (237 * 128)       @ Addr of primary handler.
   11513     mov    r0, rSELF
   11514     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11515     mov    r2, rPC
   11516     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11517 
   11518 /* ------------------------------ */
   11519     .balign 128
   11520 .L_ALT_op_iput_short_quick: /* 0xee */
   11521 /* File: arm/alt_stub.S */
   11522 /*
   11523  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11524  * any interesting requests and then jump to the real instruction
   11525  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11526  */
   11527     .extern MterpCheckBefore
   11528     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11529     adrl   lr, artMterpAsmInstructionStart + (238 * 128)       @ Addr of primary handler.
   11530     mov    r0, rSELF
   11531     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11532     mov    r2, rPC
   11533     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11534 
   11535 /* ------------------------------ */
   11536     .balign 128
   11537 .L_ALT_op_iget_boolean_quick: /* 0xef */
   11538 /* File: arm/alt_stub.S */
   11539 /*
   11540  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11541  * any interesting requests and then jump to the real instruction
   11542  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11543  */
   11544     .extern MterpCheckBefore
   11545     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11546     adrl   lr, artMterpAsmInstructionStart + (239 * 128)       @ Addr of primary handler.
   11547     mov    r0, rSELF
   11548     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11549     mov    r2, rPC
   11550     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11551 
   11552 /* ------------------------------ */
   11553     .balign 128
   11554 .L_ALT_op_iget_byte_quick: /* 0xf0 */
   11555 /* File: arm/alt_stub.S */
   11556 /*
   11557  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11558  * any interesting requests and then jump to the real instruction
   11559  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11560  */
   11561     .extern MterpCheckBefore
   11562     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11563     adrl   lr, artMterpAsmInstructionStart + (240 * 128)       @ Addr of primary handler.
   11564     mov    r0, rSELF
   11565     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11566     mov    r2, rPC
   11567     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11568 
   11569 /* ------------------------------ */
   11570     .balign 128
   11571 .L_ALT_op_iget_char_quick: /* 0xf1 */
   11572 /* File: arm/alt_stub.S */
   11573 /*
   11574  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11575  * any interesting requests and then jump to the real instruction
   11576  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11577  */
   11578     .extern MterpCheckBefore
   11579     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11580     adrl   lr, artMterpAsmInstructionStart + (241 * 128)       @ Addr of primary handler.
   11581     mov    r0, rSELF
   11582     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11583     mov    r2, rPC
   11584     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11585 
   11586 /* ------------------------------ */
   11587     .balign 128
   11588 .L_ALT_op_iget_short_quick: /* 0xf2 */
   11589 /* File: arm/alt_stub.S */
   11590 /*
   11591  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11592  * any interesting requests and then jump to the real instruction
   11593  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11594  */
   11595     .extern MterpCheckBefore
   11596     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11597     adrl   lr, artMterpAsmInstructionStart + (242 * 128)       @ Addr of primary handler.
   11598     mov    r0, rSELF
   11599     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11600     mov    r2, rPC
   11601     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11602 
   11603 /* ------------------------------ */
   11604     .balign 128
   11605 .L_ALT_op_unused_f3: /* 0xf3 */
   11606 /* File: arm/alt_stub.S */
   11607 /*
   11608  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11609  * any interesting requests and then jump to the real instruction
   11610  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11611  */
   11612     .extern MterpCheckBefore
   11613     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11614     adrl   lr, artMterpAsmInstructionStart + (243 * 128)       @ Addr of primary handler.
   11615     mov    r0, rSELF
   11616     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11617     mov    r2, rPC
   11618     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11619 
   11620 /* ------------------------------ */
   11621     .balign 128
   11622 .L_ALT_op_unused_f4: /* 0xf4 */
   11623 /* File: arm/alt_stub.S */
   11624 /*
   11625  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11626  * any interesting requests and then jump to the real instruction
   11627  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11628  */
   11629     .extern MterpCheckBefore
   11630     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11631     adrl   lr, artMterpAsmInstructionStart + (244 * 128)       @ Addr of primary handler.
   11632     mov    r0, rSELF
   11633     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11634     mov    r2, rPC
   11635     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11636 
   11637 /* ------------------------------ */
   11638     .balign 128
   11639 .L_ALT_op_unused_f5: /* 0xf5 */
   11640 /* File: arm/alt_stub.S */
   11641 /*
   11642  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11643  * any interesting requests and then jump to the real instruction
   11644  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11645  */
   11646     .extern MterpCheckBefore
   11647     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11648     adrl   lr, artMterpAsmInstructionStart + (245 * 128)       @ Addr of primary handler.
   11649     mov    r0, rSELF
   11650     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11651     mov    r2, rPC
   11652     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11653 
   11654 /* ------------------------------ */
   11655     .balign 128
   11656 .L_ALT_op_unused_f6: /* 0xf6 */
   11657 /* File: arm/alt_stub.S */
   11658 /*
   11659  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11660  * any interesting requests and then jump to the real instruction
   11661  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11662  */
   11663     .extern MterpCheckBefore
   11664     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11665     adrl   lr, artMterpAsmInstructionStart + (246 * 128)       @ Addr of primary handler.
   11666     mov    r0, rSELF
   11667     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11668     mov    r2, rPC
   11669     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11670 
   11671 /* ------------------------------ */
   11672     .balign 128
   11673 .L_ALT_op_unused_f7: /* 0xf7 */
   11674 /* File: arm/alt_stub.S */
   11675 /*
   11676  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11677  * any interesting requests and then jump to the real instruction
   11678  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11679  */
   11680     .extern MterpCheckBefore
   11681     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11682     adrl   lr, artMterpAsmInstructionStart + (247 * 128)       @ Addr of primary handler.
   11683     mov    r0, rSELF
   11684     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11685     mov    r2, rPC
   11686     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11687 
   11688 /* ------------------------------ */
   11689     .balign 128
   11690 .L_ALT_op_unused_f8: /* 0xf8 */
   11691 /* File: arm/alt_stub.S */
   11692 /*
   11693  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11694  * any interesting requests and then jump to the real instruction
   11695  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11696  */
   11697     .extern MterpCheckBefore
   11698     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11699     adrl   lr, artMterpAsmInstructionStart + (248 * 128)       @ Addr of primary handler.
   11700     mov    r0, rSELF
   11701     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11702     mov    r2, rPC
   11703     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11704 
   11705 /* ------------------------------ */
   11706     .balign 128
   11707 .L_ALT_op_unused_f9: /* 0xf9 */
   11708 /* File: arm/alt_stub.S */
   11709 /*
   11710  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11711  * any interesting requests and then jump to the real instruction
   11712  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11713  */
   11714     .extern MterpCheckBefore
   11715     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11716     adrl   lr, artMterpAsmInstructionStart + (249 * 128)       @ Addr of primary handler.
   11717     mov    r0, rSELF
   11718     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11719     mov    r2, rPC
   11720     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11721 
   11722 /* ------------------------------ */
   11723     .balign 128
   11724 .L_ALT_op_invoke_polymorphic: /* 0xfa */
   11725 /* File: arm/alt_stub.S */
   11726 /*
   11727  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11728  * any interesting requests and then jump to the real instruction
   11729  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11730  */
   11731     .extern MterpCheckBefore
   11732     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11733     adrl   lr, artMterpAsmInstructionStart + (250 * 128)       @ Addr of primary handler.
   11734     mov    r0, rSELF
   11735     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11736     mov    r2, rPC
   11737     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11738 
   11739 /* ------------------------------ */
   11740     .balign 128
   11741 .L_ALT_op_invoke_polymorphic_range: /* 0xfb */
   11742 /* File: arm/alt_stub.S */
   11743 /*
   11744  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11745  * any interesting requests and then jump to the real instruction
   11746  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11747  */
   11748     .extern MterpCheckBefore
   11749     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11750     adrl   lr, artMterpAsmInstructionStart + (251 * 128)       @ Addr of primary handler.
   11751     mov    r0, rSELF
   11752     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11753     mov    r2, rPC
   11754     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11755 
   11756 /* ------------------------------ */
   11757     .balign 128
   11758 .L_ALT_op_invoke_custom: /* 0xfc */
   11759 /* File: arm/alt_stub.S */
   11760 /*
   11761  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11762  * any interesting requests and then jump to the real instruction
   11763  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11764  */
   11765     .extern MterpCheckBefore
   11766     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11767     adrl   lr, artMterpAsmInstructionStart + (252 * 128)       @ Addr of primary handler.
   11768     mov    r0, rSELF
   11769     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11770     mov    r2, rPC
   11771     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11772 
   11773 /* ------------------------------ */
   11774     .balign 128
   11775 .L_ALT_op_invoke_custom_range: /* 0xfd */
   11776 /* File: arm/alt_stub.S */
   11777 /*
   11778  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11779  * any interesting requests and then jump to the real instruction
   11780  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11781  */
   11782     .extern MterpCheckBefore
   11783     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11784     adrl   lr, artMterpAsmInstructionStart + (253 * 128)       @ Addr of primary handler.
   11785     mov    r0, rSELF
   11786     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11787     mov    r2, rPC
   11788     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11789 
   11790 /* ------------------------------ */
   11791     .balign 128
   11792 .L_ALT_op_unused_fe: /* 0xfe */
   11793 /* File: arm/alt_stub.S */
   11794 /*
   11795  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11796  * any interesting requests and then jump to the real instruction
   11797  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11798  */
   11799     .extern MterpCheckBefore
   11800     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11801     adrl   lr, artMterpAsmInstructionStart + (254 * 128)       @ Addr of primary handler.
   11802     mov    r0, rSELF
   11803     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11804     mov    r2, rPC
   11805     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11806 
   11807 /* ------------------------------ */
   11808     .balign 128
   11809 .L_ALT_op_unused_ff: /* 0xff */
   11810 /* File: arm/alt_stub.S */
   11811 /*
   11812  * Inter-instruction transfer stub.  Call out to MterpCheckBefore to handle
   11813  * any interesting requests and then jump to the real instruction
   11814  * handler.  Note that the call to MterpCheckBefore is done as a tail call.
   11815  */
   11816     .extern MterpCheckBefore
   11817     ldr    rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]            @ refresh IBASE.
   11818     adrl   lr, artMterpAsmInstructionStart + (255 * 128)       @ Addr of primary handler.
   11819     mov    r0, rSELF
   11820     add    r1, rFP, #OFF_FP_SHADOWFRAME
   11821     mov    r2, rPC
   11822     b      MterpCheckBefore     @ (self, shadow_frame, dex_pc_ptr)  @ Tail call.
   11823 
   11824     .balign 128
   11825     .size   artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
   11826     .global artMterpAsmAltInstructionEnd
   11827 artMterpAsmAltInstructionEnd:
   11828 /* File: arm/footer.S */
   11829 /*
   11830  * ===========================================================================
   11831  *  Common subroutines and data
   11832  * ===========================================================================
   11833  */
   11834 
   11835     .text
   11836     .align  2
   11837 
   11838 /*
   11839  * We've detected a condition that will result in an exception, but the exception
   11840  * has not yet been thrown.  Just bail out to the reference interpreter to deal with it.
   11841  * TUNING: for consistency, we may want to just go ahead and handle these here.
   11842  */
   11843 common_errDivideByZero:
   11844     EXPORT_PC
   11845 #if MTERP_LOGGING
   11846     mov  r0, rSELF
   11847     add  r1, rFP, #OFF_FP_SHADOWFRAME
   11848     bl MterpLogDivideByZeroException
   11849 #endif
   11850     b MterpCommonFallback
   11851 
   11852 common_errArrayIndex:
   11853     EXPORT_PC
   11854 #if MTERP_LOGGING
   11855     mov  r0, rSELF
   11856     add  r1, rFP, #OFF_FP_SHADOWFRAME
   11857     bl MterpLogArrayIndexException
   11858 #endif
   11859     b MterpCommonFallback
   11860 
   11861 common_errNegativeArraySize:
   11862     EXPORT_PC
   11863 #if MTERP_LOGGING
   11864     mov  r0, rSELF
   11865     add  r1, rFP, #OFF_FP_SHADOWFRAME
   11866     bl MterpLogNegativeArraySizeException
   11867 #endif
   11868     b MterpCommonFallback
   11869 
   11870 common_errNoSuchMethod:
   11871     EXPORT_PC
   11872 #if MTERP_LOGGING
   11873     mov  r0, rSELF
   11874     add  r1, rFP, #OFF_FP_SHADOWFRAME
   11875     bl MterpLogNoSuchMethodException
   11876 #endif
   11877     b MterpCommonFallback
   11878 
   11879 common_errNullObject:
   11880     EXPORT_PC
   11881 #if MTERP_LOGGING
   11882     mov  r0, rSELF
   11883     add  r1, rFP, #OFF_FP_SHADOWFRAME
   11884     bl MterpLogNullObjectException
   11885 #endif
   11886     b MterpCommonFallback
   11887 
   11888 common_exceptionThrown:
   11889     EXPORT_PC
   11890 #if MTERP_LOGGING
   11891     mov  r0, rSELF
   11892     add  r1, rFP, #OFF_FP_SHADOWFRAME
   11893     bl MterpLogExceptionThrownException
   11894 #endif
   11895     b MterpCommonFallback
   11896 
   11897 MterpSuspendFallback:
   11898     EXPORT_PC
   11899 #if MTERP_LOGGING
   11900     mov  r0, rSELF
   11901     add  r1, rFP, #OFF_FP_SHADOWFRAME
   11902     ldr  r2, [rSELF, #THREAD_FLAGS_OFFSET]
   11903     bl MterpLogSuspendFallback
   11904 #endif
   11905     b MterpCommonFallback
   11906 
   11907 /*
   11908  * If we're here, something is out of the ordinary.  If there is a pending
   11909  * exception, handle it.  Otherwise, roll back and retry with the reference
   11910  * interpreter.
   11911  */
   11912 MterpPossibleException:
   11913     ldr     r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
   11914     cmp     r0, #0                                  @ Exception pending?
   11915     beq     MterpFallback                           @ If not, fall back to reference interpreter.
   11916     /* intentional fallthrough - handle pending exception. */
   11917 /*
   11918  * On return from a runtime helper routine, we've found a pending exception.
   11919  * Can we handle it here - or need to bail out to caller?
   11920  *
   11921  */
   11922 MterpException:
   11923     mov     r0, rSELF
   11924     add     r1, rFP, #OFF_FP_SHADOWFRAME
   11925     bl      MterpHandleException                    @ (self, shadow_frame)
   11926     cmp     r0, #0
   11927     beq     MterpExceptionReturn                    @ no local catch, back to caller.
   11928     ldr     r0, [rFP, #OFF_FP_CODE_ITEM]
   11929     ldr     r1, [rFP, #OFF_FP_DEX_PC]
   11930     ldr     rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
   11931     add     rPC, r0, #CODEITEM_INSNS_OFFSET
   11932     add     rPC, rPC, r1, lsl #1                    @ generate new dex_pc_ptr
   11933     /* Do we need to switch interpreters? */
   11934     bl      MterpShouldSwitchInterpreters
   11935     cmp     r0, #0
   11936     bne     MterpFallback
   11937     /* resume execution at catch block */
   11938     EXPORT_PC
   11939     FETCH_INST
   11940     GET_INST_OPCODE ip
   11941     GOTO_OPCODE ip
   11942     /* NOTE: no fallthrough */
   11943 
   11944 /*
   11945  * Common handling for branches with support for Jit profiling.
   11946  * On entry:
   11947  *    rINST          <= signed offset
   11948  *    rPROFILE       <= signed hotness countdown (expanded to 32 bits)
   11949  *    condition bits <= set to establish sign of offset (use "NoFlags" entry if not)
   11950  *
   11951  * We have quite a few different cases for branch profiling, OSR detection and
   11952  * suspend check support here.
   11953  *
   11954  * Taken backward branches:
   11955  *    If profiling active, do hotness countdown and report if we hit zero.
   11956  *    If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
   11957  *    Is there a pending suspend request?  If so, suspend.
   11958  *
   11959  * Taken forward branches and not-taken backward branches:
   11960  *    If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
   11961  *
   11962  * Our most common case is expected to be a taken backward branch with active jit profiling,
   11963  * but no full OSR check and no pending suspend request.
   11964  * Next most common case is not-taken branch with no full OSR check.
   11965  *
   11966  */
   11967 MterpCommonTakenBranchNoFlags:
   11968     cmp     rINST, #0
   11969 MterpCommonTakenBranch:
   11970     bgt     .L_forward_branch           @ don't add forward branches to hotness
   11971 /*
   11972  * We need to subtract 1 from positive values and we should not see 0 here,
   11973  * so we may use the result of the comparison with -1.
   11974  */
   11975 #if JIT_CHECK_OSR != -1
   11976 #  error "JIT_CHECK_OSR must be -1."
   11977 #endif
   11978     cmp     rPROFILE, #JIT_CHECK_OSR
   11979     beq     .L_osr_check
   11980     subgts  rPROFILE, #1
   11981     beq     .L_add_batch                @ counted down to zero - report
   11982 .L_resume_backward_branch:
   11983     ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
   11984     REFRESH_IBASE
   11985     add     r2, rINST, rINST            @ r2<- byte offset
   11986     FETCH_ADVANCE_INST_RB r2            @ update rPC, load rINST
   11987     ands    lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
   11988     bne     .L_suspend_request_pending
   11989     GET_INST_OPCODE ip                  @ extract opcode from rINST
   11990     GOTO_OPCODE ip                      @ jump to next instruction
   11991 
   11992 .L_suspend_request_pending:
   11993     EXPORT_PC
   11994     mov     r0, rSELF
   11995     bl      MterpSuspendCheck           @ (self)
   11996     cmp     r0, #0
   11997     bne     MterpFallback
   11998     REFRESH_IBASE                       @ might have changed during suspend
   11999     GET_INST_OPCODE ip                  @ extract opcode from rINST
   12000     GOTO_OPCODE ip                      @ jump to next instruction
   12001 
   12002 .L_no_count_backwards:
   12003     cmp     rPROFILE, #JIT_CHECK_OSR    @ possible OSR re-entry?
   12004     bne     .L_resume_backward_branch
   12005 .L_osr_check:
   12006     mov     r0, rSELF
   12007     add     r1, rFP, #OFF_FP_SHADOWFRAME
   12008     mov     r2, rINST
   12009     EXPORT_PC
   12010     bl      MterpMaybeDoOnStackReplacement  @ (self, shadow_frame, offset)
   12011     cmp     r0, #0
   12012     bne     MterpOnStackReplacement
   12013     b       .L_resume_backward_branch
   12014 
   12015 .L_forward_branch:
   12016     cmp     rPROFILE, #JIT_CHECK_OSR @ possible OSR re-entry?
   12017     beq     .L_check_osr_forward
   12018 .L_resume_forward_branch:
   12019     add     r2, rINST, rINST            @ r2<- byte offset
   12020     FETCH_ADVANCE_INST_RB r2            @ update rPC, load rINST
   12021     GET_INST_OPCODE ip                  @ extract opcode from rINST
   12022     GOTO_OPCODE ip                      @ jump to next instruction
   12023 
   12024 .L_check_osr_forward:
   12025     mov     r0, rSELF
   12026     add     r1, rFP, #OFF_FP_SHADOWFRAME
   12027     mov     r2, rINST
   12028     EXPORT_PC
   12029     bl      MterpMaybeDoOnStackReplacement  @ (self, shadow_frame, offset)
   12030     cmp     r0, #0
   12031     bne     MterpOnStackReplacement
   12032     b       .L_resume_forward_branch
   12033 
   12034 .L_add_batch:
   12035     add     r1, rFP, #OFF_FP_SHADOWFRAME
   12036     strh    rPROFILE, [r1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
   12037     ldr     r0, [rFP, #OFF_FP_METHOD]
   12038     mov     r2, rSELF
   12039     bl      MterpAddHotnessBatch        @ (method, shadow_frame, self)
   12040     mov     rPROFILE, r0                @ restore new hotness countdown to rPROFILE
   12041     b       .L_no_count_backwards
   12042 
   12043 /*
   12044  * Entered from the conditional branch handlers when OSR check request active on
   12045  * not-taken path.  All Dalvik not-taken conditional branch offsets are 2.
   12046  */
   12047 .L_check_not_taken_osr:
   12048     mov     r0, rSELF
   12049     add     r1, rFP, #OFF_FP_SHADOWFRAME
   12050     mov     r2, #2
   12051     EXPORT_PC
   12052     bl      MterpMaybeDoOnStackReplacement  @ (self, shadow_frame, offset)
   12053     cmp     r0, #0
   12054     bne     MterpOnStackReplacement
   12055     FETCH_ADVANCE_INST 2
   12056     GET_INST_OPCODE ip                  @ extract opcode from rINST
   12057     GOTO_OPCODE ip                      @ jump to next instruction
   12058 
   12059 /*
   12060  * On-stack replacement has happened, and now we've returned from the compiled method.
   12061  */
   12062 MterpOnStackReplacement:
   12063 #if MTERP_LOGGING
   12064     mov r0, rSELF
   12065     add r1, rFP, #OFF_FP_SHADOWFRAME
   12066     mov r2, rINST
   12067     bl MterpLogOSR
   12068 #endif
   12069     mov r0, #1                          @ Signal normal return
   12070     b MterpDone
   12071 
   12072 /*
   12073  * Bail out to reference interpreter.
   12074  */
   12075 MterpFallback:
   12076     EXPORT_PC
   12077 #if MTERP_LOGGING
   12078     mov  r0, rSELF
   12079     add  r1, rFP, #OFF_FP_SHADOWFRAME
   12080     bl MterpLogFallback
   12081 #endif
   12082 MterpCommonFallback:
   12083     mov     r0, #0                                  @ signal retry with reference interpreter.
   12084     b       MterpDone
   12085 
   12086 /*
   12087  * We pushed some registers on the stack in ExecuteMterpImpl, then saved
   12088  * SP and LR.  Here we restore SP, restore the registers, and then restore
   12089  * LR to PC.
   12090  *
   12091  * On entry:
   12092  *  uint32_t* rFP  (should still be live, pointer to base of vregs)
   12093  */
   12094 MterpExceptionReturn:
   12095     mov     r0, #1                                  @ signal return to caller.
   12096     b MterpDone
   12097 MterpReturn:
   12098     ldr     r2, [rFP, #OFF_FP_RESULT_REGISTER]
   12099     str     r0, [r2]
   12100     str     r1, [r2, #4]
   12101     mov     r0, #1                                  @ signal return to caller.
   12102 MterpDone:
   12103 /*
   12104  * At this point, we expect rPROFILE to be non-zero.  If negative, hotness is disabled or we're
   12105  * checking for OSR.  If greater than zero, we might have unreported hotness to register
   12106  * (the difference between the ending rPROFILE and the cached hotness counter).  rPROFILE
   12107  * should only reach zero immediately after a hotness decrement, and is then reset to either
   12108  * a negative special state or the new non-zero countdown value.
   12109  */
   12110     cmp     rPROFILE, #0
   12111     bgt     MterpProfileActive                      @ if > 0, we may have some counts to report.
   12112     ldmfd   sp!, {r3-r10,fp,pc}                     @ restore 10 regs and return
   12113 
   12114 MterpProfileActive:
   12115     mov     rINST, r0                               @ stash return value
   12116     /* Report cached hotness counts */
   12117     ldr     r0, [rFP, #OFF_FP_METHOD]
   12118     add     r1, rFP, #OFF_FP_SHADOWFRAME
   12119     mov     r2, rSELF
   12120     strh    rPROFILE, [r1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
   12121     bl      MterpAddHotnessBatch                    @ (method, shadow_frame, self)
   12122     mov     r0, rINST                               @ restore return value
   12123     ldmfd   sp!, {r3-r10,fp,pc}                     @ restore 10 regs and return
   12124 
   12125     END ExecuteMterpImpl
   12126 
   12127 
   12128