Home | History | Annotate | Download | only in out
      1 /*
      2  * This file was generated automatically by gen-mterp.py for 'mips'.
      3  *
      4  * --> DO NOT EDIT <--
      5  */
      6 
      7 /* File: mips/header.S */
      8 #include "../common/asm-constants.h"
      9 #include "../common/mips-defines.h"
     10 #include <asm/regdef.h>
     11 #include <asm/fpregdef.h>
     12 
     13 #ifdef __mips_hard_float
     14 #define HARD_FLOAT
     15 #else
     16 #define SOFT_FLOAT
     17 #endif
     18 
     19 #if (__mips==32) && (__mips_isa_rev>=2)
     20 #define MIPS32R2
     21 #endif
     22 
     23 /* MIPS definitions and declarations
     24 
     25    reg	nick		purpose
     26    s0	rPC		interpreted program counter, used for fetching instructions
     27    s1	rFP		interpreted frame pointer, used for accessing locals and args
     28    s2	rSELF		self (Thread) pointer
     29    s3	rIBASE		interpreted instruction base pointer, used for computed goto
     30    s4	rINST		first 16-bit code unit of current instruction
     31 */
     32 
     33 
     34 /* single-purpose registers, given names for clarity */
     35 #define rPC s0
     36 #define rFP s1
     37 #define rSELF s2
     38 #define rIBASE s3
     39 #define rINST s4
     40 #define rOBJ s5
     41 #define rBIX s6
     42 #define rTEMP s7
     43 
     44 /* The long arguments sent to function calls in Big-endian mode should be register
     45 swapped when sent to functions in little endian mode. In other words long variable
     46 sent as a0(MSW), a1(LSW) for a function call in LE mode should be sent as a1, a0 in
     47 Big Endian mode */
     48 
     49 #ifdef HAVE_LITTLE_ENDIAN
     50 #define rARG0 a0
     51 #define rARG1 a1
     52 #define rARG2 a2
     53 #define rARG3 a3
     54 #define rRESULT0 v0
     55 #define rRESULT1 v1
     56 #else
     57 #define rARG0 a1
     58 #define rARG1 a0
     59 #define rARG2 a3
     60 #define rARG3 a2
     61 #define rRESULT0 v1
     62 #define rRESULT1 v0
     63 #endif
     64 
     65 
     66 /* save/restore the PC and/or FP from the glue struct */
     67 #define LOAD_PC_FROM_SELF() lw rPC, offThread_pc(rSELF)
     68 #define SAVE_PC_TO_SELF() sw rPC, offThread_pc(rSELF)
     69 #define LOAD_FP_FROM_SELF() lw rFP, offThread_curFrame(rSELF)
     70 #define SAVE_FP_TO_SELF() sw rFP, offThread_curFrame(rSELF)
     71 #define LOAD_PC_FP_FROM_SELF() \
     72 	LOAD_PC_FROM_SELF();   \
     73 	LOAD_FP_FROM_SELF()
     74 #define SAVE_PC_FP_TO_SELF()   \
     75 	SAVE_PC_TO_SELF();     \
     76 	SAVE_FP_TO_SELF()
     77 
     78 #define EXPORT_PC() \
     79     sw        rPC, (offStackSaveArea_currentPc - sizeofStackSaveArea)(rFP)
     80 
     81 #define SAVEAREA_FROM_FP(rd, _fpreg) \
     82     subu      rd, _fpreg, sizeofStackSaveArea
     83 
     84 #define FETCH_INST() lhu rINST, (rPC)
     85 
     86 #define FETCH_ADVANCE_INST(_count) lhu rINST, ((_count)*2)(rPC); \
     87     addu      rPC, rPC, ((_count) * 2)
     88 
     89 #define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
     90     lhu       _dreg, ((_count)*2)(_sreg) ;            \
     91     addu      _sreg, _sreg, (_count)*2
     92 
     93 #define FETCH_ADVANCE_INST_RB(rd) addu rPC, rPC, rd; \
     94     lhu       rINST, (rPC)
     95 
     96 #define FETCH(rd, _count) lhu rd, ((_count) * 2)(rPC)
     97 #define FETCH_S(rd, _count) lh rd, ((_count) * 2)(rPC)
     98 
     99 #ifdef HAVE_LITTLE_ENDIAN
    100 
    101 #define FETCH_B(rd, _count) lbu rd, ((_count) * 2)(rPC)
    102 #define FETCH_C(rd, _count) lbu rd, ((_count) * 2 + 1)(rPC)
    103 
    104 #else
    105 
    106 #define FETCH_B(rd, _count) lbu rd, ((_count) * 2 + 1)(rPC)
    107 #define FETCH_C(rd, _count) lbu rd, ((_count) * 2)(rPC)
    108 
    109 #endif
    110 
    111 #define GET_INST_OPCODE(rd) and rd, rINST, 0xFF
    112 
    113 /*
    114  * Put the prefetched instruction's opcode field into the specified register.
    115  */
    116 
    117 #define GET_PREFETCHED_OPCODE(dreg, sreg)   andi     dreg, sreg, 255
    118 
    119 #define GOTO_OPCODE(rd) sll rd, rd, 7; \
    120     addu      rd, rIBASE, rd; \
    121     jr        rd
    122 
    123 #define GOTO_OPCODE_BASE(_base, rd)  sll rd, rd, 7; \
    124     addu      rd, _base, rd; \
    125     jr        rd
    126 
    127 #define GET_VREG(rd, rix) LOAD_eas2(rd, rFP, rix)
    128 
    129 #define GET_VREG_F(rd, rix) EAS2(AT, rFP, rix); \
    130     .set noat; l.s rd, (AT); .set at
    131 
    132 #define SET_VREG(rd, rix) STORE_eas2(rd, rFP, rix)
    133 
    134 #define SET_VREG_GOTO(rd, rix, dst) .set noreorder; \
    135     sll       dst, dst, 7; \
    136     addu      dst, rIBASE, dst; \
    137     sll       t8, rix, 2; \
    138     addu      t8, t8, rFP; \
    139     jr        dst; \
    140     sw        rd, 0(t8); \
    141     .set reorder
    142 
    143 #define SET_VREG_F(rd, rix) EAS2(AT, rFP, rix); \
    144     .set noat; s.s rd, (AT); .set at
    145 
    146 
    147 #define GET_OPA(rd) srl rd, rINST, 8
    148 #ifndef MIPS32R2
    149 #define GET_OPA4(rd) GET_OPA(rd); and rd, 0xf
    150 #else
    151 #define GET_OPA4(rd) ext rd, rINST, 8, 4
    152 #endif
    153 #define GET_OPB(rd) srl rd, rINST, 12
    154 
    155 #define LOAD_rSELF_OFF(rd, off) lw rd, offThread_##off## (rSELF)
    156 
    157 #define LOAD_rSELF_method(rd) LOAD_rSELF_OFF(rd, method)
    158 #define LOAD_rSELF_methodClassDex(rd) LOAD_rSELF_OFF(rd, methodClassDex)
    159 #define LOAD_rSELF_interpStackEnd(rd) LOAD_rSELF_OFF(rd, interpStackEnd)
    160 #define LOAD_rSELF_retval(rd) LOAD_rSELF_OFF(rd, retval)
    161 #define LOAD_rSELF_pActiveProfilers(rd) LOAD_rSELF_OFF(rd, pActiveProfilers)
    162 #define LOAD_rSELF_bailPtr(rd) LOAD_rSELF_OFF(rd, bailPtr)
    163 #define LOAD_rSELF_SelfSuspendCount(rd) LOAD_rSELF_OFF(rd, SelfSuspendCount)
    164 
    165 
    166 /*
    167  * Form an Effective Address rd = rbase + roff<<n;
    168  * Uses reg AT
    169  */
    170 #define EASN(rd, rbase, roff, rshift) .set noat; \
    171     sll       AT, roff, rshift; \
    172     addu      rd, rbase, AT; \
    173     .set at
    174 
    175 #define EAS1(rd, rbase, roff) EASN(rd, rbase, roff, 1)
    176 #define EAS2(rd, rbase, roff) EASN(rd, rbase, roff, 2)
    177 #define EAS3(rd, rbase, roff) EASN(rd, rbase, roff, 3)
    178 #define EAS4(rd, rbase, roff) EASN(rd, rbase, roff, 4)
    179 
    180 /*
    181  * Form an Effective Shift Right rd = rbase + roff>>n;
    182  * Uses reg AT
    183  */
    184 #define ESRN(rd, rbase, roff, rshift) .set noat; \
    185     srl       AT, roff, rshift; \
    186     addu      rd, rbase, AT; \
    187     .set at
    188 
    189 #define LOAD_eas2(rd, rbase, roff) EAS2(AT, rbase, roff); \
    190     .set noat; lw rd, 0(AT); .set at
    191 
    192 #define STORE_eas2(rd, rbase, roff) EAS2(AT, rbase, roff); \
    193     .set noat; sw rd, 0(AT); .set at
    194 
    195 #define LOAD_RB_OFF(rd, rbase, off) lw rd, off(rbase)
    196 #define LOADu2_RB_OFF(rd, rbase, off) lhu rd, off(rbase)
    197 #define STORE_RB_OFF(rd, rbase, off) sw rd, off(rbase)
    198 
    199 #ifdef HAVE_LITTLE_ENDIAN
    200 
    201 #define STORE64_off(rlo, rhi, rbase, off) sw rlo, off(rbase); \
    202     sw        rhi, (off+4)(rbase)
    203 #define LOAD64_off(rlo, rhi, rbase, off) lw rlo, off(rbase); \
    204     lw        rhi, (off+4)(rbase)
    205 
    206 #define vSTORE64_off(rlo, rhi, rbase, off) sw rlo, off(rbase); \
    207     sw        rhi, (off+4)(rbase)
    208 #define vLOAD64_off(rlo, rhi, rbase, off) lw rlo, off(rbase); \
    209     lw        rhi, (off+4)(rbase)
    210 
    211 #define STORE64_off_F(rlo, rhi, rbase, off) s.s rlo, off(rbase); \
    212     s.s       rhi, (off+4)(rbase)
    213 #define LOAD64_off_F(rlo, rhi, rbase, off) l.s rlo, off(rbase); \
    214     l.s       rhi, (off+4)(rbase)
    215 #else
    216 
    217 #define STORE64_off(rlo, rhi, rbase, off) sw rlo, (off+4)(rbase); \
    218     sw        rhi, (off)(rbase)
    219 #define LOAD64_off(rlo, rhi, rbase, off) lw rlo, (off+4)(rbase); \
    220     lw        rhi, (off)(rbase)
    221 #define vSTORE64_off(rlo, rhi, rbase, off) sw rlo, (off+4)(rbase); \
    222     sw        rhi, (off)(rbase)
    223 #define vLOAD64_off(rlo, rhi, rbase, off) lw rlo, (off+4)(rbase); \
    224     lw        rhi, (off)(rbase)
    225 #define STORE64_off_F(rlo, rhi, rbase, off) s.s rlo, (off+4)(rbase); \
    226     s.s       rhi, (off)(rbase)
    227 #define LOAD64_off_F(rlo, rhi, rbase, off) l.s rlo, (off+4)(rbase); \
    228     l.s       rhi, (off)(rbase)
    229 #endif
    230 
    231 #define STORE64(rlo, rhi, rbase) STORE64_off(rlo, rhi, rbase, 0)
    232 #define LOAD64(rlo, rhi, rbase) LOAD64_off(rlo, rhi, rbase, 0)
    233 
    234 #define vSTORE64(rlo, rhi, rbase) vSTORE64_off(rlo, rhi, rbase, 0)
    235 #define vLOAD64(rlo, rhi, rbase) vLOAD64_off(rlo, rhi, rbase, 0)
    236 
    237 #define STORE64_F(rlo, rhi, rbase) STORE64_off_F(rlo, rhi, rbase, 0)
    238 #define LOAD64_F(rlo, rhi, rbase) LOAD64_off_F(rlo, rhi, rbase, 0)
    239 
    240 #define STORE64_lo(rd, rbase) sw rd, 0(rbase)
    241 #define STORE64_hi(rd, rbase) sw rd, 4(rbase)
    242 
    243 
    244 #define LOAD_offThread_exception(rd, rbase) LOAD_RB_OFF(rd, rbase, offThread_exception)
    245 #define LOAD_base_offArrayObject_length(rd, rbase) LOAD_RB_OFF(rd, rbase, offArrayObject_length)
    246 #define LOAD_base_offClassObject_accessFlags(rd, rbase) LOAD_RB_OFF(rd, rbase, offClassObject_accessFlags)
    247 #define LOAD_base_offClassObject_descriptor(rd, rbase) LOAD_RB_OFF(rd, rbase, offClassObject_descriptor)
    248 #define LOAD_base_offClassObject_super(rd, rbase) LOAD_RB_OFF(rd, rbase, offClassObject_super)
    249 
    250 #define LOAD_base_offClassObject_vtable(rd, rbase) LOAD_RB_OFF(rd, rbase, offClassObject_vtable)
    251 #define LOAD_base_offClassObject_vtableCount(rd, rbase) LOAD_RB_OFF(rd, rbase, offClassObject_vtableCount)
    252 #define LOAD_base_offDvmDex_pResClasses(rd, rbase) LOAD_RB_OFF(rd, rbase, offDvmDex_pResClasses)
    253 #define LOAD_base_offDvmDex_pResFields(rd, rbase) LOAD_RB_OFF(rd, rbase, offDvmDex_pResFields)
    254 
    255 #define LOAD_base_offDvmDex_pResMethods(rd, rbase) LOAD_RB_OFF(rd, rbase, offDvmDex_pResMethods)
    256 #define LOAD_base_offDvmDex_pResStrings(rd, rbase) LOAD_RB_OFF(rd, rbase, offDvmDex_pResStrings)
    257 #define LOAD_base_offInstField_byteOffset(rd, rbase) LOAD_RB_OFF(rd, rbase, offInstField_byteOffset)
    258 #define LOAD_base_offStaticField_value(rd, rbase) LOAD_RB_OFF(rd, rbase, offStaticField_value)
    259 #define LOAD_base_offMethod_clazz(rd, rbase) LOAD_RB_OFF(rd, rbase, offMethod_clazz)
    260 
    261 #define LOAD_base_offMethod_name(rd, rbase) LOAD_RB_OFF(rd, rbase, offMethod_name)
    262 #define LOAD_base_offObject_clazz(rd, rbase) LOAD_RB_OFF(rd, rbase, offObject_clazz)
    263 
    264 #define LOADu2_offMethod_methodIndex(rd, rbase) LOADu2_RB_OFF(rd, rbase, offMethod_methodIndex)
    265 
    266 
    267 #define STORE_offThread_exception(rd, rbase) STORE_RB_OFF(rd, rbase, offThread_exception)
    268 
    269 
    270 #define STACK_STORE(rd, off) sw rd, off(sp)
    271 #define STACK_LOAD(rd, off) lw rd, off(sp)
    272 #define CREATE_STACK(n) subu sp, sp, n
    273 #define DELETE_STACK(n) addu sp, sp, n
    274 
    275 #define SAVE_RA(offset) STACK_STORE(ra, offset)
    276 #define LOAD_RA(offset) STACK_LOAD(ra, offset)
    277 
    278 #define LOAD_ADDR(dest, addr) la dest, addr
    279 #define LOAD_IMM(dest, imm) li dest, imm
    280 #define MOVE_REG(dest, src) move dest, src
    281 #define RETURN jr ra
    282 #define STACK_SIZE 128
    283 
    284 #define STACK_OFFSET_ARG04 16
    285 #define STACK_OFFSET_ARG05 20
    286 #define STACK_OFFSET_ARG06 24
    287 #define STACK_OFFSET_ARG07 28
    288 #define STACK_OFFSET_SCR   32
    289 #define STACK_OFFSET_SCRMX 80
    290 #define STACK_OFFSET_GP    84
    291 #define STACK_OFFSET_rFP   112
    292 
    293 #define JAL(n) jal n
    294 #define BAL(n) bal n
    295 
    296 #define STACK_STORE_RA() CREATE_STACK(STACK_SIZE); \
    297     STACK_STORE(gp, STACK_OFFSET_GP); \
    298     STACK_STORE(ra, 124)
    299 
    300 #define STACK_STORE_S0() STACK_STORE_RA(); \
    301     STACK_STORE(s0, 116)
    302 
    303 #define STACK_STORE_S0S1() STACK_STORE_S0(); \
    304     STACK_STORE(s1, STACK_OFFSET_rFP)
    305 
    306 #define STACK_LOAD_RA() STACK_LOAD(ra, 124); \
    307     STACK_LOAD(gp, STACK_OFFSET_GP); \
    308     DELETE_STACK(STACK_SIZE)
    309 
    310 #define STACK_LOAD_S0() STACK_LOAD(s0, 116); \
    311     STACK_LOAD_RA()
    312 
    313 #define STACK_LOAD_S0S1() STACK_LOAD(s1, STACK_OFFSET_rFP); \
    314     STACK_LOAD_S0()
    315 
    316 #define STACK_STORE_FULL() CREATE_STACK(STACK_SIZE); \
    317     STACK_STORE(ra, 124); \
    318     STACK_STORE(fp, 120); \
    319     STACK_STORE(s0, 116); \
    320     STACK_STORE(s1, STACK_OFFSET_rFP); \
    321     STACK_STORE(s2, 108); \
    322     STACK_STORE(s3, 104); \
    323     STACK_STORE(s4, 100); \
    324     STACK_STORE(s5, 96); \
    325     STACK_STORE(s6, 92); \
    326     STACK_STORE(s7, 88);
    327 
    328 #define STACK_LOAD_FULL() STACK_LOAD(gp, STACK_OFFSET_GP); \
    329     STACK_LOAD(s7, 88); \
    330     STACK_LOAD(s6, 92); \
    331     STACK_LOAD(s5, 96); \
    332     STACK_LOAD(s4, 100); \
    333     STACK_LOAD(s3, 104); \
    334     STACK_LOAD(s2, 108); \
    335     STACK_LOAD(s1, STACK_OFFSET_rFP); \
    336     STACK_LOAD(s0, 116); \
    337     STACK_LOAD(fp, 120); \
    338     STACK_LOAD(ra, 124); \
    339     DELETE_STACK(STACK_SIZE)
    340 
    341 /*
    342  * first 8 words are reserved for function calls
    343  * Maximum offset is STACK_OFFSET_SCRMX-STACK_OFFSET_SCR
    344  */
    345 #define SCRATCH_STORE(r,off) \
    346     STACK_STORE(r, STACK_OFFSET_SCR+off);
    347 #define SCRATCH_LOAD(r,off) \
    348     STACK_LOAD(r, STACK_OFFSET_SCR+off);
    349 
    350 #if defined(WITH_JIT)
    351 #include "../common/jit-config.h"
    352 #endif
    353 
    354 /* File: mips/platform.S */
    355 /*
    356  * ===========================================================================
    357  *  CPU-version-specific defines
    358  * ===========================================================================
    359  */
    360 
    361 #if !defined(ANDROID_SMP)
    362 # error "Must define ANDROID_SMP"
    363 #endif
    364 
    365 /*
    366  * Macro for data memory barrier.
    367  */
    368 .macro SMP_DMB
    369 #if ANDROID_SMP != 0
    370     sync
    371 #else
    372     /* not SMP */
    373 #endif
    374 .endm
    375 
    376 /*
    377  * Macro for data memory barrier (store/store variant).
    378  */
    379 .macro  SMP_DMB_ST
    380 #if ANDROID_SMP != 0
    381     // FIXME: Is this really needed?
    382     sync
    383 #else
    384     /* not SMP */
    385 #endif
    386 .endm
    387 
    388 /* File: mips/entry.S */
    389 
    390 /*
    391  * Copyright (C) 2008 The Android Open Source Project
    392  *
    393  * Licensed under the Apache License, Version 2.0 (the "License");
    394  * you may not use this file except in compliance with the License.
    395  * You may obtain a copy of the License at
    396  *
    397  *      http://www.apache.org/licenses/LICENSE-2.0
    398  *
    399  * Unless required by applicable law or agreed to in writing, software
    400  * distributed under the License is distributed on an "AS IS" BASIS,
    401  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    402  * See the License for the specific language governing permissions and
    403  * limitations under the License.
    404  */
    405 /*
    406  * Interpreter entry point.
    407  */
    408 
    409 #define ASSIST_DEBUGGER 1
    410 
    411     .text
    412     .align 2
    413     .global dvmMterpStdRun
    414     .ent dvmMterpStdRun
    415     .frame sp, STACK_SIZE, ra
    416 /*
    417  * On entry:
    418  *  r0  Thread* self
    419  *
    420  * The return comes via a call to dvmMterpStdBail().
    421  */
    422 
    423 dvmMterpStdRun:
    424     .set noreorder
    425     .cpload t9
    426     .set reorder
    427 /* Save to the stack. Frame size = STACK_SIZE */
    428     STACK_STORE_FULL()
    429 /* This directive will make sure all subsequent jal restore gp at a known offset */
    430     .cprestore STACK_OFFSET_GP
    431 
    432     addu      fp, sp, STACK_SIZE           #  Move Frame Pointer to the base of frame
    433     /* save stack pointer, add magic word for debuggerd */
    434     sw        sp, offThread_bailPtr(a0)      # Save SP
    435 
    436     /* set up "named" registers, figure out entry point */
    437     move      rSELF, a0                    #  set rSELF
    438     LOAD_PC_FROM_SELF()
    439     LOAD_FP_FROM_SELF()
    440     lw        rIBASE, offThread_curHandlerTable(rSELF)
    441 
    442 #if defined(WITH_JIT)
    443 .LentryInstr:
    444     /* Entry is always a possible trace start */
    445     lw        a0, offThread_pJitProfTable(rSELF)
    446     FETCH_INST()                           #  load rINST from rPC
    447     sw        zero, offThread_inJitCodeCache(rSELF)
    448 #if !defined(WITH_SELF_VERIFICATION)
    449     bnez      a0, common_updateProfile     # profiling is enabled
    450 #else
    451     lw       a2, offThread_shadowSpace(rSELF) # to find out the jit exit state
    452     beqz     a0, 1f                        # profiling is disabled
    453     lw       a3, offShadowSpace_jitExitState(a2) # jit exit state
    454     li	     t0, kSVSTraceSelect
    455     bne      a3, t0, 2f
    456     li       a2, kJitTSelectRequestHot     # ask for trace selection
    457     b        common_selectTrace            # go build the trace
    458 2:
    459     li       a4, kSVSNoProfile
    460     beq      a3, a4, 1f                    # don't profile the next instruction?
    461     b        common_updateProfile          # collect profiles
    462 #endif
    463 1:
    464     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    465     GOTO_OPCODE(t0)                        #  jump to next instruction
    466 #else
    467     /* start executing the instruction at rPC */
    468     FETCH_INST()                           #  load rINST from rPC
    469     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    470     GOTO_OPCODE(t0)                        #  jump to next instruction
    471 #endif
    472 
    473 .Lbad_arg:
    474     la        a0, .LstrBadEntryPoint
    475     #a1 holds value of entryPoint
    476     JAL(printf)
    477     JAL(dvmAbort)
    478 
    479     .end dvmMterpStdRun
    480 
    481     .global dvmMterpStdBail
    482     .ent dvmMterpStdBail
    483 
    484 /* Restore the stack pointer and all the registers stored at sp from the save
    485  * point established  on entry. Return to whoever called dvmMterpStdRun.
    486  *
    487  * On entry:
    488  *   a0    Thread* self
    489  */
    490 dvmMterpStdBail:
    491     lw        sp, offThread_bailPtr(a0)      #  Restore sp
    492     STACK_LOAD_FULL()
    493     jr        ra
    494 
    495     .end dvmMterpStdBail
    496 
    497 
    498     .global dvmAsmInstructionStart
    499     .type   dvmAsmInstructionStart, %function
    500 dvmAsmInstructionStart = .L_OP_NOP
    501     .text
    502 
    503 /* ------------------------------ */
    504     .balign 128
    505 .L_OP_NOP: /* 0x00 */
    506 /* File: mips/OP_NOP.S */
    507     FETCH_ADVANCE_INST(1)                  #  advance to next instr, load rINST
    508     GET_INST_OPCODE(t0)
    509     GOTO_OPCODE(t0)                        #  execute it
    510 
    511 #ifdef ASSIST_DEBUGGER
    512     /* insert fake function header to help gdb find the stack frame */
    513     .type dalvik_inst, @function
    514 dalvik_inst:
    515     .ent dalvik_inst
    516     .end dalvik_inst
    517 #endif
    518 
    519 
    520 /* ------------------------------ */
    521     .balign 128
    522 .L_OP_MOVE: /* 0x01 */
    523 /* File: mips/OP_MOVE.S */
    524     /* for move, move-object, long-to-int */
    525     /* op vA, vB */
    526     GET_OPB(a1)                            #  a1 <- B from 15:12
    527     GET_OPA4(a0)                           #  a0 <- A from 11:8
    528     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
    529     GET_VREG(a2, a1)                       #  a2 <- fp[B]
    530     GET_INST_OPCODE(t0)                    #  t0 <- opcode from rINST
    531     SET_VREG_GOTO(a2, a0, t0)              #  fp[A] <- a2
    532 
    533 
    534 /* ------------------------------ */
    535     .balign 128
    536 .L_OP_MOVE_FROM16: /* 0x02 */
    537 /* File: mips/OP_MOVE_FROM16.S */
    538     /* for: move/from16, move-object/from16 */
    539     /* op vAA, vBBBB */
    540     FETCH(a1, 1)                           #  a1 <- BBBB
    541     GET_OPA(a0)                            #  a0 <- AA
    542     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
    543     GET_VREG(a2, a1)                       #  a2 <- fp[BBBB]
    544     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    545     SET_VREG_GOTO(a2, a0, t0)              #  fp[AA] <- a2
    546 
    547 
    548 /* ------------------------------ */
    549     .balign 128
    550 .L_OP_MOVE_16: /* 0x03 */
    551 /* File: mips/OP_MOVE_16.S */
    552     /* for: move/16, move-object/16 */
    553     /* op vAAAA, vBBBB */
    554     FETCH(a1, 2)                           #  a1 <- BBBB
    555     FETCH(a0, 1)                           #  a0 <- AAAA
    556     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
    557     GET_VREG(a2, a1)                       #  a2 <- fp[BBBB]
    558     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    559     SET_VREG_GOTO(a2, a0, t0)              #  fp[AAAA] <- a2 and jump
    560 
    561 
    562 /* ------------------------------ */
    563     .balign 128
    564 .L_OP_MOVE_WIDE: /* 0x04 */
    565 /* File: mips/OP_MOVE_WIDE.S */
    566     /* move-wide vA, vB */
    567     /* NOTE: regs can overlap, e.g. "move v6, v7" or "move v7, v6" */
    568     GET_OPA4(a2)                           #  a2 <- A(+)
    569     GET_OPB(a3)                            #  a3 <- B
    570     EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
    571     EAS2(a2, rFP, a2)                      #  a2 <- &fp[A]
    572     LOAD64(a0, a1, a3)                     #  a0/a1 <- fp[B]
    573     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
    574     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    575     STORE64(a0, a1, a2)                    #  fp[A] <- a0/a1
    576     GOTO_OPCODE(t0)                        #  jump to next instruction
    577 
    578 
    579 /* ------------------------------ */
    580     .balign 128
    581 .L_OP_MOVE_WIDE_FROM16: /* 0x05 */
    582 /* File: mips/OP_MOVE_WIDE_FROM16.S */
    583     /* move-wide/from16 vAA, vBBBB */
    584     /* NOTE: regs can overlap, e.g. "move v6, v7" or "move v7, v6" */
    585     FETCH(a3, 1)                           #  a3 <- BBBB
    586     GET_OPA(a2)                            #  a2 <- AA
    587     EAS2(a3, rFP, a3)                      #  a3 <- &fp[BBBB]
    588     EAS2(a2, rFP, a2)                      #  a2 <- &fp[AA]
    589     LOAD64(a0, a1, a3)                     #  a0/a1 <- fp[BBBB]
    590     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
    591     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    592     STORE64(a0, a1, a2)                    #  fp[AA] <- a0/a1
    593     GOTO_OPCODE(t0)                        #  jump to next instruction
    594 
    595 
    596 /* ------------------------------ */
    597     .balign 128
    598 .L_OP_MOVE_WIDE_16: /* 0x06 */
    599 /* File: mips/OP_MOVE_WIDE_16.S */
    600     /* move-wide/16 vAAAA, vBBBB */
    601     /* NOTE: regs can overlap, e.g. "move v6, v7" or "move v7, v6" */
    602     FETCH(a3, 2)                           #  a3 <- BBBB
    603     FETCH(a2, 1)                           #  a2 <- AAAA
    604     EAS2(a3, rFP, a3)                      #  a3 <- &fp[BBBB]
    605     EAS2(a2, rFP, a2)                      #  a2 <- &fp[AAAA]
    606     LOAD64(a0, a1, a3)                     #  a0/a1 <- fp[BBBB]
    607     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
    608     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    609     STORE64(a0, a1, a2)                    #  fp[AAAA] <- a0/a1
    610     GOTO_OPCODE(t0)                        #  jump to next instruction
    611 
    612 
    613 /* ------------------------------ */
    614     .balign 128
    615 .L_OP_MOVE_OBJECT: /* 0x07 */
    616 /* File: mips/OP_MOVE_OBJECT.S */
    617 /* File: mips/OP_MOVE.S */
    618     /* for move, move-object, long-to-int */
    619     /* op vA, vB */
    620     GET_OPB(a1)                            #  a1 <- B from 15:12
    621     GET_OPA4(a0)                           #  a0 <- A from 11:8
    622     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
    623     GET_VREG(a2, a1)                       #  a2 <- fp[B]
    624     GET_INST_OPCODE(t0)                    #  t0 <- opcode from rINST
    625     SET_VREG_GOTO(a2, a0, t0)              #  fp[A] <- a2
    626 
    627 
    628 
    629 /* ------------------------------ */
    630     .balign 128
    631 .L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
    632 /* File: mips/OP_MOVE_OBJECT_FROM16.S */
    633 /* File: mips/OP_MOVE_FROM16.S */
    634     /* for: move/from16, move-object/from16 */
    635     /* op vAA, vBBBB */
    636     FETCH(a1, 1)                           #  a1 <- BBBB
    637     GET_OPA(a0)                            #  a0 <- AA
    638     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
    639     GET_VREG(a2, a1)                       #  a2 <- fp[BBBB]
    640     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    641     SET_VREG_GOTO(a2, a0, t0)              #  fp[AA] <- a2
    642 
    643 
    644 
    645 /* ------------------------------ */
    646     .balign 128
    647 .L_OP_MOVE_OBJECT_16: /* 0x09 */
    648 /* File: mips/OP_MOVE_OBJECT_16.S */
    649 /* File: mips/OP_MOVE_16.S */
    650     /* for: move/16, move-object/16 */
    651     /* op vAAAA, vBBBB */
    652     FETCH(a1, 2)                           #  a1 <- BBBB
    653     FETCH(a0, 1)                           #  a0 <- AAAA
    654     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
    655     GET_VREG(a2, a1)                       #  a2 <- fp[BBBB]
    656     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    657     SET_VREG_GOTO(a2, a0, t0)              #  fp[AAAA] <- a2 and jump
    658 
    659 
    660 
    661 /* ------------------------------ */
    662     .balign 128
    663 .L_OP_MOVE_RESULT: /* 0x0a */
    664 /* File: mips/OP_MOVE_RESULT.S */
    665     /* for: move-result, move-result-object */
    666     /* op vAA */
    667     GET_OPA(a2)                            #  a2 <- AA
    668     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
    669     LOAD_rSELF_retval(a0)                  #  a0 <- self->retval.i
    670     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    671     SET_VREG_GOTO(a0, a2, t0)              #  fp[AA] <- a0
    672 
    673 
    674 /* ------------------------------ */
    675     .balign 128
    676 .L_OP_MOVE_RESULT_WIDE: /* 0x0b */
    677 /* File: mips/OP_MOVE_RESULT_WIDE.S */
    678     /* move-result-wide vAA */
    679     GET_OPA(a2)                            #  a2 <- AA
    680     addu      a3, rSELF, offThread_retval  #  a3 <- &self->retval
    681     EAS2(a2, rFP, a2)                      #  a2 <- &fp[AA]
    682     LOAD64(a0, a1, a3)                     #  a0/a1 <- retval.j
    683     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
    684     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    685     STORE64(a0, a1, a2)                    #  fp[AA] <- a0/a1
    686     GOTO_OPCODE(t0)                        #  jump to next instruction
    687 
    688 
    689 /* ------------------------------ */
    690     .balign 128
    691 .L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
    692 /* File: mips/OP_MOVE_RESULT_OBJECT.S */
    693 /* File: mips/OP_MOVE_RESULT.S */
    694     /* for: move-result, move-result-object */
    695     /* op vAA */
    696     GET_OPA(a2)                            #  a2 <- AA
    697     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
    698     LOAD_rSELF_retval(a0)                  #  a0 <- self->retval.i
    699     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    700     SET_VREG_GOTO(a0, a2, t0)              #  fp[AA] <- a0
    701 
    702 
    703 
    704 /* ------------------------------ */
    705     .balign 128
    706 .L_OP_MOVE_EXCEPTION: /* 0x0d */
    707 /* File: mips/OP_MOVE_EXCEPTION.S */
    708     /* move-exception vAA */
    709     GET_OPA(a2)                            #  a2 <- AA
    710     LOAD_offThread_exception(a3, rSELF)    #  a3 <- dvmGetException bypass
    711     li        a1, 0                        #  a1 <- 0
    712     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
    713     SET_VREG(a3, a2)                       #  fp[AA] <- exception obj
    714     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    715     STORE_offThread_exception(a1, rSELF)   #  dvmClearException bypass
    716     GOTO_OPCODE(t0)                        #  jump to next instruction
    717 
    718 
    719 /* ------------------------------ */
    720     .balign 128
    721 .L_OP_RETURN_VOID: /* 0x0e */
    722 /* File: mips/OP_RETURN_VOID.S */
    723     b         common_returnFromMethod
    724 
    725 
    726 /* ------------------------------ */
    727     .balign 128
    728 .L_OP_RETURN: /* 0x0f */
    729 /* File: mips/OP_RETURN.S */
    730     /*
    731      * Return a 32-bit value.  Copies the return value into the "thread"
    732      * structure, then jumps to the return handler.
    733      *
    734      * for: return, return-object
    735      */
    736     /* op vAA */
    737     GET_OPA(a2)                            #  a2 <- AA
    738     GET_VREG(a0, a2)                       #  a0 <- vAA
    739     sw        a0, offThread_retval(rSELF)  #  retval.i <- vAA
    740     b         common_returnFromMethod
    741 
    742 
    743 /* ------------------------------ */
    744     .balign 128
    745 .L_OP_RETURN_WIDE: /* 0x10 */
    746 /* File: mips/OP_RETURN_WIDE.S */
    747     /*
    748      * Return a 64-bit value.  Copies the return value into the "thread"
    749      * structure, then jumps to the return handler.
    750      */
    751     /* return-wide vAA */
    752     GET_OPA(a2)                            #  a2 <- AA
    753     EAS2(a2, rFP, a2)                      #  a2 <- &fp[AA]
    754     addu      a3, rSELF, offThread_retval  #  a3 <- &self->retval
    755     LOAD64(a0, a1, a2)                     #  a0/a1 <- vAA/vAA+1
    756     STORE64(a0, a1, a3)                    #  retval <- a0/a1
    757     b         common_returnFromMethod
    758 
    759 
    760 /* ------------------------------ */
    761     .balign 128
    762 .L_OP_RETURN_OBJECT: /* 0x11 */
    763 /* File: mips/OP_RETURN_OBJECT.S */
    764 /* File: mips/OP_RETURN.S */
    765     /*
    766      * Return a 32-bit value.  Copies the return value into the "thread"
    767      * structure, then jumps to the return handler.
    768      *
    769      * for: return, return-object
    770      */
    771     /* op vAA */
    772     GET_OPA(a2)                            #  a2 <- AA
    773     GET_VREG(a0, a2)                       #  a0 <- vAA
    774     sw        a0, offThread_retval(rSELF)  #  retval.i <- vAA
    775     b         common_returnFromMethod
    776 
    777 
    778 
    779 /* ------------------------------ */
    780     .balign 128
    781 .L_OP_CONST_4: /* 0x12 */
    782 /* File: mips/OP_CONST_4.S */
    783     # const/4 vA,                          /* +B */
    784     sll       a1, rINST, 16                #  a1 <- Bxxx0000
    785     GET_OPA(a0)                            #  a0 <- A+
    786     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
    787     sra       a1, a1, 28                   #  a1 <- sssssssB (sign-extended)
    788     and       a0, a0, 15
    789     GET_INST_OPCODE(t0)                    #  ip <- opcode from rINST
    790     SET_VREG_GOTO(a1, a0, t0)              #  fp[A] <- a1
    791 
    792 
    793 /* ------------------------------ */
    794     .balign 128
    795 .L_OP_CONST_16: /* 0x13 */
    796 /* File: mips/OP_CONST_16.S */
    797     # const/16 vAA,                        /* +BBBB */
    798     FETCH_S(a0, 1)                         #  a0 <- ssssBBBB (sign-extended)
    799     GET_OPA(a3)                            #  a3 <- AA
    800     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
    801     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    802     SET_VREG_GOTO(a0, a3, t0)              #  vAA <- a0
    803 
    804 
    805 /* ------------------------------ */
    806     .balign 128
    807 .L_OP_CONST: /* 0x14 */
    808 /* File: mips/OP_CONST.S */
    809     # const vAA,                           /* +BBBBbbbb */
    810     GET_OPA(a3)                            #  a3 <- AA
    811     FETCH(a0, 1)                           #  a0 <- bbbb (low)
    812     FETCH(a1, 2)                           #  a1 <- BBBB (high)
    813     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
    814     sll       a1, a1, 16
    815     or        a0, a1, a0                   #  a0 <- BBBBbbbb
    816     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    817     SET_VREG_GOTO(a0, a3, t0)              #  vAA <- a0
    818 
    819 
    820 /* ------------------------------ */
    821     .balign 128
    822 .L_OP_CONST_HIGH16: /* 0x15 */
    823 /* File: mips/OP_CONST_HIGH16.S */
    824     # const/high16 vAA,                    /* +BBBB0000 */
    825     FETCH(a0, 1)                           #  a0 <- 0000BBBB (zero-extended)
    826     GET_OPA(a3)                            #  a3 <- AA
    827     sll       a0, a0, 16                   #  a0 <- BBBB0000
    828     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
    829     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    830     SET_VREG_GOTO(a0, a3, t0)              #  vAA <- a0
    831 
    832 
    833 /* ------------------------------ */
    834     .balign 128
    835 .L_OP_CONST_WIDE_16: /* 0x16 */
    836 /* File: mips/OP_CONST_WIDE_16.S */
    837     # const-wide/16 vAA,                   /* +BBBB */
    838     FETCH_S(a0, 1)                         #  a0 <- ssssBBBB (sign-extended)
    839     GET_OPA(a3)                            #  a3 <- AA
    840     sra       a1, a0, 31                   #  a1 <- ssssssss
    841     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
    842     EAS2(a3, rFP, a3)                      #  a3 <- &fp[AA]
    843     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    844     STORE64(a0, a1, a3)                    #  vAA <- a0/a1
    845     GOTO_OPCODE(t0)                        #  jump to next instruction
    846 
    847 
    848 /* ------------------------------ */
    849     .balign 128
    850 .L_OP_CONST_WIDE_32: /* 0x17 */
    851 /* File: mips/OP_CONST_WIDE_32.S */
    852     # const-wide/32 vAA,                   /* +BBBBbbbb */
    853     FETCH(a0, 1)                           #  a0 <- 0000bbbb (low)
    854     GET_OPA(a3)                            #  a3 <- AA
    855     FETCH_S(a2, 2)                         #  a2 <- ssssBBBB (high)
    856     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
    857     sll       a2, a2, 16
    858     or        a0, a0, a2                   #  a0 <- BBBBbbbb
    859     EAS2(a3, rFP, a3)                      #  a3 <- &fp[AA]
    860     sra       a1, a0, 31                   #  a1 <- ssssssss
    861     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    862     STORE64(a0, a1, a3)                    #  vAA <- a0/a1
    863     GOTO_OPCODE(t0)                        #  jump to next instruction
    864 
    865 
    866 /* ------------------------------ */
    867     .balign 128
    868 .L_OP_CONST_WIDE: /* 0x18 */
    869 /* File: mips/OP_CONST_WIDE.S */
    870     # const-wide vAA,                      /* +HHHHhhhhBBBBbbbb */
    871     FETCH(a0, 1)                           #  a0 <- bbbb (low)
    872     FETCH(a1, 2)                           #  a1 <- BBBB (low middle)
    873     FETCH(a2, 3)                           #  a2 <- hhhh (high middle)
    874     sll       a1, 16 #
    875     or        a0, a1                       #  a0 <- BBBBbbbb (low word)
    876     FETCH(a3, 4)                           #  a3 <- HHHH (high)
    877     GET_OPA(t1)                            #  t1 <- AA
    878     sll       a3, 16
    879     or        a1, a3, a2                   #  a1 <- HHHHhhhh (high word)
    880     FETCH_ADVANCE_INST(5)                  #  advance rPC, load rINST
    881     EAS2(t1, rFP, t1)                      #  t1 <- &fp[AA]
    882     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    883     STORE64(a0, a1, t1)                    #  vAA <- a0/a1
    884     GOTO_OPCODE(t0)                        #  jump to next instruction
    885 
    886 
    887 /* ------------------------------ */
    888     .balign 128
    889 .L_OP_CONST_WIDE_HIGH16: /* 0x19 */
    890 /* File: mips/OP_CONST_WIDE_HIGH16.S */
    891     # const-wide/high16 vAA,               /* +BBBB000000000000 */
    892     FETCH(a1, 1)                           #  a1 <- 0000BBBB (zero-extended)
    893     GET_OPA(a3)                            #  a3 <- AA
    894     li        a0, 0                        #  a0 <- 00000000
    895     sll       a1, 16                       #  a1 <- BBBB0000
    896     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
    897     EAS2(a3, rFP, a3)                      #  a3 <- &fp[AA]
    898     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    899     STORE64(a0, a1, a3)                    #  vAA <- a0/a1
    900     GOTO_OPCODE(t0)                        #  jump to next instruction
    901 
    902 
    903 /* ------------------------------ */
    904     .balign 128
    905 .L_OP_CONST_STRING: /* 0x1a */
    906 /* File: mips/OP_CONST_STRING.S */
    907     # const/string vAA, String             /* BBBB */
    908     FETCH(a1, 1)                           #  a1 <- BBBB
    909     LOAD_rSELF_methodClassDex(a2)          #  a2 <- self->methodClassDex
    910     GET_OPA(rOBJ)                          #  rOBJ <- AA
    911     LOAD_base_offDvmDex_pResStrings(a2, a2) #  a2 <- dvmDex->pResStrings
    912     LOAD_eas2(v0, a2, a1)                  #  v0 <- pResStrings[BBBB]
    913     # not yet resolved?
    914     bnez      v0, .LOP_CONST_STRING_resolve
    915     /*
    916      * Continuation if the String has not yet been resolved.
    917      *  a1:   BBBB (String ref)
    918      *  rOBJ: target register
    919      */
    920     EXPORT_PC()
    921     LOAD_rSELF_method(a0)                  #  a0 <- self->method
    922     LOAD_base_offMethod_clazz(a0, a0)      #  a0 <- method->clazz
    923     JAL(dvmResolveString)                  #  v0 <- String reference
    924     # failed?
    925     beqz      v0, common_exceptionThrown   #  yup, handle the exception
    926 
    927 .LOP_CONST_STRING_resolve:
    928     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
    929     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    930     SET_VREG_GOTO(v0, rOBJ, t0)            #  vAA <- v0
    931 
    932 
    933 
    934 
    935 
    936 
    937 /* ------------------------------ */
    938     .balign 128
    939 .L_OP_CONST_STRING_JUMBO: /* 0x1b */
    940 /* File: mips/OP_CONST_STRING_JUMBO.S */
    941     # const/string vAA, String             /* BBBBBBBB */
    942     FETCH(a0, 1)                           #  a0 <- bbbb (low)
    943     FETCH(a1, 2)                           #  a1 <- BBBB (high)
    944     LOAD_rSELF_methodClassDex(a2)          #  a2 <- self->methodClassDex
    945     GET_OPA(rOBJ)                          #  rOBJ <- AA
    946     LOAD_base_offDvmDex_pResStrings(a2, a2) #  a2 <- dvmDex->pResStrings
    947     sll       a1, a1, 16
    948     or        a1, a1, a0                   #  a1 <- BBBBbbbb
    949     LOAD_eas2(v0, a2, a1)                  #  v0 <- pResStrings[BBBB]
    950     bnez      v0, .LOP_CONST_STRING_JUMBO_resolve
    951 
    952     /*
    953      * Continuation if the String has not yet been resolved.
    954      *  a1: BBBBBBBB (String ref)
    955      *  rOBJ: target register
    956      */
    957     EXPORT_PC()
    958     LOAD_rSELF_method(a0)                  #  a0 <- self->method
    959     LOAD_base_offMethod_clazz(a0, a0)      #  a0 <- method->clazz
    960     JAL(dvmResolveString)                  #  v0 <- String reference
    961     # failed?
    962     beqz      v0, common_exceptionThrown   #  yup, handle the exception
    963 
    964 .LOP_CONST_STRING_JUMBO_resolve:
    965     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
    966     GET_INST_OPCODE(t1)                    #  extract opcode from rINST
    967     SET_VREG_GOTO(v0, rOBJ, t1)            #  vAA <- v0
    968 
    969 
    970 /* ------------------------------ */
    971     .balign 128
    972 .L_OP_CONST_CLASS: /* 0x1c */
    973 /* File: mips/OP_CONST_CLASS.S */
    974     # const/class vAA, Class               /* BBBB */
    975     FETCH(a1, 1)                           #  a1 <- BBBB
    976     LOAD_rSELF_methodClassDex(a2)          #  a2 <- self->methodClassDex
    977     GET_OPA(rOBJ)                          #  rOBJ <- AA
    978     LOAD_base_offDvmDex_pResClasses(a2, a2) #  a2 <- dvmDex->pResClasses
    979     LOAD_eas2(v0, a2, a1)                  #  v0 <- pResClasses[BBBB]
    980 
    981     bnez      v0, .LOP_CONST_CLASS_resolve      #  v0!=0 => resolved-ok
    982     /*
    983      * Continuation if the Class has not yet been resolved.
    984      *  a1: BBBB (Class ref)
    985      *  rOBJ: target register
    986      */
    987     EXPORT_PC()
    988     LOAD_rSELF_method(a0)                  #  a0 <- self->method
    989     li        a2, 1                        #  a2 <- true
    990     LOAD_base_offMethod_clazz(a0, a0)      #  a0 <- method->clazz
    991     JAL(dvmResolveClass)                   #  v0 <- Class reference
    992     # failed==0?
    993     beqz      v0, common_exceptionThrown   #  yup, handle the exception
    994 
    995 .LOP_CONST_CLASS_resolve:
    996     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
    997     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
    998     SET_VREG_GOTO(v0, rOBJ, t0)            #  vAA <- v0
    999 
   1000 
   1001 
   1002 /* ------------------------------ */
   1003     .balign 128
   1004 .L_OP_MONITOR_ENTER: /* 0x1d */
   1005 /* File: mips/OP_MONITOR_ENTER.S */
   1006     /*
   1007      * Synchronize on an object.
   1008      */
   1009     /* monitor-enter vAA */
   1010     GET_OPA(a2)                            #  a2 <- AA
   1011     GET_VREG(a1, a2)                       #  a1 <- vAA (object)
   1012     move      a0, rSELF                    #  a0 <- self
   1013     EXPORT_PC()                            #  export PC so we can grab stack trace
   1014     # null object?
   1015     beqz      a1, common_errNullObject     #  null object, throw an exception
   1016     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   1017     JAL(dvmLockObject)                     #  call(self, obj)
   1018     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1019     GOTO_OPCODE(t0)                        #  jump to next instruction
   1020 
   1021 
   1022 /* ------------------------------ */
   1023     .balign 128
   1024 .L_OP_MONITOR_EXIT: /* 0x1e */
   1025 /* File: mips/OP_MONITOR_EXIT.S */
   1026     /*
   1027      * Unlock an object.
   1028      *
   1029      * Exceptions that occur when unlocking a monitor need to appear as
   1030      * if they happened at the following instruction.  See the Dalvik
   1031      * instruction spec.
   1032      */
   1033     /* monitor-exit vAA */
   1034     GET_OPA(a2)                            #  a2 <- AA
   1035     EXPORT_PC()                            #  before fetch: export the PC
   1036     GET_VREG(a1, a2)                       #  a1 <- vAA (object)
   1037     # null object?
   1038     beqz      a1, 1f
   1039     move      a0, rSELF                    #  a0 <- self
   1040     JAL(dvmUnlockObject)                   #  v0 <- success for unlock(self, obj)
   1041     # failed?
   1042     FETCH_ADVANCE_INST(1)                  #  before throw: advance rPC, load rINST
   1043     beqz      v0, common_exceptionThrown   #  yes, exception is pending
   1044     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1045     GOTO_OPCODE(t0)                        #  jump to next instruction
   1046 1:
   1047     FETCH_ADVANCE_INST(1)                  #  before throw: advance rPC, load rINST
   1048     b         common_errNullObject
   1049 
   1050 /* ------------------------------ */
   1051     .balign 128
   1052 .L_OP_CHECK_CAST: /* 0x1f */
   1053 /* File: mips/OP_CHECK_CAST.S */
   1054     /*
   1055      * Check to see if a cast from one class to another is allowed.
   1056      */
   1057     # check-cast vAA, class                /* BBBB */
   1058     GET_OPA(a3)                            #  a3 <- AA
   1059     FETCH(a2, 1)                           #  a2 <- BBBB
   1060     GET_VREG(rOBJ, a3)                     #  rOBJ <- object
   1061     LOAD_rSELF_methodClassDex(a0)          #  a0 <- pDvmDex
   1062     LOAD_base_offDvmDex_pResClasses(a0, a0) #  a0 <- pDvmDex->pResClasses
   1063     # is object null?
   1064     beqz      rOBJ, .LOP_CHECK_CAST_okay       #  null obj, cast always succeeds
   1065     LOAD_eas2(a1, a0, a2)                  #  a1 <- resolved class
   1066     LOAD_base_offObject_clazz(a0, rOBJ)    #  a0 <- obj->clazz
   1067     # have we resolved this before?
   1068     beqz      a1, .LOP_CHECK_CAST_resolve      #  not resolved, do it now
   1069 .LOP_CHECK_CAST_resolved:
   1070     # same class (trivial success)?
   1071     bne       a0, a1, .LOP_CHECK_CAST_fullcheck #  no, do full check
   1072 .LOP_CHECK_CAST_okay:
   1073     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   1074     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1075     GOTO_OPCODE(t0)                        #  jump to next instruction
   1076 
   1077     /*
   1078      * Trivial test failed, need to perform full check.  This is common.
   1079      *  a0 holds obj->clazz
   1080      *  a1 holds class resolved from BBBB
   1081      *  rOBJ holds object
   1082      */
   1083 .LOP_CHECK_CAST_fullcheck:
   1084     move      rBIX,a1                      #  avoid ClassObject getting clobbered
   1085     JAL(dvmInstanceofNonTrivial)           #  v0 <- boolean result
   1086     # failed?
   1087     bnez      v0, .LOP_CHECK_CAST_okay         #  no, success
   1088     b         .LOP_CHECK_CAST_castfailure
   1089 
   1090 /* ------------------------------ */
   1091     .balign 128
   1092 .L_OP_INSTANCE_OF: /* 0x20 */
   1093 /* File: mips/OP_INSTANCE_OF.S */
   1094     /*
   1095      * Check to see if an object reference is an instance of a class.
   1096      *
   1097      * Most common situation is a non-null object, being compared against
   1098      * an already-resolved class.
   1099      */
   1100     # instance-of vA, vB, class            /* CCCC */
   1101     GET_OPB(a3)                            #  a3 <- B
   1102     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   1103     GET_VREG(a0, a3)                       #  a0 <- vB (object)
   1104     LOAD_rSELF_methodClassDex(a2)          #  a2 <- pDvmDex
   1105     # is object null?
   1106     beqz      a0, .LOP_INSTANCE_OF_store        #  null obj, not an instance, store a0
   1107     FETCH(a3, 1)                           #  a3 <- CCCC
   1108     LOAD_base_offDvmDex_pResClasses(a2, a2) #  a2 <- pDvmDex->pResClasses
   1109     LOAD_eas2(a1, a2, a3)                  #  a1 <- resolved class
   1110     LOAD_base_offObject_clazz(a0, a0)      #  a0 <- obj->clazz
   1111     # have we resolved this before?
   1112     beqz      a1, .LOP_INSTANCE_OF_resolve      #  not resolved, do it now
   1113 .LOP_INSTANCE_OF_resolved:                   #  a0=obj->clazz, a1=resolved class
   1114     # same class (trivial success)?
   1115     beq       a0, a1, .LOP_INSTANCE_OF_trivial  #  yes, trivial finish
   1116     b         .LOP_INSTANCE_OF_fullcheck        #  no, do full check
   1117 
   1118     /*
   1119      * Trivial test succeeded, save and bail.
   1120      *  rOBJ holds A
   1121      */
   1122 .LOP_INSTANCE_OF_trivial:
   1123     li        a0, 1                        #  indicate success
   1124     # fall thru
   1125     /*
   1126      * a0   holds boolean result
   1127      * rOBJ holds A
   1128      */
   1129 .LOP_INSTANCE_OF_store:
   1130     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   1131     SET_VREG(a0, rOBJ)                     #  vA <- a0
   1132     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1133     GOTO_OPCODE(t0)                        #  jump to next instruction
   1134 
   1135 
   1136 /* ------------------------------ */
   1137     .balign 128
   1138 .L_OP_ARRAY_LENGTH: /* 0x21 */
   1139 /* File: mips/OP_ARRAY_LENGTH.S */
   1140     /*
   1141      * Return the length of an array.
   1142      */
   1143     GET_OPB(a1)                            #  a1 <- B
   1144     GET_OPA4(a2)                           #  a2 <- A+
   1145     GET_VREG(a0, a1)                       #  a0 <- vB (object ref)
   1146     # is object null?
   1147     beqz      a0, common_errNullObject     #  yup, fail
   1148     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   1149     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- array length
   1150     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1151     SET_VREG_GOTO(a3, a2, t0)              #  vA <- length
   1152 
   1153 
   1154 /* ------------------------------ */
   1155     .balign 128
   1156 .L_OP_NEW_INSTANCE: /* 0x22 */
   1157 /* File: mips/OP_NEW_INSTANCE.S */
   1158     /*
   1159      * Create a new instance of a class.
   1160      */
   1161     # new-instance vAA, class              /* BBBB */
   1162     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   1163     FETCH(a1, 1)                           #  a1 <- BBBB
   1164     LOAD_base_offDvmDex_pResClasses(a3, a3) #  a3 <- pDvmDex->pResClasses
   1165     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved class
   1166 #if defined(WITH_JIT)
   1167     EAS2(rBIX, a3, a1)                     #  rBIX <- &resolved_class
   1168 #endif
   1169     EXPORT_PC()                            #  req'd for init, resolve, alloc
   1170     # already resolved?
   1171     beqz      a0, .LOP_NEW_INSTANCE_resolve      #  no, resolve it now
   1172 .LOP_NEW_INSTANCE_resolved:                      #  a0=class
   1173     lbu       a1, offClassObject_status(a0) #  a1 <- ClassStatus enum
   1174     # has class been initialized?
   1175     li        t0, CLASS_INITIALIZED
   1176     move      rOBJ, a0                     #  save a0
   1177     bne       a1, t0, .LOP_NEW_INSTANCE_needinit #  no, init class now
   1178 
   1179 .LOP_NEW_INSTANCE_initialized:                   #  a0=class
   1180     LOAD_base_offClassObject_accessFlags(a3, a0) #  a3 <- clazz->accessFlags
   1181     li        a1, ALLOC_DONT_TRACK         #  flags for alloc call
   1182     # a0=class
   1183     JAL(dvmAllocObject)                    #  v0 <- new object
   1184     GET_OPA(a3)                            #  a3 <- AA
   1185 #if defined(WITH_JIT)
   1186     /*
   1187      * The JIT needs the class to be fully resolved before it can
   1188      * include this instruction in a trace.
   1189      */
   1190     lhu       a1, offThread_subMode(rSELF)
   1191     beqz      v0, common_exceptionThrown   #  yes, handle the exception
   1192     and       a1, kSubModeJitTraceBuild    #  under construction?
   1193     bnez      a1, .LOP_NEW_INSTANCE_jitCheck
   1194 #else
   1195     # failed?
   1196     beqz      v0, common_exceptionThrown   #  yes, handle the exception
   1197 #endif
   1198     b         .LOP_NEW_INSTANCE_continue
   1199 
   1200 
   1201 /* ------------------------------ */
   1202     .balign 128
   1203 .L_OP_NEW_ARRAY: /* 0x23 */
   1204 /* File: mips/OP_NEW_ARRAY.S */
   1205     /*
   1206      * Allocate an array of objects, specified with the array class
   1207      * and a count.
   1208      *
   1209      * The verifier guarantees that this is an array class, so we don't
   1210      * check for it here.
   1211      */
   1212     /* new-array vA, vB, class@CCCC */
   1213     GET_OPB(a0)                            #  a0 <- B
   1214     FETCH(a2, 1)                           #  a2 <- CCCC
   1215     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   1216     GET_VREG(a1, a0)                       #  a1 <- vB (array length)
   1217     LOAD_base_offDvmDex_pResClasses(a3, a3) #  a3 <- pDvmDex->pResClasses
   1218     LOAD_eas2(a0, a3, a2)                  #  a0 <- resolved class
   1219     # check length
   1220     bltz      a1, common_errNegativeArraySize #  negative length, bail - len in a1
   1221     EXPORT_PC()                            #  req'd for resolve, alloc
   1222     # already resolved?
   1223     beqz      a0, .LOP_NEW_ARRAY_resolve
   1224 
   1225     /*
   1226      * Finish allocation.
   1227      *
   1228      *  a0 holds class
   1229      *  a1 holds array length
   1230      */
   1231 .LOP_NEW_ARRAY_finish:
   1232     li        a2, ALLOC_DONT_TRACK         #  don't track in local refs table
   1233     JAL(dvmAllocArrayByClass)              #  v0 <- call(clazz, length, flags)
   1234     GET_OPA4(a2)                           #  a2 <- A+
   1235     # failed?
   1236     beqz      v0, common_exceptionThrown   #  yes, handle the exception
   1237     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   1238     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1239     SET_VREG(v0, a2)                       #  vA <- v0
   1240     GOTO_OPCODE(t0)                        #  jump to next instruction
   1241 
   1242 /* ------------------------------ */
   1243     .balign 128
   1244 .L_OP_FILLED_NEW_ARRAY: /* 0x24 */
   1245 /* File: mips/OP_FILLED_NEW_ARRAY.S */
   1246     /*
   1247      * Create a new array with elements filled from registers.
   1248      *
   1249      * for: filled-new-array, filled-new-array/range
   1250      */
   1251     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   1252     # op {vCCCC..v(CCCC+AA-1)}, type       /* BBBB */
   1253     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   1254     FETCH(a1, 1)                           #  a1 <- BBBB
   1255     LOAD_base_offDvmDex_pResClasses(a3, a3) #  a3 <- pDvmDex->pResClasses
   1256     EXPORT_PC()                            #  need for resolve and alloc
   1257     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved class
   1258     GET_OPA(rOBJ)                          #  rOBJ <- AA or BA
   1259     # already resolved?
   1260     bnez      a0, .LOP_FILLED_NEW_ARRAY_continue     #  yes, continue on
   1261     LOAD_rSELF_method(a3)                  #  a3 <- self->method
   1262     li        a2, 0                        #  a2 <- false
   1263     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   1264     JAL(dvmResolveClass)                   #  v0 <- call(clazz, ref)
   1265     move      a0, v0
   1266     # got null?
   1267     beqz      v0, common_exceptionThrown   #  yes, handle exception
   1268     b         .LOP_FILLED_NEW_ARRAY_continue
   1269 
   1270 /* ------------------------------ */
   1271     .balign 128
   1272 .L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
   1273 /* File: mips/OP_FILLED_NEW_ARRAY_RANGE.S */
   1274 /* File: mips/OP_FILLED_NEW_ARRAY.S */
   1275     /*
   1276      * Create a new array with elements filled from registers.
   1277      *
   1278      * for: filled-new-array, filled-new-array/range
   1279      */
   1280     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   1281     # op {vCCCC..v(CCCC+AA-1)}, type       /* BBBB */
   1282     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   1283     FETCH(a1, 1)                           #  a1 <- BBBB
   1284     LOAD_base_offDvmDex_pResClasses(a3, a3) #  a3 <- pDvmDex->pResClasses
   1285     EXPORT_PC()                            #  need for resolve and alloc
   1286     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved class
   1287     GET_OPA(rOBJ)                          #  rOBJ <- AA or BA
   1288     # already resolved?
   1289     bnez      a0, .LOP_FILLED_NEW_ARRAY_RANGE_continue     #  yes, continue on
   1290     LOAD_rSELF_method(a3)                  #  a3 <- self->method
   1291     li        a2, 0                        #  a2 <- false
   1292     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   1293     JAL(dvmResolveClass)                   #  v0 <- call(clazz, ref)
   1294     move      a0, v0
   1295     # got null?
   1296     beqz      v0, common_exceptionThrown   #  yes, handle exception
   1297     b         .LOP_FILLED_NEW_ARRAY_RANGE_continue
   1298 
   1299 
   1300 /* ------------------------------ */
   1301     .balign 128
   1302 .L_OP_FILL_ARRAY_DATA: /* 0x26 */
   1303 /* File: mips/OP_FILL_ARRAY_DATA.S */
   1304     /* fill-array-data vAA, +BBBBBBBB */
   1305     FETCH(a0, 1)                           #  a0 <- bbbb (lo)
   1306     FETCH(a1, 2)                           #  a1 <- BBBB (hi)
   1307     GET_OPA(a3)                            #  a3 <- AA
   1308     sll       a1, a1, 16                   #  a1 <- BBBBbbbb
   1309     or        a1, a0, a1                   #  a1 <- BBBBbbbb
   1310     GET_VREG(a0, a3)                       #  a0 <- vAA (array object)
   1311     EAS1(a1, rPC, a1)                      #  a1 <- PC + BBBBbbbb*2 (array data off.)
   1312     EXPORT_PC()
   1313     JAL(dvmInterpHandleFillArrayData)      #  fill the array with predefined data
   1314     # 0 means an exception is thrown
   1315     beqz      v0, common_exceptionThrown   #  has exception
   1316     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
   1317     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1318     GOTO_OPCODE(t0)                        #  jump to next instruction
   1319 
   1320 /* ------------------------------ */
   1321     .balign 128
   1322 .L_OP_THROW: /* 0x27 */
   1323 /* File: mips/OP_THROW.S */
   1324     /*
   1325      * Throw an exception object in the current thread.
   1326      */
   1327     /* throw vAA */
   1328     GET_OPA(a2)                            #  a2 <- AA
   1329     GET_VREG(a1, a2)                       #  a1 <- vAA (exception object)
   1330     EXPORT_PC()                            #  exception handler can throw
   1331     # null object?
   1332     beqz      a1, common_errNullObject     #  yes, throw an NPE instead
   1333     # bypass dvmSetException, just store it
   1334     STORE_offThread_exception(a1, rSELF)   #  thread->exception <- obj
   1335     b         common_exceptionThrown
   1336 
   1337 
   1338 /* ------------------------------ */
   1339     .balign 128
   1340 .L_OP_GOTO: /* 0x28 */
   1341 /* File: mips/OP_GOTO.S */
   1342     /*
   1343      * Unconditional branch, 8-bit offset.
   1344      *
   1345      * The branch distance is a signed code-unit offset, which we need to
   1346      * double to get a byte offset.
   1347      */
   1348     /* goto +AA */
   1349     sll       a0, rINST, 16                #  a0 <- AAxx0000
   1350     sra       a1, a0, 24                   #  a1 <- ssssssAA (sign-extended)
   1351     addu      a2, a1, a1                   #  a2 <- byte offset
   1352     /* If backwards branch refresh rBASE */
   1353     bgez      a1, 1f
   1354     lw        rIBASE, offThread_curHandlerTable(rSELF) #  refresh handler base
   1355 1:
   1356     FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
   1357 #if defined(WITH_JIT)
   1358     lw        a0, offThread_pJitProfTable(rSELF)
   1359     bltz      a1, common_testUpdateProfile #  (a0) check for trace hotness
   1360 #endif
   1361     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1362     GOTO_OPCODE(t0)                        #  jump to next instruction
   1363 
   1364 /* ------------------------------ */
   1365     .balign 128
   1366 .L_OP_GOTO_16: /* 0x29 */
   1367 /* File: mips/OP_GOTO_16.S */
   1368     /*
   1369      * Unconditional branch, 16-bit offset.
   1370      *
   1371      * The branch distance is a signed code-unit offset, which we need to
   1372      * double to get a byte offset.
   1373      */
   1374     /* goto/16 +AAAA */
   1375     FETCH_S(a0, 1)                         #  a0 <- ssssAAAA (sign-extended)
   1376     addu      a1, a0, a0                   #  a1 <- byte offset, flags set
   1377     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   1378     bgez      a1, 1f
   1379     lw        rIBASE, offThread_curHandlerTable(rSELF) #  refresh handler base
   1380 1:
   1381 #if defined(WITH_JIT)
   1382     lw        a0, offThread_pJitProfTable(rSELF)
   1383     bltz      a1, common_testUpdateProfile #  (a0) hot trace head?
   1384 #endif
   1385     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1386     GOTO_OPCODE(t0)                        #  jump to next instruction
   1387 
   1388 /* ------------------------------ */
   1389     .balign 128
   1390 .L_OP_GOTO_32: /* 0x2a */
   1391 /* File: mips/OP_GOTO_32.S */
   1392     /*
   1393      * Unconditional branch, 32-bit offset.
   1394      *
   1395      * The branch distance is a signed code-unit offset, which we need to
   1396      * double to get a byte offset.
   1397      *
   1398      * Unlike most opcodes, this one is allowed to branch to itself, so
   1399      * our "backward branch" test must be "<=0" instead of "<0".
   1400      */
   1401     /* goto/32 +AAAAAAAA */
   1402     FETCH(a0, 1)                           #  a0 <- aaaa (lo)
   1403     FETCH(a1, 2)                           #  a1 <- AAAA (hi)
   1404     sll       a1, a1, 16
   1405     or        a0, a0, a1                   #  a0 <- AAAAaaaa
   1406     addu      a1, a0, a0                   #  a1 <- byte offset
   1407 #if defined(WITH_JIT)
   1408     lw        a0, offThread_pJitProfTable(rSELF)
   1409     bgtz      a1, 1f
   1410     lw        rIBASE, offThread_curHandlerTable(rSELF) #  refresh handler base
   1411 1:
   1412     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   1413     blez      a1, common_testUpdateProfile # (a0) hot trace head?
   1414 #else
   1415     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   1416     bgtz      a0, 2f
   1417     lw        rIBASE, offThread_curHandlerTable(rSELF) #  refresh handler base
   1418 2:
   1419 #endif
   1420     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1421     GOTO_OPCODE(t0)                        #  jump to next instruction
   1422 
   1423 /* ------------------------------ */
   1424     .balign 128
   1425 .L_OP_PACKED_SWITCH: /* 0x2b */
   1426 /* File: mips/OP_PACKED_SWITCH.S */
   1427     /*
   1428      * Handle a packed-switch or sparse-switch instruction.  In both cases
   1429      * we decode it and hand it off to a helper function.
   1430      *
   1431      * We don't really expect backward branches in a switch statement, but
   1432      * they're perfectly legal, so we check for them here.
   1433      *
   1434      * When the JIT is present, all targets are considered treated as
   1435      * a potential trace heads regardless of branch direction.
   1436      *
   1437      * for: packed-switch, sparse-switch
   1438      */
   1439     /* op vAA, +BBBB */
   1440     FETCH(a0, 1)                           #  a0 <- bbbb (lo)
   1441     FETCH(a1, 2)                           #  a1 <- BBBB (hi)
   1442     GET_OPA(a3)                            #  a3 <- AA
   1443     sll       t0, a1, 16
   1444     or        a0, a0, t0                   #  a0 <- BBBBbbbb
   1445     GET_VREG(a1, a3)                       #  a1 <- vAA
   1446     EAS1(a0, rPC, a0)                      #  a0 <- PC + BBBBbbbb*2
   1447     JAL(dvmInterpHandlePackedSwitch)                             #  a0 <- code-unit branch offset
   1448     addu      a1, v0, v0                   #  a1 <- byte offset
   1449     bgtz      a1, 1f
   1450     lw        rIBASE, offThread_curHandlerTable(rSELF) #  refresh handler base
   1451 1:
   1452     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   1453 #if defined(WITH_JIT)
   1454     lw        a0, offThread_pJitProfTable(rSELF)
   1455     bnez      a0, common_updateProfile
   1456 #endif
   1457     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1458     GOTO_OPCODE(t0)                        #  jump to next instruction
   1459 
   1460 /* ------------------------------ */
   1461     .balign 128
   1462 .L_OP_SPARSE_SWITCH: /* 0x2c */
   1463 /* File: mips/OP_SPARSE_SWITCH.S */
   1464 /* File: mips/OP_PACKED_SWITCH.S */
   1465     /*
   1466      * Handle a packed-switch or sparse-switch instruction.  In both cases
   1467      * we decode it and hand it off to a helper function.
   1468      *
   1469      * We don't really expect backward branches in a switch statement, but
   1470      * they're perfectly legal, so we check for them here.
   1471      *
   1472      * When the JIT is present, all targets are considered treated as
   1473      * a potential trace heads regardless of branch direction.
   1474      *
   1475      * for: packed-switch, sparse-switch
   1476      */
   1477     /* op vAA, +BBBB */
   1478     FETCH(a0, 1)                           #  a0 <- bbbb (lo)
   1479     FETCH(a1, 2)                           #  a1 <- BBBB (hi)
   1480     GET_OPA(a3)                            #  a3 <- AA
   1481     sll       t0, a1, 16
   1482     or        a0, a0, t0                   #  a0 <- BBBBbbbb
   1483     GET_VREG(a1, a3)                       #  a1 <- vAA
   1484     EAS1(a0, rPC, a0)                      #  a0 <- PC + BBBBbbbb*2
   1485     JAL(dvmInterpHandleSparseSwitch)                             #  a0 <- code-unit branch offset
   1486     addu      a1, v0, v0                   #  a1 <- byte offset
   1487     bgtz      a1, 1f
   1488     lw        rIBASE, offThread_curHandlerTable(rSELF) #  refresh handler base
   1489 1:
   1490     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   1491 #if defined(WITH_JIT)
   1492     lw        a0, offThread_pJitProfTable(rSELF)
   1493     bnez      a0, common_updateProfile
   1494 #endif
   1495     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1496     GOTO_OPCODE(t0)                        #  jump to next instruction
   1497 
   1498 
   1499 /* ------------------------------ */
   1500     .balign 128
   1501 .L_OP_CMPL_FLOAT: /* 0x2d */
   1502 /* File: mips/OP_CMPL_FLOAT.S */
   1503     /*
   1504      * Compare two floating-point values.  Puts 0, 1, or -1 into the
   1505      * destination register based on the results of the comparison.
   1506      *
   1507      * Provide a "naninst" instruction that puts 1 or -1 into a1 depending
   1508      * on what value we'd like to return when one of the operands is NaN.
   1509      *
   1510      * The operation we're implementing is:
   1511      *   if (x == y)
   1512      *     return 0;
   1513      *   else if (x < y)
   1514      *     return -1;
   1515      *   else if (x > y)
   1516      *     return 1;
   1517      *   else
   1518      *     return {-1,1};  // one or both operands was NaN
   1519      *
   1520      * for: cmpl-float, cmpg-float
   1521      */
   1522     /* op vAA, vBB, vCC */
   1523 
   1524     /* "clasic" form */
   1525     FETCH(a0, 1)                           #  a0 <- CCBB
   1526     and       a2, a0, 255                  #  a2 <- BB
   1527     srl       a3, a0, 8
   1528 #ifdef SOFT_FLOAT
   1529     GET_VREG(rOBJ, a2)                     #  rOBJ <- vBB
   1530     GET_VREG(rBIX, a3)                     #  rBIX <- vCC
   1531     move      a0, rOBJ                     #  a0 <- vBB
   1532     move      a1, rBIX                     #  a1 <- vCC
   1533     JAL(__eqsf2)                           #  a0 <- (vBB == vCC)
   1534     li        rTEMP, 0                     # set rTEMP to 0
   1535     beqz      v0, OP_CMPL_FLOAT_finish
   1536     move      a0, rOBJ                     #  a0 <- vBB
   1537     move      a1, rBIX                     #  a1 <- vCC
   1538     JAL(__ltsf2)                           #  a0 <- (vBB < vCC)
   1539     li        rTEMP, -1
   1540     bltz      v0, OP_CMPL_FLOAT_finish
   1541     move      a0, rOBJ                     #  a0 <- vBB
   1542     move      a1, rBIX                     #  a1 <- vCC
   1543     b         OP_CMPL_FLOAT_continue
   1544 #else
   1545     GET_VREG_F(ft0, a2)
   1546     GET_VREG_F(ft1, a3)
   1547     c.olt.s   fcc0, ft0, ft1               # Is ft0 < ft1
   1548     li        rTEMP, -1
   1549     bc1t      fcc0, OP_CMPL_FLOAT_finish
   1550     c.olt.s   fcc0, ft1, ft0
   1551     li        rTEMP, 1
   1552     bc1t      fcc0, OP_CMPL_FLOAT_finish
   1553     c.eq.s    fcc0, ft0, ft1
   1554     li        rTEMP, 0
   1555     bc1t      fcc0, OP_CMPL_FLOAT_finish
   1556     b         OP_CMPL_FLOAT_nan
   1557 
   1558 #endif
   1559 
   1560 
   1561 /* ------------------------------ */
   1562     .balign 128
   1563 .L_OP_CMPG_FLOAT: /* 0x2e */
   1564 /* File: mips/OP_CMPG_FLOAT.S */
   1565 /* File: mips/OP_CMPL_FLOAT.S */
   1566     /*
   1567      * Compare two floating-point values.  Puts 0, 1, or -1 into the
   1568      * destination register based on the results of the comparison.
   1569      *
   1570      * Provide a "naninst" instruction that puts 1 or -1 into a1 depending
   1571      * on what value we'd like to return when one of the operands is NaN.
   1572      *
   1573      * The operation we're implementing is:
   1574      *   if (x == y)
   1575      *     return 0;
   1576      *   else if (x < y)
   1577      *     return -1;
   1578      *   else if (x > y)
   1579      *     return 1;
   1580      *   else
   1581      *     return {-1,1};  // one or both operands was NaN
   1582      *
   1583      * for: cmpl-float, cmpg-float
   1584      */
   1585     /* op vAA, vBB, vCC */
   1586 
   1587     /* "clasic" form */
   1588     FETCH(a0, 1)                           #  a0 <- CCBB
   1589     and       a2, a0, 255                  #  a2 <- BB
   1590     srl       a3, a0, 8
   1591 #ifdef SOFT_FLOAT
   1592     GET_VREG(rOBJ, a2)                     #  rOBJ <- vBB
   1593     GET_VREG(rBIX, a3)                     #  rBIX <- vCC
   1594     move      a0, rOBJ                     #  a0 <- vBB
   1595     move      a1, rBIX                     #  a1 <- vCC
   1596     JAL(__eqsf2)                           #  a0 <- (vBB == vCC)
   1597     li        rTEMP, 0                     # set rTEMP to 0
   1598     beqz      v0, OP_CMPG_FLOAT_finish
   1599     move      a0, rOBJ                     #  a0 <- vBB
   1600     move      a1, rBIX                     #  a1 <- vCC
   1601     JAL(__ltsf2)                           #  a0 <- (vBB < vCC)
   1602     li        rTEMP, -1
   1603     bltz      v0, OP_CMPG_FLOAT_finish
   1604     move      a0, rOBJ                     #  a0 <- vBB
   1605     move      a1, rBIX                     #  a1 <- vCC
   1606     b         OP_CMPG_FLOAT_continue
   1607 #else
   1608     GET_VREG_F(ft0, a2)
   1609     GET_VREG_F(ft1, a3)
   1610     c.olt.s   fcc0, ft0, ft1               # Is ft0 < ft1
   1611     li        rTEMP, -1
   1612     bc1t      fcc0, OP_CMPG_FLOAT_finish
   1613     c.olt.s   fcc0, ft1, ft0
   1614     li        rTEMP, 1
   1615     bc1t      fcc0, OP_CMPG_FLOAT_finish
   1616     c.eq.s    fcc0, ft0, ft1
   1617     li        rTEMP, 0
   1618     bc1t      fcc0, OP_CMPG_FLOAT_finish
   1619     b         OP_CMPG_FLOAT_nan
   1620 
   1621 #endif
   1622 
   1623 
   1624 
   1625 /* ------------------------------ */
   1626     .balign 128
   1627 .L_OP_CMPL_DOUBLE: /* 0x2f */
   1628 /* File: mips/OP_CMPL_DOUBLE.S */
   1629     /*
   1630      * Compare two floating-point values.  Puts 0, 1, or -1 into the
   1631      * destination register based on the results of the comparison.
   1632      *
   1633      * Provide a "naninst" instruction that puts 1 or -1 into a1 depending
   1634      * on what value we'd like to return when one of the operands is NaN.
   1635      *
   1636      * See OP_CMPL_FLOAT for an explanation.
   1637      *
   1638      * For: cmpl-double, cmpg-double
   1639      */
   1640     /* op vAA, vBB, vCC */
   1641 
   1642     FETCH(a0, 1)                           #  a0 <- CCBB
   1643     and       rOBJ, a0, 255                #  s0 <- BB
   1644     srl       rBIX, a0, 8                  #  t0 <- CC
   1645     EAS2(rOBJ, rFP, rOBJ)                  #  s0 <- &fp[BB]
   1646     EAS2(rBIX, rFP, rBIX)                  #  t0 <- &fp[CC]
   1647 #ifdef SOFT_FLOAT
   1648     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vBB/vBB+1
   1649     LOAD64(rARG2, rARG3, rBIX)             #  a2/a3 <- vCC/vCC+1
   1650     JAL(__eqdf2)                           #  cmp <=: C clear if <, Z set if eq
   1651     li        rTEMP, 0
   1652     beqz      v0, OP_CMPL_DOUBLE_finish
   1653 
   1654     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vBB/vBB+1
   1655     LOAD64(rARG2, rARG3, rBIX)             #  a2/a3 <- vCC/vCC+1
   1656     JAL(__ltdf2)
   1657     li        rTEMP, -1
   1658     bltz      v0, OP_CMPL_DOUBLE_finish
   1659     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vBB/vBB+1
   1660     b         OP_CMPL_DOUBLE_continue
   1661 #else
   1662     LOAD64_F(ft0, ft0f, rOBJ)
   1663     LOAD64_F(ft1, ft1f, rBIX)
   1664     c.olt.d   fcc0, ft0, ft1
   1665     li        rTEMP, -1
   1666     bc1t      fcc0, OP_CMPL_DOUBLE_finish
   1667     c.olt.d   fcc0, ft1, ft0
   1668     li        rTEMP, 1
   1669     bc1t      fcc0, OP_CMPL_DOUBLE_finish
   1670     c.eq.d    fcc0, ft0, ft1
   1671     li        rTEMP, 0
   1672     bc1t      fcc0, OP_CMPL_DOUBLE_finish
   1673     b         OP_CMPL_DOUBLE_nan
   1674 #endif
   1675 
   1676 /* ------------------------------ */
   1677     .balign 128
   1678 .L_OP_CMPG_DOUBLE: /* 0x30 */
   1679 /* File: mips/OP_CMPG_DOUBLE.S */
   1680 /* File: mips/OP_CMPL_DOUBLE.S */
   1681     /*
   1682      * Compare two floating-point values.  Puts 0, 1, or -1 into the
   1683      * destination register based on the results of the comparison.
   1684      *
   1685      * Provide a "naninst" instruction that puts 1 or -1 into a1 depending
   1686      * on what value we'd like to return when one of the operands is NaN.
   1687      *
   1688      * See OP_CMPL_FLOAT for an explanation.
   1689      *
   1690      * For: cmpl-double, cmpg-double
   1691      */
   1692     /* op vAA, vBB, vCC */
   1693 
   1694     FETCH(a0, 1)                           #  a0 <- CCBB
   1695     and       rOBJ, a0, 255                #  s0 <- BB
   1696     srl       rBIX, a0, 8                  #  t0 <- CC
   1697     EAS2(rOBJ, rFP, rOBJ)                  #  s0 <- &fp[BB]
   1698     EAS2(rBIX, rFP, rBIX)                  #  t0 <- &fp[CC]
   1699 #ifdef SOFT_FLOAT
   1700     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vBB/vBB+1
   1701     LOAD64(rARG2, rARG3, rBIX)             #  a2/a3 <- vCC/vCC+1
   1702     JAL(__eqdf2)                           #  cmp <=: C clear if <, Z set if eq
   1703     li        rTEMP, 0
   1704     beqz      v0, OP_CMPG_DOUBLE_finish
   1705 
   1706     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vBB/vBB+1
   1707     LOAD64(rARG2, rARG3, rBIX)             #  a2/a3 <- vCC/vCC+1
   1708     JAL(__ltdf2)
   1709     li        rTEMP, -1
   1710     bltz      v0, OP_CMPG_DOUBLE_finish
   1711     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vBB/vBB+1
   1712     b         OP_CMPG_DOUBLE_continue
   1713 #else
   1714     LOAD64_F(ft0, ft0f, rOBJ)
   1715     LOAD64_F(ft1, ft1f, rBIX)
   1716     c.olt.d   fcc0, ft0, ft1
   1717     li        rTEMP, -1
   1718     bc1t      fcc0, OP_CMPG_DOUBLE_finish
   1719     c.olt.d   fcc0, ft1, ft0
   1720     li        rTEMP, 1
   1721     bc1t      fcc0, OP_CMPG_DOUBLE_finish
   1722     c.eq.d    fcc0, ft0, ft1
   1723     li        rTEMP, 0
   1724     bc1t      fcc0, OP_CMPG_DOUBLE_finish
   1725     b         OP_CMPG_DOUBLE_nan
   1726 #endif
   1727 
   1728 
   1729 /* ------------------------------ */
   1730     .balign 128
   1731 .L_OP_CMP_LONG: /* 0x31 */
   1732 /* File: mips/OP_CMP_LONG.S */
   1733     /*
   1734      * Compare two 64-bit values
   1735      *    x = y     return  0
   1736      *    x < y     return -1
   1737      *    x > y     return  1
   1738      *
   1739      * I think I can improve on the ARM code by the following observation
   1740      *    slt   t0,  x.hi, y.hi;	# (x.hi < y.hi) ? 1:0
   1741      *    sgt   t1,  x.hi, y.hi;	# (y.hi > x.hi) ? 1:0
   1742      *    subu  v0, t0, t1              # v0= -1:1:0 for [ < > = ]
   1743      */
   1744     /* cmp-long vAA, vBB, vCC */
   1745     FETCH(a0, 1)                           #  a0 <- CCBB
   1746     GET_OPA(rOBJ)                          #  rOBJ <- AA
   1747     and       a2, a0, 255                  #  a2 <- BB
   1748     srl       a3, a0, 8                    #  a3 <- CC
   1749     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   1750     EAS2(a3, rFP, a3)                      #  a3 <- &fp[CC]
   1751     LOAD64(a0, a1, a2)                     #  a0/a1 <- vBB/vBB+1
   1752     LOAD64(a2, a3, a3)                     #  a2/a3 <- vCC/vCC+1
   1753 
   1754     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   1755     slt       t0, a1, a3                   #  compare hi
   1756     sgt       t1, a1, a3
   1757     subu      v0, t1, t0                   #  v0 <- (-1, 1, 0)
   1758     bnez      v0, .LOP_CMP_LONG_finish
   1759     # at this point x.hi==y.hi
   1760     sltu      t0, a0, a2                   #  compare lo
   1761     sgtu      t1, a0, a2
   1762     subu      v0, t1, t0                   #  v0 <- (-1, 1, 0) for [< > =]
   1763 
   1764 .LOP_CMP_LONG_finish:
   1765     SET_VREG(v0, rOBJ)                     #  vAA <- v0
   1766     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1767     GOTO_OPCODE(t0)                        #  jump to next instruction
   1768 
   1769 
   1770 /* ------------------------------ */
   1771     .balign 128
   1772 .L_OP_IF_EQ: /* 0x32 */
   1773 /* File: mips/OP_IF_EQ.S */
   1774 /* File: mips/bincmp.S */
   1775     /*
   1776      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
   1777      * fragment that specifies the *reverse* comparison to perform, e.g.
   1778      * for "if-le" you would use "gt".
   1779      *
   1780      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1781      */
   1782     /* if-cmp vA, vB, +CCCC */
   1783     GET_OPA4(a0)                           #  a0 <- A+
   1784     GET_OPB(a1)                            #  a1 <- B
   1785     GET_VREG(a3, a1)                       #  a3 <- vB
   1786     GET_VREG(a2, a0)                       #  a2 <- vA
   1787     bne a2, a3, 1f                  #  branch to 1 if comparison failed
   1788     FETCH_S(a1, 1)                         #  a1<- branch offset, in code units
   1789     b 2f
   1790 1:
   1791     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   1792 2:
   1793     addu      a2, a1, a1                   #  convert to bytes
   1794     FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
   1795 #if defined(WITH_JIT)
   1796     lw        a0, offThread_pJitProfTable(rSELF)
   1797     bgez      a2, 3f
   1798     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1799 3:
   1800     bnez      a0, common_updateProfile
   1801 #else
   1802     bgez      a2, 4f
   1803     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1804 4:
   1805 #endif
   1806     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1807     GOTO_OPCODE(t0)                        #  jump to next instruction
   1808 
   1809 
   1810 /* ------------------------------ */
   1811     .balign 128
   1812 .L_OP_IF_NE: /* 0x33 */
   1813 /* File: mips/OP_IF_NE.S */
   1814 /* File: mips/bincmp.S */
   1815     /*
   1816      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
   1817      * fragment that specifies the *reverse* comparison to perform, e.g.
   1818      * for "if-le" you would use "gt".
   1819      *
   1820      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1821      */
   1822     /* if-cmp vA, vB, +CCCC */
   1823     GET_OPA4(a0)                           #  a0 <- A+
   1824     GET_OPB(a1)                            #  a1 <- B
   1825     GET_VREG(a3, a1)                       #  a3 <- vB
   1826     GET_VREG(a2, a0)                       #  a2 <- vA
   1827     beq a2, a3, 1f                  #  branch to 1 if comparison failed
   1828     FETCH_S(a1, 1)                         #  a1<- branch offset, in code units
   1829     b 2f
   1830 1:
   1831     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   1832 2:
   1833     addu      a2, a1, a1                   #  convert to bytes
   1834     FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
   1835 #if defined(WITH_JIT)
   1836     lw        a0, offThread_pJitProfTable(rSELF)
   1837     bgez      a2, 3f
   1838     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1839 3:
   1840     bnez      a0, common_updateProfile
   1841 #else
   1842     bgez      a2, 4f
   1843     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1844 4:
   1845 #endif
   1846     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1847     GOTO_OPCODE(t0)                        #  jump to next instruction
   1848 
   1849 
   1850 /* ------------------------------ */
   1851     .balign 128
   1852 .L_OP_IF_LT: /* 0x34 */
   1853 /* File: mips/OP_IF_LT.S */
   1854 /* File: mips/bincmp.S */
   1855     /*
   1856      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
   1857      * fragment that specifies the *reverse* comparison to perform, e.g.
   1858      * for "if-le" you would use "gt".
   1859      *
   1860      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1861      */
   1862     /* if-cmp vA, vB, +CCCC */
   1863     GET_OPA4(a0)                           #  a0 <- A+
   1864     GET_OPB(a1)                            #  a1 <- B
   1865     GET_VREG(a3, a1)                       #  a3 <- vB
   1866     GET_VREG(a2, a0)                       #  a2 <- vA
   1867     bge a2, a3, 1f                  #  branch to 1 if comparison failed
   1868     FETCH_S(a1, 1)                         #  a1<- branch offset, in code units
   1869     b 2f
   1870 1:
   1871     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   1872 2:
   1873     addu      a2, a1, a1                   #  convert to bytes
   1874     FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
   1875 #if defined(WITH_JIT)
   1876     lw        a0, offThread_pJitProfTable(rSELF)
   1877     bgez      a2, 3f
   1878     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1879 3:
   1880     bnez      a0, common_updateProfile
   1881 #else
   1882     bgez      a2, 4f
   1883     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1884 4:
   1885 #endif
   1886     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1887     GOTO_OPCODE(t0)                        #  jump to next instruction
   1888 
   1889 
   1890 /* ------------------------------ */
   1891     .balign 128
   1892 .L_OP_IF_GE: /* 0x35 */
   1893 /* File: mips/OP_IF_GE.S */
   1894 /* File: mips/bincmp.S */
   1895     /*
   1896      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
   1897      * fragment that specifies the *reverse* comparison to perform, e.g.
   1898      * for "if-le" you would use "gt".
   1899      *
   1900      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1901      */
   1902     /* if-cmp vA, vB, +CCCC */
   1903     GET_OPA4(a0)                           #  a0 <- A+
   1904     GET_OPB(a1)                            #  a1 <- B
   1905     GET_VREG(a3, a1)                       #  a3 <- vB
   1906     GET_VREG(a2, a0)                       #  a2 <- vA
   1907     blt a2, a3, 1f                  #  branch to 1 if comparison failed
   1908     FETCH_S(a1, 1)                         #  a1<- branch offset, in code units
   1909     b 2f
   1910 1:
   1911     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   1912 2:
   1913     addu      a2, a1, a1                   #  convert to bytes
   1914     FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
   1915 #if defined(WITH_JIT)
   1916     lw        a0, offThread_pJitProfTable(rSELF)
   1917     bgez      a2, 3f
   1918     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1919 3:
   1920     bnez      a0, common_updateProfile
   1921 #else
   1922     bgez      a2, 4f
   1923     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1924 4:
   1925 #endif
   1926     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1927     GOTO_OPCODE(t0)                        #  jump to next instruction
   1928 
   1929 
   1930 /* ------------------------------ */
   1931     .balign 128
   1932 .L_OP_IF_GT: /* 0x36 */
   1933 /* File: mips/OP_IF_GT.S */
   1934 /* File: mips/bincmp.S */
   1935     /*
   1936      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
   1937      * fragment that specifies the *reverse* comparison to perform, e.g.
   1938      * for "if-le" you would use "gt".
   1939      *
   1940      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1941      */
   1942     /* if-cmp vA, vB, +CCCC */
   1943     GET_OPA4(a0)                           #  a0 <- A+
   1944     GET_OPB(a1)                            #  a1 <- B
   1945     GET_VREG(a3, a1)                       #  a3 <- vB
   1946     GET_VREG(a2, a0)                       #  a2 <- vA
   1947     ble a2, a3, 1f                  #  branch to 1 if comparison failed
   1948     FETCH_S(a1, 1)                         #  a1<- branch offset, in code units
   1949     b 2f
   1950 1:
   1951     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   1952 2:
   1953     addu      a2, a1, a1                   #  convert to bytes
   1954     FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
   1955 #if defined(WITH_JIT)
   1956     lw        a0, offThread_pJitProfTable(rSELF)
   1957     bgez      a2, 3f
   1958     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1959 3:
   1960     bnez      a0, common_updateProfile
   1961 #else
   1962     bgez      a2, 4f
   1963     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1964 4:
   1965 #endif
   1966     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   1967     GOTO_OPCODE(t0)                        #  jump to next instruction
   1968 
   1969 
   1970 /* ------------------------------ */
   1971     .balign 128
   1972 .L_OP_IF_LE: /* 0x37 */
   1973 /* File: mips/OP_IF_LE.S */
   1974 /* File: mips/bincmp.S */
   1975     /*
   1976      * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
   1977      * fragment that specifies the *reverse* comparison to perform, e.g.
   1978      * for "if-le" you would use "gt".
   1979      *
   1980      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
   1981      */
   1982     /* if-cmp vA, vB, +CCCC */
   1983     GET_OPA4(a0)                           #  a0 <- A+
   1984     GET_OPB(a1)                            #  a1 <- B
   1985     GET_VREG(a3, a1)                       #  a3 <- vB
   1986     GET_VREG(a2, a0)                       #  a2 <- vA
   1987     bgt a2, a3, 1f                  #  branch to 1 if comparison failed
   1988     FETCH_S(a1, 1)                         #  a1<- branch offset, in code units
   1989     b 2f
   1990 1:
   1991     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   1992 2:
   1993     addu      a2, a1, a1                   #  convert to bytes
   1994     FETCH_ADVANCE_INST_RB(a2)              #  update rPC, load rINST
   1995 #if defined(WITH_JIT)
   1996     lw        a0, offThread_pJitProfTable(rSELF)
   1997     bgez      a2, 3f
   1998     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   1999 3:
   2000     bnez      a0, common_updateProfile
   2001 #else
   2002     bgez      a2, 4f
   2003     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rIBASE
   2004 4:
   2005 #endif
   2006     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2007     GOTO_OPCODE(t0)                        #  jump to next instruction
   2008 
   2009 
   2010 /* ------------------------------ */
   2011     .balign 128
   2012 .L_OP_IF_EQZ: /* 0x38 */
   2013 /* File: mips/OP_IF_EQZ.S */
   2014 /* File: mips/zcmp.S */
   2015     /*
   2016      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
   2017      * fragment that specifies the *reverse* comparison to perform, e.g.
   2018      * for "if-le" you would use "gt".
   2019      *
   2020      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   2021      */
   2022     /* if-cmp vAA, +BBBB */
   2023     GET_OPA(a0)                            #  a0 <- AA
   2024     GET_VREG(a2, a0)                       #  a2 <- vAA
   2025     FETCH_S(a1, 1)                         #  a1 <- branch offset, in code units
   2026     bne a2, zero, 1f                #  branch to 1 if comparison failed
   2027     b 2f
   2028 1:
   2029     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   2030 2:
   2031     addu      a1, a1, a1                   #  convert to bytes
   2032     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   2033 #if defined(WITH_JIT)
   2034     lw        a0, offThread_pJitProfTable(rSELF)
   2035     bgez      a1, 3f
   2036     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh table base
   2037 3:
   2038     bnez      a0, common_updateProfile     #  test for JIT off at target
   2039 #else
   2040     bgez      a1, 4f
   2041     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rtable base
   2042 4:
   2043 #endif
   2044     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2045     GOTO_OPCODE(t0)                        #  jump to next instruction
   2046 
   2047 
   2048 /* ------------------------------ */
   2049     .balign 128
   2050 .L_OP_IF_NEZ: /* 0x39 */
   2051 /* File: mips/OP_IF_NEZ.S */
   2052 /* File: mips/zcmp.S */
   2053     /*
   2054      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
   2055      * fragment that specifies the *reverse* comparison to perform, e.g.
   2056      * for "if-le" you would use "gt".
   2057      *
   2058      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   2059      */
   2060     /* if-cmp vAA, +BBBB */
   2061     GET_OPA(a0)                            #  a0 <- AA
   2062     GET_VREG(a2, a0)                       #  a2 <- vAA
   2063     FETCH_S(a1, 1)                         #  a1 <- branch offset, in code units
   2064     beq a2, zero, 1f                #  branch to 1 if comparison failed
   2065     b 2f
   2066 1:
   2067     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   2068 2:
   2069     addu      a1, a1, a1                   #  convert to bytes
   2070     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   2071 #if defined(WITH_JIT)
   2072     lw        a0, offThread_pJitProfTable(rSELF)
   2073     bgez      a1, 3f
   2074     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh table base
   2075 3:
   2076     bnez      a0, common_updateProfile     #  test for JIT off at target
   2077 #else
   2078     bgez      a1, 4f
   2079     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rtable base
   2080 4:
   2081 #endif
   2082     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2083     GOTO_OPCODE(t0)                        #  jump to next instruction
   2084 
   2085 
   2086 /* ------------------------------ */
   2087     .balign 128
   2088 .L_OP_IF_LTZ: /* 0x3a */
   2089 /* File: mips/OP_IF_LTZ.S */
   2090 /* File: mips/zcmp.S */
   2091     /*
   2092      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
   2093      * fragment that specifies the *reverse* comparison to perform, e.g.
   2094      * for "if-le" you would use "gt".
   2095      *
   2096      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   2097      */
   2098     /* if-cmp vAA, +BBBB */
   2099     GET_OPA(a0)                            #  a0 <- AA
   2100     GET_VREG(a2, a0)                       #  a2 <- vAA
   2101     FETCH_S(a1, 1)                         #  a1 <- branch offset, in code units
   2102     bge a2, zero, 1f                #  branch to 1 if comparison failed
   2103     b 2f
   2104 1:
   2105     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   2106 2:
   2107     addu      a1, a1, a1                   #  convert to bytes
   2108     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   2109 #if defined(WITH_JIT)
   2110     lw        a0, offThread_pJitProfTable(rSELF)
   2111     bgez      a1, 3f
   2112     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh table base
   2113 3:
   2114     bnez      a0, common_updateProfile     #  test for JIT off at target
   2115 #else
   2116     bgez      a1, 4f
   2117     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rtable base
   2118 4:
   2119 #endif
   2120     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2121     GOTO_OPCODE(t0)                        #  jump to next instruction
   2122 
   2123 
   2124 /* ------------------------------ */
   2125     .balign 128
   2126 .L_OP_IF_GEZ: /* 0x3b */
   2127 /* File: mips/OP_IF_GEZ.S */
   2128 /* File: mips/zcmp.S */
   2129     /*
   2130      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
   2131      * fragment that specifies the *reverse* comparison to perform, e.g.
   2132      * for "if-le" you would use "gt".
   2133      *
   2134      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   2135      */
   2136     /* if-cmp vAA, +BBBB */
   2137     GET_OPA(a0)                            #  a0 <- AA
   2138     GET_VREG(a2, a0)                       #  a2 <- vAA
   2139     FETCH_S(a1, 1)                         #  a1 <- branch offset, in code units
   2140     blt a2, zero, 1f                #  branch to 1 if comparison failed
   2141     b 2f
   2142 1:
   2143     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   2144 2:
   2145     addu      a1, a1, a1                   #  convert to bytes
   2146     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   2147 #if defined(WITH_JIT)
   2148     lw        a0, offThread_pJitProfTable(rSELF)
   2149     bgez      a1, 3f
   2150     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh table base
   2151 3:
   2152     bnez      a0, common_updateProfile     #  test for JIT off at target
   2153 #else
   2154     bgez      a1, 4f
   2155     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rtable base
   2156 4:
   2157 #endif
   2158     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2159     GOTO_OPCODE(t0)                        #  jump to next instruction
   2160 
   2161 
   2162 /* ------------------------------ */
   2163     .balign 128
   2164 .L_OP_IF_GTZ: /* 0x3c */
   2165 /* File: mips/OP_IF_GTZ.S */
   2166 /* File: mips/zcmp.S */
   2167     /*
   2168      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
   2169      * fragment that specifies the *reverse* comparison to perform, e.g.
   2170      * for "if-le" you would use "gt".
   2171      *
   2172      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   2173      */
   2174     /* if-cmp vAA, +BBBB */
   2175     GET_OPA(a0)                            #  a0 <- AA
   2176     GET_VREG(a2, a0)                       #  a2 <- vAA
   2177     FETCH_S(a1, 1)                         #  a1 <- branch offset, in code units
   2178     ble a2, zero, 1f                #  branch to 1 if comparison failed
   2179     b 2f
   2180 1:
   2181     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   2182 2:
   2183     addu      a1, a1, a1                   #  convert to bytes
   2184     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   2185 #if defined(WITH_JIT)
   2186     lw        a0, offThread_pJitProfTable(rSELF)
   2187     bgez      a1, 3f
   2188     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh table base
   2189 3:
   2190     bnez      a0, common_updateProfile     #  test for JIT off at target
   2191 #else
   2192     bgez      a1, 4f
   2193     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rtable base
   2194 4:
   2195 #endif
   2196     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2197     GOTO_OPCODE(t0)                        #  jump to next instruction
   2198 
   2199 
   2200 /* ------------------------------ */
   2201     .balign 128
   2202 .L_OP_IF_LEZ: /* 0x3d */
   2203 /* File: mips/OP_IF_LEZ.S */
   2204 /* File: mips/zcmp.S */
   2205     /*
   2206      * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
   2207      * fragment that specifies the *reverse* comparison to perform, e.g.
   2208      * for "if-le" you would use "gt".
   2209      *
   2210      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
   2211      */
   2212     /* if-cmp vAA, +BBBB */
   2213     GET_OPA(a0)                            #  a0 <- AA
   2214     GET_VREG(a2, a0)                       #  a2 <- vAA
   2215     FETCH_S(a1, 1)                         #  a1 <- branch offset, in code units
   2216     bgt a2, zero, 1f                #  branch to 1 if comparison failed
   2217     b 2f
   2218 1:
   2219     li        a1, 2                        #  a1- BYTE branch dist for not-taken
   2220 2:
   2221     addu      a1, a1, a1                   #  convert to bytes
   2222     FETCH_ADVANCE_INST_RB(a1)              #  update rPC, load rINST
   2223 #if defined(WITH_JIT)
   2224     lw        a0, offThread_pJitProfTable(rSELF)
   2225     bgez      a1, 3f
   2226     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh table base
   2227 3:
   2228     bnez      a0, common_updateProfile     #  test for JIT off at target
   2229 #else
   2230     bgez      a1, 4f
   2231     lw        rIBASE, offThread_curHandlerTable(rSELF)  # refresh rtable base
   2232 4:
   2233 #endif
   2234     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2235     GOTO_OPCODE(t0)                        #  jump to next instruction
   2236 
   2237 
   2238 /* ------------------------------ */
   2239     .balign 128
   2240 .L_OP_UNUSED_3E: /* 0x3e */
   2241 /* File: mips/OP_UNUSED_3E.S */
   2242 /* File: mips/unused.S */
   2243     BAL(common_abort)
   2244 
   2245 
   2246 
   2247 /* ------------------------------ */
   2248     .balign 128
   2249 .L_OP_UNUSED_3F: /* 0x3f */
   2250 /* File: mips/OP_UNUSED_3F.S */
   2251 /* File: mips/unused.S */
   2252     BAL(common_abort)
   2253 
   2254 
   2255 
   2256 /* ------------------------------ */
   2257     .balign 128
   2258 .L_OP_UNUSED_40: /* 0x40 */
   2259 /* File: mips/OP_UNUSED_40.S */
   2260 /* File: mips/unused.S */
   2261     BAL(common_abort)
   2262 
   2263 
   2264 
   2265 /* ------------------------------ */
   2266     .balign 128
   2267 .L_OP_UNUSED_41: /* 0x41 */
   2268 /* File: mips/OP_UNUSED_41.S */
   2269 /* File: mips/unused.S */
   2270     BAL(common_abort)
   2271 
   2272 
   2273 
   2274 /* ------------------------------ */
   2275     .balign 128
   2276 .L_OP_UNUSED_42: /* 0x42 */
   2277 /* File: mips/OP_UNUSED_42.S */
   2278 /* File: mips/unused.S */
   2279     BAL(common_abort)
   2280 
   2281 
   2282 
   2283 /* ------------------------------ */
   2284     .balign 128
   2285 .L_OP_UNUSED_43: /* 0x43 */
   2286 /* File: mips/OP_UNUSED_43.S */
   2287 /* File: mips/unused.S */
   2288     BAL(common_abort)
   2289 
   2290 
   2291 
   2292 /* ------------------------------ */
   2293     .balign 128
   2294 .L_OP_AGET: /* 0x44 */
   2295 /* File: mips/OP_AGET.S */
   2296     /*
   2297      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   2298      *
   2299      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2300      * instructions.  We use a pair of FETCH_Bs instead.
   2301      *
   2302      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
   2303      */
   2304     /* op vAA, vBB, vCC */
   2305     FETCH_B(a2, 1)                         #  a2 <- BB
   2306     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2307     FETCH_C(a3, 1)                         #  a3 <- CC
   2308     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2309     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2310     # null array object?
   2311     beqz      a0, common_errNullObject     #  yes, bail
   2312     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2313     .if 2
   2314     EASN(a0, a0, a1, 2)               #  a0 <- arrayObj + index*width
   2315     .else
   2316     addu      a0, a0, a1
   2317     .endif
   2318     # a1 >= a3; compare unsigned index
   2319     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2320     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2321     lw a2, offArrayObject_contents(a0)  #  a2 <- vBB[vCC]
   2322     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2323     SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
   2324 
   2325 
   2326 /* ------------------------------ */
   2327     .balign 128
   2328 .L_OP_AGET_WIDE: /* 0x45 */
   2329 /* File: mips/OP_AGET_WIDE.S */
   2330     /*
   2331      * Array get, 64 bits.  vAA <- vBB[vCC].
   2332      *
   2333      * Arrays of long/double are 64-bit aligned.
   2334      */
   2335     /* aget-wide vAA, vBB, vCC */
   2336     FETCH(a0, 1)                           #  a0 <- CCBB
   2337     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2338     and       a2, a0, 255                  #  a2 <- BB
   2339     srl       a3, a0, 8                    #  a3 <- CC
   2340     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2341     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2342     # null array object?
   2343     beqz      a0, common_errNullObject     #  yes, bail
   2344     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2345     EAS3(a0, a0, a1)                       #  a0 <- arrayObj + index*width
   2346     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2347 
   2348 .LOP_AGET_WIDE_finish:
   2349     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2350     LOAD64_off(a2, a3, a0, offArrayObject_contents)
   2351     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[AA]
   2352     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2353     STORE64(a2, a3, rOBJ)                  #  vAA/vAA+1 <- a2/a3
   2354     GOTO_OPCODE(t0)                        #  jump to next instruction
   2355 
   2356 
   2357 /* ------------------------------ */
   2358     .balign 128
   2359 .L_OP_AGET_OBJECT: /* 0x46 */
   2360 /* File: mips/OP_AGET_OBJECT.S */
   2361 /* File: mips/OP_AGET.S */
   2362     /*
   2363      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   2364      *
   2365      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2366      * instructions.  We use a pair of FETCH_Bs instead.
   2367      *
   2368      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
   2369      */
   2370     /* op vAA, vBB, vCC */
   2371     FETCH_B(a2, 1)                         #  a2 <- BB
   2372     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2373     FETCH_C(a3, 1)                         #  a3 <- CC
   2374     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2375     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2376     # null array object?
   2377     beqz      a0, common_errNullObject     #  yes, bail
   2378     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2379     .if 2
   2380     EASN(a0, a0, a1, 2)               #  a0 <- arrayObj + index*width
   2381     .else
   2382     addu      a0, a0, a1
   2383     .endif
   2384     # a1 >= a3; compare unsigned index
   2385     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2386     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2387     lw a2, offArrayObject_contents(a0)  #  a2 <- vBB[vCC]
   2388     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2389     SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
   2390 
   2391 
   2392 
   2393 /* ------------------------------ */
   2394     .balign 128
   2395 .L_OP_AGET_BOOLEAN: /* 0x47 */
   2396 /* File: mips/OP_AGET_BOOLEAN.S */
   2397 /* File: mips/OP_AGET.S */
   2398     /*
   2399      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   2400      *
   2401      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2402      * instructions.  We use a pair of FETCH_Bs instead.
   2403      *
   2404      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
   2405      */
   2406     /* op vAA, vBB, vCC */
   2407     FETCH_B(a2, 1)                         #  a2 <- BB
   2408     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2409     FETCH_C(a3, 1)                         #  a3 <- CC
   2410     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2411     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2412     # null array object?
   2413     beqz      a0, common_errNullObject     #  yes, bail
   2414     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2415     .if 0
   2416     EASN(a0, a0, a1, 0)               #  a0 <- arrayObj + index*width
   2417     .else
   2418     addu      a0, a0, a1
   2419     .endif
   2420     # a1 >= a3; compare unsigned index
   2421     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2422     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2423     lbu a2, offArrayObject_contents(a0)  #  a2 <- vBB[vCC]
   2424     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2425     SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
   2426 
   2427 
   2428 
   2429 /* ------------------------------ */
   2430     .balign 128
   2431 .L_OP_AGET_BYTE: /* 0x48 */
   2432 /* File: mips/OP_AGET_BYTE.S */
   2433 /* File: mips/OP_AGET.S */
   2434     /*
   2435      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   2436      *
   2437      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2438      * instructions.  We use a pair of FETCH_Bs instead.
   2439      *
   2440      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
   2441      */
   2442     /* op vAA, vBB, vCC */
   2443     FETCH_B(a2, 1)                         #  a2 <- BB
   2444     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2445     FETCH_C(a3, 1)                         #  a3 <- CC
   2446     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2447     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2448     # null array object?
   2449     beqz      a0, common_errNullObject     #  yes, bail
   2450     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2451     .if 0
   2452     EASN(a0, a0, a1, 0)               #  a0 <- arrayObj + index*width
   2453     .else
   2454     addu      a0, a0, a1
   2455     .endif
   2456     # a1 >= a3; compare unsigned index
   2457     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2458     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2459     lb a2, offArrayObject_contents(a0)  #  a2 <- vBB[vCC]
   2460     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2461     SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
   2462 
   2463 
   2464 
   2465 /* ------------------------------ */
   2466     .balign 128
   2467 .L_OP_AGET_CHAR: /* 0x49 */
   2468 /* File: mips/OP_AGET_CHAR.S */
   2469 /* File: mips/OP_AGET.S */
   2470     /*
   2471      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   2472      *
   2473      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2474      * instructions.  We use a pair of FETCH_Bs instead.
   2475      *
   2476      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
   2477      */
   2478     /* op vAA, vBB, vCC */
   2479     FETCH_B(a2, 1)                         #  a2 <- BB
   2480     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2481     FETCH_C(a3, 1)                         #  a3 <- CC
   2482     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2483     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2484     # null array object?
   2485     beqz      a0, common_errNullObject     #  yes, bail
   2486     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2487     .if 1
   2488     EASN(a0, a0, a1, 1)               #  a0 <- arrayObj + index*width
   2489     .else
   2490     addu      a0, a0, a1
   2491     .endif
   2492     # a1 >= a3; compare unsigned index
   2493     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2494     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2495     lhu a2, offArrayObject_contents(a0)  #  a2 <- vBB[vCC]
   2496     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2497     SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
   2498 
   2499 
   2500 
   2501 /* ------------------------------ */
   2502     .balign 128
   2503 .L_OP_AGET_SHORT: /* 0x4a */
   2504 /* File: mips/OP_AGET_SHORT.S */
   2505 /* File: mips/OP_AGET.S */
   2506     /*
   2507      * Array get, 32 bits or less.  vAA <- vBB[vCC].
   2508      *
   2509      * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
   2510      * instructions.  We use a pair of FETCH_Bs instead.
   2511      *
   2512      * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
   2513      */
   2514     /* op vAA, vBB, vCC */
   2515     FETCH_B(a2, 1)                         #  a2 <- BB
   2516     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2517     FETCH_C(a3, 1)                         #  a3 <- CC
   2518     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2519     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2520     # null array object?
   2521     beqz      a0, common_errNullObject     #  yes, bail
   2522     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2523     .if 1
   2524     EASN(a0, a0, a1, 1)               #  a0 <- arrayObj + index*width
   2525     .else
   2526     addu      a0, a0, a1
   2527     .endif
   2528     # a1 >= a3; compare unsigned index
   2529     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2530     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2531     lh a2, offArrayObject_contents(a0)  #  a2 <- vBB[vCC]
   2532     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2533     SET_VREG_GOTO(a2, rOBJ, t0)            #  vAA <- a2
   2534 
   2535 
   2536 
   2537 /* ------------------------------ */
   2538     .balign 128
   2539 .L_OP_APUT: /* 0x4b */
   2540 /* File: mips/OP_APUT.S */
   2541     /*
   2542      * Array put, 32 bits or less.  vBB[vCC] <- vAA.
   2543      * for: aput, aput-boolean, aput-byte, aput-char, aput-short
   2544      */
   2545     /* op vAA, vBB, vCC */
   2546     FETCH_B(a2, 1)                         #  a2 <- BB
   2547     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2548     FETCH_C(a3, 1)                         #  a3 <- CC
   2549     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2550     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2551     # null array object?
   2552     beqz      a0, common_errNullObject     #  yes, bail
   2553     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2554     .if 2
   2555     EASN(a0, a0, a1, 2)               #  a0 <- arrayObj + index*width
   2556     .else
   2557     addu      a0, a0, a1
   2558     .endif
   2559     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2560     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2561     GET_VREG(a2, rOBJ)                     #  a2 <- vAA
   2562     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2563     sw a2, offArrayObject_contents(a0) #  vBB[vCC] <- a2
   2564     GOTO_OPCODE(t0)                        #  jump to next instruction
   2565 
   2566 
   2567 /* ------------------------------ */
   2568     .balign 128
   2569 .L_OP_APUT_WIDE: /* 0x4c */
   2570 /* File: mips/OP_APUT_WIDE.S */
   2571     /*
   2572      * Array put, 64 bits.  vBB[vCC] <- vAA.
   2573      *
   2574      * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
   2575      */
   2576     /* aput-wide vAA, vBB, vCC */
   2577     FETCH(a0, 1)                           #  a0 <- CCBB
   2578     GET_OPA(t0)                            #  t0 <- AA
   2579     and       a2, a0, 255                  #  a2 <- BB
   2580     srl       a3, a0, 8                    #  a3 <- CC
   2581     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2582     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2583     # null array object?
   2584     beqz      a0, common_errNullObject     #  yes, bail
   2585     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2586     EAS3(a0, a0, a1)                       #  a0 <- arrayObj + index*width
   2587     EAS2(rOBJ, rFP, t0)                    #  rOBJ <- &fp[AA]
   2588     # compare unsigned index, length
   2589     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2590 
   2591     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2592     LOAD64(a2, a3, rOBJ)                   #  a2/a3 <- vAA/vAA+1
   2593     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2594     STORE64_off(a2, a3, a0, offArrayObject_contents) #  a2/a3 <- vBB[vCC]
   2595     GOTO_OPCODE(t0)                        #  jump to next instruction
   2596 
   2597 
   2598 /* ------------------------------ */
   2599     .balign 128
   2600 .L_OP_APUT_OBJECT: /* 0x4d */
   2601 /* File: mips/OP_APUT_OBJECT.S */
   2602     /*
   2603      * Store an object into an array.  vBB[vCC] <- vAA.
   2604      *
   2605      */
   2606     /* op vAA, vBB, vCC */
   2607     FETCH(a0, 1)                           #  a0 <- CCBB
   2608     GET_OPA(t1)                            #  t1 <- AA
   2609     and       a2, a0, 255                  #  a2 <- BB
   2610     srl       a3, a0, 8                    #  a3 <- CC
   2611     GET_VREG(rINST, a2)                    #  rINST <- vBB (array object)
   2612     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2613     GET_VREG(rBIX, t1)                     #  rBIX <- vAA
   2614     # null array object?
   2615     beqz      rINST, common_errNullObject  #  yes, bail
   2616 
   2617     LOAD_base_offArrayObject_length(a3, rINST) #  a3 <- arrayObj->length
   2618     EAS2(rOBJ, rINST, a1)                  #  rOBJ <- arrayObj + index*width
   2619     # compare unsigned index, length
   2620     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2621     /*
   2622      * On entry:
   2623      *  rINST = vBB (arrayObj)
   2624      *  rBIX = vAA (obj)
   2625      *  rOBJ = offset into array (vBB + vCC * width)
   2626      */
   2627     bnez      rBIX, .LOP_APUT_OBJECT_checks     #  yes, skip type checks
   2628 .LOP_APUT_OBJECT_finish:
   2629     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2630     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2631     sw        rBIX, offArrayObject_contents(rOBJ) #  vBB[vCC] <- vAA
   2632     GOTO_OPCODE(t0)                        #  jump to next instruction
   2633 
   2634 
   2635 /* ------------------------------ */
   2636     .balign 128
   2637 .L_OP_APUT_BOOLEAN: /* 0x4e */
   2638 /* File: mips/OP_APUT_BOOLEAN.S */
   2639 /* File: mips/OP_APUT.S */
   2640     /*
   2641      * Array put, 32 bits or less.  vBB[vCC] <- vAA.
   2642      * for: aput, aput-boolean, aput-byte, aput-char, aput-short
   2643      */
   2644     /* op vAA, vBB, vCC */
   2645     FETCH_B(a2, 1)                         #  a2 <- BB
   2646     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2647     FETCH_C(a3, 1)                         #  a3 <- CC
   2648     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2649     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2650     # null array object?
   2651     beqz      a0, common_errNullObject     #  yes, bail
   2652     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2653     .if 0
   2654     EASN(a0, a0, a1, 0)               #  a0 <- arrayObj + index*width
   2655     .else
   2656     addu      a0, a0, a1
   2657     .endif
   2658     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2659     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2660     GET_VREG(a2, rOBJ)                     #  a2 <- vAA
   2661     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2662     sb a2, offArrayObject_contents(a0) #  vBB[vCC] <- a2
   2663     GOTO_OPCODE(t0)                        #  jump to next instruction
   2664 
   2665 
   2666 
   2667 /* ------------------------------ */
   2668     .balign 128
   2669 .L_OP_APUT_BYTE: /* 0x4f */
   2670 /* File: mips/OP_APUT_BYTE.S */
   2671 /* File: mips/OP_APUT.S */
   2672     /*
   2673      * Array put, 32 bits or less.  vBB[vCC] <- vAA.
   2674      * for: aput, aput-boolean, aput-byte, aput-char, aput-short
   2675      */
   2676     /* op vAA, vBB, vCC */
   2677     FETCH_B(a2, 1)                         #  a2 <- BB
   2678     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2679     FETCH_C(a3, 1)                         #  a3 <- CC
   2680     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2681     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2682     # null array object?
   2683     beqz      a0, common_errNullObject     #  yes, bail
   2684     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2685     .if 0
   2686     EASN(a0, a0, a1, 0)               #  a0 <- arrayObj + index*width
   2687     .else
   2688     addu      a0, a0, a1
   2689     .endif
   2690     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2691     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2692     GET_VREG(a2, rOBJ)                     #  a2 <- vAA
   2693     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2694     sb a2, offArrayObject_contents(a0) #  vBB[vCC] <- a2
   2695     GOTO_OPCODE(t0)                        #  jump to next instruction
   2696 
   2697 
   2698 
   2699 /* ------------------------------ */
   2700     .balign 128
   2701 .L_OP_APUT_CHAR: /* 0x50 */
   2702 /* File: mips/OP_APUT_CHAR.S */
   2703 /* File: mips/OP_APUT.S */
   2704     /*
   2705      * Array put, 32 bits or less.  vBB[vCC] <- vAA.
   2706      * for: aput, aput-boolean, aput-byte, aput-char, aput-short
   2707      */
   2708     /* op vAA, vBB, vCC */
   2709     FETCH_B(a2, 1)                         #  a2 <- BB
   2710     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2711     FETCH_C(a3, 1)                         #  a3 <- CC
   2712     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2713     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2714     # null array object?
   2715     beqz      a0, common_errNullObject     #  yes, bail
   2716     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2717     .if 1
   2718     EASN(a0, a0, a1, 1)               #  a0 <- arrayObj + index*width
   2719     .else
   2720     addu      a0, a0, a1
   2721     .endif
   2722     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2723     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2724     GET_VREG(a2, rOBJ)                     #  a2 <- vAA
   2725     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2726     sh a2, offArrayObject_contents(a0) #  vBB[vCC] <- a2
   2727     GOTO_OPCODE(t0)                        #  jump to next instruction
   2728 
   2729 
   2730 
   2731 /* ------------------------------ */
   2732     .balign 128
   2733 .L_OP_APUT_SHORT: /* 0x51 */
   2734 /* File: mips/OP_APUT_SHORT.S */
   2735 /* File: mips/OP_APUT.S */
   2736     /*
   2737      * Array put, 32 bits or less.  vBB[vCC] <- vAA.
   2738      * for: aput, aput-boolean, aput-byte, aput-char, aput-short
   2739      */
   2740     /* op vAA, vBB, vCC */
   2741     FETCH_B(a2, 1)                         #  a2 <- BB
   2742     GET_OPA(rOBJ)                          #  rOBJ <- AA
   2743     FETCH_C(a3, 1)                         #  a3 <- CC
   2744     GET_VREG(a0, a2)                       #  a0 <- vBB (array object)
   2745     GET_VREG(a1, a3)                       #  a1 <- vCC (requested index)
   2746     # null array object?
   2747     beqz      a0, common_errNullObject     #  yes, bail
   2748     LOAD_base_offArrayObject_length(a3, a0) #  a3 <- arrayObj->length
   2749     .if 1
   2750     EASN(a0, a0, a1, 1)               #  a0 <- arrayObj + index*width
   2751     .else
   2752     addu      a0, a0, a1
   2753     .endif
   2754     bgeu      a1, a3, common_errArrayIndex #  index >= length, bail
   2755     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   2756     GET_VREG(a2, rOBJ)                     #  a2 <- vAA
   2757     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   2758     sh a2, offArrayObject_contents(a0) #  vBB[vCC] <- a2
   2759     GOTO_OPCODE(t0)                        #  jump to next instruction
   2760 
   2761 
   2762 
   2763 /* ------------------------------ */
   2764     .balign 128
   2765 .L_OP_IGET: /* 0x52 */
   2766 /* File: mips/OP_IGET.S */
   2767     /*
   2768      * General 32-bit instance field get.
   2769      *
   2770      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2771      */
   2772     # op vA, vB, field                     /* CCCC */
   2773     GET_OPB(a0)                            #  a0 <- B
   2774     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   2775     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   2776     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   2777     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   2778     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   2779     # is resolved entry null?
   2780     bnez      a0, .LOP_IGET_finish       #  no, already resolved
   2781     LOAD_rSELF_method(a2)                  #  a2 <- current method
   2782     EXPORT_PC()                            #  resolve() could throw
   2783     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   2784     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   2785     # test results
   2786     move      a0, v0
   2787     bnez      v0, .LOP_IGET_finish
   2788     b         common_exceptionThrown
   2789 
   2790 /* ------------------------------ */
   2791     .balign 128
   2792 .L_OP_IGET_WIDE: /* 0x53 */
   2793 /* File: mips/OP_IGET_WIDE.S */
   2794     /*
   2795      * Wide 32-bit instance field get.
   2796      */
   2797     # iget-wide vA, vB, field              /* CCCC */
   2798     GET_OPB(a0)                            #  a0 <- B
   2799     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   2800     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   2801     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pResFields
   2802     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   2803     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   2804     # is resolved entry null?
   2805     bnez      a0, .LOP_IGET_WIDE_finish       #  no, already resolved
   2806     LOAD_rSELF_method(a2)                  #  a2 <- current method
   2807     EXPORT_PC()                            #  resolve() could throw
   2808     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   2809     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   2810     # test return code
   2811     move      a0, v0
   2812     bnez      v0, .LOP_IGET_WIDE_finish
   2813     b         common_exceptionThrown
   2814 
   2815 /* ------------------------------ */
   2816     .balign 128
   2817 .L_OP_IGET_OBJECT: /* 0x54 */
   2818 /* File: mips/OP_IGET_OBJECT.S */
   2819 /* File: mips/OP_IGET.S */
   2820     /*
   2821      * General 32-bit instance field get.
   2822      *
   2823      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2824      */
   2825     # op vA, vB, field                     /* CCCC */
   2826     GET_OPB(a0)                            #  a0 <- B
   2827     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   2828     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   2829     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   2830     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   2831     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   2832     # is resolved entry null?
   2833     bnez      a0, .LOP_IGET_OBJECT_finish       #  no, already resolved
   2834     LOAD_rSELF_method(a2)                  #  a2 <- current method
   2835     EXPORT_PC()                            #  resolve() could throw
   2836     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   2837     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   2838     # test results
   2839     move      a0, v0
   2840     bnez      v0, .LOP_IGET_OBJECT_finish
   2841     b         common_exceptionThrown
   2842 
   2843 
   2844 /* ------------------------------ */
   2845     .balign 128
   2846 .L_OP_IGET_BOOLEAN: /* 0x55 */
   2847 /* File: mips/OP_IGET_BOOLEAN.S */
   2848 /* File: mips/OP_IGET.S */
   2849     /*
   2850      * General 32-bit instance field get.
   2851      *
   2852      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2853      */
   2854     # op vA, vB, field                     /* CCCC */
   2855     GET_OPB(a0)                            #  a0 <- B
   2856     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   2857     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   2858     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   2859     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   2860     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   2861     # is resolved entry null?
   2862     bnez      a0, .LOP_IGET_BOOLEAN_finish       #  no, already resolved
   2863     LOAD_rSELF_method(a2)                  #  a2 <- current method
   2864     EXPORT_PC()                            #  resolve() could throw
   2865     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   2866     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   2867     # test results
   2868     move      a0, v0
   2869     bnez      v0, .LOP_IGET_BOOLEAN_finish
   2870     b         common_exceptionThrown
   2871 
   2872 
   2873 /* ------------------------------ */
   2874     .balign 128
   2875 .L_OP_IGET_BYTE: /* 0x56 */
   2876 /* File: mips/OP_IGET_BYTE.S */
   2877 /* File: mips/OP_IGET.S */
   2878     /*
   2879      * General 32-bit instance field get.
   2880      *
   2881      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2882      */
   2883     # op vA, vB, field                     /* CCCC */
   2884     GET_OPB(a0)                            #  a0 <- B
   2885     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   2886     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   2887     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   2888     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   2889     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   2890     # is resolved entry null?
   2891     bnez      a0, .LOP_IGET_BYTE_finish       #  no, already resolved
   2892     LOAD_rSELF_method(a2)                  #  a2 <- current method
   2893     EXPORT_PC()                            #  resolve() could throw
   2894     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   2895     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   2896     # test results
   2897     move      a0, v0
   2898     bnez      v0, .LOP_IGET_BYTE_finish
   2899     b         common_exceptionThrown
   2900 
   2901 
   2902 /* ------------------------------ */
   2903     .balign 128
   2904 .L_OP_IGET_CHAR: /* 0x57 */
   2905 /* File: mips/OP_IGET_CHAR.S */
   2906 /* File: mips/OP_IGET.S */
   2907     /*
   2908      * General 32-bit instance field get.
   2909      *
   2910      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2911      */
   2912     # op vA, vB, field                     /* CCCC */
   2913     GET_OPB(a0)                            #  a0 <- B
   2914     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   2915     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   2916     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   2917     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   2918     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   2919     # is resolved entry null?
   2920     bnez      a0, .LOP_IGET_CHAR_finish       #  no, already resolved
   2921     LOAD_rSELF_method(a2)                  #  a2 <- current method
   2922     EXPORT_PC()                            #  resolve() could throw
   2923     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   2924     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   2925     # test results
   2926     move      a0, v0
   2927     bnez      v0, .LOP_IGET_CHAR_finish
   2928     b         common_exceptionThrown
   2929 
   2930 
   2931 /* ------------------------------ */
   2932     .balign 128
   2933 .L_OP_IGET_SHORT: /* 0x58 */
   2934 /* File: mips/OP_IGET_SHORT.S */
   2935 /* File: mips/OP_IGET.S */
   2936     /*
   2937      * General 32-bit instance field get.
   2938      *
   2939      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   2940      */
   2941     # op vA, vB, field                     /* CCCC */
   2942     GET_OPB(a0)                            #  a0 <- B
   2943     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   2944     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   2945     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   2946     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   2947     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   2948     # is resolved entry null?
   2949     bnez      a0, .LOP_IGET_SHORT_finish       #  no, already resolved
   2950     LOAD_rSELF_method(a2)                  #  a2 <- current method
   2951     EXPORT_PC()                            #  resolve() could throw
   2952     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   2953     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   2954     # test results
   2955     move      a0, v0
   2956     bnez      v0, .LOP_IGET_SHORT_finish
   2957     b         common_exceptionThrown
   2958 
   2959 
   2960 /* ------------------------------ */
   2961     .balign 128
   2962 .L_OP_IPUT: /* 0x59 */
   2963 /* File: mips/OP_IPUT.S */
   2964     /*
   2965      * General 32-bit instance field put.
   2966      *
   2967      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   2968      */
   2969     # op vA, vB, field                     /* CCCC */
   2970     GET_OPB(a0)                            #  a0 <- B
   2971     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   2972     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   2973     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   2974     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   2975     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   2976     # is resolved entry null?
   2977     bnez      a0, .LOP_IPUT_finish       #  no, already resolved
   2978     LOAD_rSELF_method(a2)                  #  a2 <- current method
   2979     EXPORT_PC()                            #  resolve() could throw
   2980     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   2981     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   2982     # success?
   2983     move      a0, v0
   2984     bnez      v0, .LOP_IPUT_finish       #  yes, finish up
   2985     b         common_exceptionThrown
   2986 
   2987 /* ------------------------------ */
   2988     .balign 128
   2989 .L_OP_IPUT_WIDE: /* 0x5a */
   2990 /* File: mips/OP_IPUT_WIDE.S */
   2991     # iput-wide vA, vB, field              /* CCCC */
   2992     GET_OPB(a0)                            #  a0 <- B
   2993     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   2994     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   2995     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pResFields
   2996     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   2997     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   2998     # is resolved entry null?
   2999     bnez      a0, .LOP_IPUT_WIDE_finish       #  no, already resolved
   3000     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3001     EXPORT_PC()                            #  resolve() could throw
   3002     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3003     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   3004     # success?
   3005     move      a0, v0
   3006     bnez      v0, .LOP_IPUT_WIDE_finish       #  yes, finish up
   3007     b         common_exceptionThrown
   3008 
   3009 /* ------------------------------ */
   3010     .balign 128
   3011 .L_OP_IPUT_OBJECT: /* 0x5b */
   3012 /* File: mips/OP_IPUT_OBJECT.S */
   3013     /*
   3014      * 32-bit instance field put.
   3015      *
   3016      * for: iput-object, iput-object-volatile
   3017      */
   3018     # op vA, vB, field                     /* CCCC */
   3019     GET_OPB(a0)                            #  a0 <- B
   3020     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   3021     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   3022     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   3023     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   3024     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   3025     # is resolved entry null?
   3026     bnez      a0, .LOP_IPUT_OBJECT_finish       #  no, already resolved
   3027     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3028     EXPORT_PC()                            #  resolve() could throw
   3029     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3030     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   3031     # success?
   3032     move      a0, v0
   3033     bnez      v0, .LOP_IPUT_OBJECT_finish       #  yes, finish up
   3034     b         common_exceptionThrown
   3035 
   3036 /* ------------------------------ */
   3037     .balign 128
   3038 .L_OP_IPUT_BOOLEAN: /* 0x5c */
   3039 /* File: mips/OP_IPUT_BOOLEAN.S */
   3040 /* File: mips/OP_IPUT.S */
   3041     /*
   3042      * General 32-bit instance field put.
   3043      *
   3044      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   3045      */
   3046     # op vA, vB, field                     /* CCCC */
   3047     GET_OPB(a0)                            #  a0 <- B
   3048     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   3049     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   3050     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   3051     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   3052     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   3053     # is resolved entry null?
   3054     bnez      a0, .LOP_IPUT_BOOLEAN_finish       #  no, already resolved
   3055     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3056     EXPORT_PC()                            #  resolve() could throw
   3057     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3058     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   3059     # success?
   3060     move      a0, v0
   3061     bnez      v0, .LOP_IPUT_BOOLEAN_finish       #  yes, finish up
   3062     b         common_exceptionThrown
   3063 
   3064 
   3065 /* ------------------------------ */
   3066     .balign 128
   3067 .L_OP_IPUT_BYTE: /* 0x5d */
   3068 /* File: mips/OP_IPUT_BYTE.S */
   3069 /* File: mips/OP_IPUT.S */
   3070     /*
   3071      * General 32-bit instance field put.
   3072      *
   3073      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   3074      */
   3075     # op vA, vB, field                     /* CCCC */
   3076     GET_OPB(a0)                            #  a0 <- B
   3077     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   3078     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   3079     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   3080     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   3081     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   3082     # is resolved entry null?
   3083     bnez      a0, .LOP_IPUT_BYTE_finish       #  no, already resolved
   3084     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3085     EXPORT_PC()                            #  resolve() could throw
   3086     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3087     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   3088     # success?
   3089     move      a0, v0
   3090     bnez      v0, .LOP_IPUT_BYTE_finish       #  yes, finish up
   3091     b         common_exceptionThrown
   3092 
   3093 
   3094 /* ------------------------------ */
   3095     .balign 128
   3096 .L_OP_IPUT_CHAR: /* 0x5e */
   3097 /* File: mips/OP_IPUT_CHAR.S */
   3098 /* File: mips/OP_IPUT.S */
   3099     /*
   3100      * General 32-bit instance field put.
   3101      *
   3102      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   3103      */
   3104     # op vA, vB, field                     /* CCCC */
   3105     GET_OPB(a0)                            #  a0 <- B
   3106     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   3107     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   3108     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   3109     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   3110     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   3111     # is resolved entry null?
   3112     bnez      a0, .LOP_IPUT_CHAR_finish       #  no, already resolved
   3113     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3114     EXPORT_PC()                            #  resolve() could throw
   3115     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3116     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   3117     # success?
   3118     move      a0, v0
   3119     bnez      v0, .LOP_IPUT_CHAR_finish       #  yes, finish up
   3120     b         common_exceptionThrown
   3121 
   3122 
   3123 /* ------------------------------ */
   3124     .balign 128
   3125 .L_OP_IPUT_SHORT: /* 0x5f */
   3126 /* File: mips/OP_IPUT_SHORT.S */
   3127 /* File: mips/OP_IPUT.S */
   3128     /*
   3129      * General 32-bit instance field put.
   3130      *
   3131      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   3132      */
   3133     # op vA, vB, field                     /* CCCC */
   3134     GET_OPB(a0)                            #  a0 <- B
   3135     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   3136     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   3137     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   3138     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   3139     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   3140     # is resolved entry null?
   3141     bnez      a0, .LOP_IPUT_SHORT_finish       #  no, already resolved
   3142     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3143     EXPORT_PC()                            #  resolve() could throw
   3144     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3145     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   3146     # success?
   3147     move      a0, v0
   3148     bnez      v0, .LOP_IPUT_SHORT_finish       #  yes, finish up
   3149     b         common_exceptionThrown
   3150 
   3151 
   3152 /* ------------------------------ */
   3153     .balign 128
   3154 .L_OP_SGET: /* 0x60 */
   3155 /* File: mips/OP_SGET.S */
   3156     /*
   3157      * General 32-bit SGET handler.
   3158      *
   3159      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   3160      */
   3161     # op vAA, field                        /* BBBB */
   3162     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3163     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3164     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3165     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3166     # is resolved entry !null?
   3167     bnez      a0, .LOP_SGET_finish
   3168 
   3169     /*
   3170      * Continuation if the field has not yet been resolved.
   3171      *  a1:  BBBB field ref
   3172      *  rBIX: dvmDex->pResFields
   3173      */
   3174     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3175 #if defined(WITH_JIT)
   3176     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3177 #endif
   3178     EXPORT_PC()                            #  resolve() could throw, so export now
   3179     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3180     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3181     move      a0, v0
   3182     # success?
   3183     beqz      v0, common_exceptionThrown   #  no, handle exception
   3184 #if defined(WITH_JIT)
   3185     /*
   3186      * If the JIT is actively building a trace we need to make sure
   3187      * that the field is fully resolved before including this instruction.
   3188      */
   3189     JAL(common_verifyField)
   3190 #endif
   3191     b        .LOP_SGET_finish            # resume
   3192 
   3193 /* ------------------------------ */
   3194     .balign 128
   3195 .L_OP_SGET_WIDE: /* 0x61 */
   3196 /* File: mips/OP_SGET_WIDE.S */
   3197     /*
   3198      * 64-bit SGET handler.
   3199      */
   3200     # sget-wide vAA, field                 /* BBBB */
   3201     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3202     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3203     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3204     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3205     # is resolved entry null?
   3206     bnez      a0, .LOP_SGET_WIDE_finish
   3207 
   3208     /*
   3209      * Continuation if the field has not yet been resolved.
   3210      *  a1:  BBBB field ref
   3211      *  rBIX: dvmDex->pResFields
   3212      *
   3213      * Returns StaticField pointer in v0.
   3214      */
   3215     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3216 #if defined(WITH_JIT)
   3217     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3218 #endif
   3219     EXPORT_PC()                            #  resolve() could throw, so export now
   3220     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3221     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3222     move      a0, v0
   3223     # success?
   3224     beqz      v0, common_exceptionThrown   #  no, handle exception
   3225 #if defined(WITH_JIT)
   3226     /*
   3227      * If the JIT is actively building a trace we need to make sure
   3228      * that the field is fully resolved before including this instruction.
   3229      */
   3230     JAL(common_verifyField)
   3231 #endif
   3232 
   3233     b        .LOP_SGET_WIDE_finish            # resume
   3234 
   3235 /* ------------------------------ */
   3236     .balign 128
   3237 .L_OP_SGET_OBJECT: /* 0x62 */
   3238 /* File: mips/OP_SGET_OBJECT.S */
   3239 /* File: mips/OP_SGET.S */
   3240     /*
   3241      * General 32-bit SGET handler.
   3242      *
   3243      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   3244      */
   3245     # op vAA, field                        /* BBBB */
   3246     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3247     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3248     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3249     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3250     # is resolved entry !null?
   3251     bnez      a0, .LOP_SGET_OBJECT_finish
   3252 
   3253     /*
   3254      * Continuation if the field has not yet been resolved.
   3255      *  a1:  BBBB field ref
   3256      *  rBIX: dvmDex->pResFields
   3257      */
   3258     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3259 #if defined(WITH_JIT)
   3260     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3261 #endif
   3262     EXPORT_PC()                            #  resolve() could throw, so export now
   3263     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3264     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3265     move      a0, v0
   3266     # success?
   3267     beqz      v0, common_exceptionThrown   #  no, handle exception
   3268 #if defined(WITH_JIT)
   3269     /*
   3270      * If the JIT is actively building a trace we need to make sure
   3271      * that the field is fully resolved before including this instruction.
   3272      */
   3273     JAL(common_verifyField)
   3274 #endif
   3275     b        .LOP_SGET_OBJECT_finish            # resume
   3276 
   3277 
   3278 /* ------------------------------ */
   3279     .balign 128
   3280 .L_OP_SGET_BOOLEAN: /* 0x63 */
   3281 /* File: mips/OP_SGET_BOOLEAN.S */
   3282 /* File: mips/OP_SGET.S */
   3283     /*
   3284      * General 32-bit SGET handler.
   3285      *
   3286      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   3287      */
   3288     # op vAA, field                        /* BBBB */
   3289     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3290     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3291     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3292     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3293     # is resolved entry !null?
   3294     bnez      a0, .LOP_SGET_BOOLEAN_finish
   3295 
   3296     /*
   3297      * Continuation if the field has not yet been resolved.
   3298      *  a1:  BBBB field ref
   3299      *  rBIX: dvmDex->pResFields
   3300      */
   3301     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3302 #if defined(WITH_JIT)
   3303     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3304 #endif
   3305     EXPORT_PC()                            #  resolve() could throw, so export now
   3306     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3307     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3308     move      a0, v0
   3309     # success?
   3310     beqz      v0, common_exceptionThrown   #  no, handle exception
   3311 #if defined(WITH_JIT)
   3312     /*
   3313      * If the JIT is actively building a trace we need to make sure
   3314      * that the field is fully resolved before including this instruction.
   3315      */
   3316     JAL(common_verifyField)
   3317 #endif
   3318     b        .LOP_SGET_BOOLEAN_finish            # resume
   3319 
   3320 
   3321 /* ------------------------------ */
   3322     .balign 128
   3323 .L_OP_SGET_BYTE: /* 0x64 */
   3324 /* File: mips/OP_SGET_BYTE.S */
   3325 /* File: mips/OP_SGET.S */
   3326     /*
   3327      * General 32-bit SGET handler.
   3328      *
   3329      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   3330      */
   3331     # op vAA, field                        /* BBBB */
   3332     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3333     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3334     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3335     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3336     # is resolved entry !null?
   3337     bnez      a0, .LOP_SGET_BYTE_finish
   3338 
   3339     /*
   3340      * Continuation if the field has not yet been resolved.
   3341      *  a1:  BBBB field ref
   3342      *  rBIX: dvmDex->pResFields
   3343      */
   3344     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3345 #if defined(WITH_JIT)
   3346     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3347 #endif
   3348     EXPORT_PC()                            #  resolve() could throw, so export now
   3349     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3350     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3351     move      a0, v0
   3352     # success?
   3353     beqz      v0, common_exceptionThrown   #  no, handle exception
   3354 #if defined(WITH_JIT)
   3355     /*
   3356      * If the JIT is actively building a trace we need to make sure
   3357      * that the field is fully resolved before including this instruction.
   3358      */
   3359     JAL(common_verifyField)
   3360 #endif
   3361     b        .LOP_SGET_BYTE_finish            # resume
   3362 
   3363 
   3364 /* ------------------------------ */
   3365     .balign 128
   3366 .L_OP_SGET_CHAR: /* 0x65 */
   3367 /* File: mips/OP_SGET_CHAR.S */
   3368 /* File: mips/OP_SGET.S */
   3369     /*
   3370      * General 32-bit SGET handler.
   3371      *
   3372      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   3373      */
   3374     # op vAA, field                        /* BBBB */
   3375     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3376     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3377     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3378     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3379     # is resolved entry !null?
   3380     bnez      a0, .LOP_SGET_CHAR_finish
   3381 
   3382     /*
   3383      * Continuation if the field has not yet been resolved.
   3384      *  a1:  BBBB field ref
   3385      *  rBIX: dvmDex->pResFields
   3386      */
   3387     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3388 #if defined(WITH_JIT)
   3389     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3390 #endif
   3391     EXPORT_PC()                            #  resolve() could throw, so export now
   3392     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3393     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3394     move      a0, v0
   3395     # success?
   3396     beqz      v0, common_exceptionThrown   #  no, handle exception
   3397 #if defined(WITH_JIT)
   3398     /*
   3399      * If the JIT is actively building a trace we need to make sure
   3400      * that the field is fully resolved before including this instruction.
   3401      */
   3402     JAL(common_verifyField)
   3403 #endif
   3404     b        .LOP_SGET_CHAR_finish            # resume
   3405 
   3406 
   3407 /* ------------------------------ */
   3408     .balign 128
   3409 .L_OP_SGET_SHORT: /* 0x66 */
   3410 /* File: mips/OP_SGET_SHORT.S */
   3411 /* File: mips/OP_SGET.S */
   3412     /*
   3413      * General 32-bit SGET handler.
   3414      *
   3415      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   3416      */
   3417     # op vAA, field                        /* BBBB */
   3418     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3419     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3420     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3421     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3422     # is resolved entry !null?
   3423     bnez      a0, .LOP_SGET_SHORT_finish
   3424 
   3425     /*
   3426      * Continuation if the field has not yet been resolved.
   3427      *  a1:  BBBB field ref
   3428      *  rBIX: dvmDex->pResFields
   3429      */
   3430     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3431 #if defined(WITH_JIT)
   3432     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3433 #endif
   3434     EXPORT_PC()                            #  resolve() could throw, so export now
   3435     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3436     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3437     move      a0, v0
   3438     # success?
   3439     beqz      v0, common_exceptionThrown   #  no, handle exception
   3440 #if defined(WITH_JIT)
   3441     /*
   3442      * If the JIT is actively building a trace we need to make sure
   3443      * that the field is fully resolved before including this instruction.
   3444      */
   3445     JAL(common_verifyField)
   3446 #endif
   3447     b        .LOP_SGET_SHORT_finish            # resume
   3448 
   3449 
   3450 /* ------------------------------ */
   3451     .balign 128
   3452 .L_OP_SPUT: /* 0x67 */
   3453 /* File: mips/OP_SPUT.S */
   3454     /*
   3455      * General 32-bit SPUT handler.
   3456      *
   3457      * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
   3458      */
   3459     # op vAA, field                        /* BBBB */
   3460     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3461     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3462     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3463     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3464     bnez      a0, .LOP_SPUT_finish       #  is resolved entry null?
   3465     /*
   3466      * Continuation if the field has not yet been resolved.
   3467      *  a1:  BBBB field ref
   3468      *  rBIX: dvmDex->pResFields
   3469      */
   3470     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3471 #if defined(WITH_JIT)
   3472     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3473 #endif
   3474     EXPORT_PC()                            #  resolve() may throw, so export now
   3475     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3476     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3477     move      a0, v0
   3478     beqz      v0, common_exceptionThrown   #  success? no, handle exception
   3479 #if defined(WITH_JIT)
   3480     /*
   3481      * If the JIT is actively building a trace we need to make sure
   3482      * that the field is fully resolved before including this instruction.
   3483      */
   3484     JAL(common_verifyField)
   3485 #endif
   3486     b        .LOP_SPUT_finish            # resume
   3487 
   3488 /* ------------------------------ */
   3489     .balign 128
   3490 .L_OP_SPUT_WIDE: /* 0x68 */
   3491 /* File: mips/OP_SPUT_WIDE.S */
   3492     /*
   3493      * 64-bit SPUT handler.
   3494      */
   3495     # sput-wide vAA, field                 /* BBBB */
   3496     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3497     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3498     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3499     GET_OPA(t0)                            #  t0 <- AA
   3500     LOAD_eas2(a2, rBIX, a1)                #  a2 <- resolved StaticField ptr
   3501     EAS2(rOBJ, rFP, t0)                    #  rOBJ<- &fp[AA]
   3502     # is resolved entry null?
   3503     beqz      a2, .LOP_SPUT_WIDE_resolve      #  yes, do resolve
   3504 .LOP_SPUT_WIDE_finish:                        #  field ptr in a2, AA in rOBJ
   3505     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   3506     LOAD64(a0, a1, rOBJ)                   #  a0/a1 <- vAA/vAA+1
   3507     GET_INST_OPCODE(rBIX)                  #  extract opcode from rINST
   3508     .if 0
   3509     addu    a2, offStaticField_value       #  a2<- pointer to data
   3510     JAL(dvmQuasiAtomicSwap64Sync)          #  stores a0/a1 into addr a2
   3511     .else
   3512     STORE64_off(a0, a1, a2, offStaticField_value) #  field <- vAA/vAA+1
   3513     .endif
   3514     GOTO_OPCODE(rBIX)                      #  jump to next instruction
   3515 
   3516 /* ------------------------------ */
   3517     .balign 128
   3518 .L_OP_SPUT_OBJECT: /* 0x69 */
   3519 /* File: mips/OP_SPUT_OBJECT.S */
   3520     /*
   3521      * General 32-bit SPUT handler.
   3522      *
   3523      * for: sput-object, sput-object-volatile
   3524      */
   3525     /* op vAA, field@BBBB */
   3526     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3527     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3528     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3529     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3530     bnez      a0, .LOP_SPUT_OBJECT_finish       #  is resolved entry null?
   3531 
   3532     /* Continuation if the field has not yet been resolved.
   3533      * a1:  BBBB field ref
   3534      * rBIX: dvmDex->pResFields
   3535      */
   3536     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3537 #if defined(WITH_JIT)
   3538     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3539 #endif
   3540     EXPORT_PC()                            #  resolve() may throw, so export now
   3541     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3542     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3543     move      a0, v0
   3544     beqz      v0, common_exceptionThrown   #  success? no, handle exception
   3545 #if defined(WITH_JIT)
   3546     /*
   3547      * If the JIT is actively building a trace we need to make sure
   3548      * that the field is fully resolved before including this instruction.
   3549      */
   3550     JAL(common_verifyField)
   3551 #endif
   3552     b       .LOP_SPUT_OBJECT_finish             # resume
   3553 
   3554 
   3555 /* ------------------------------ */
   3556     .balign 128
   3557 .L_OP_SPUT_BOOLEAN: /* 0x6a */
   3558 /* File: mips/OP_SPUT_BOOLEAN.S */
   3559 /* File: mips/OP_SPUT.S */
   3560     /*
   3561      * General 32-bit SPUT handler.
   3562      *
   3563      * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
   3564      */
   3565     # op vAA, field                        /* BBBB */
   3566     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3567     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3568     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3569     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3570     bnez      a0, .LOP_SPUT_BOOLEAN_finish       #  is resolved entry null?
   3571     /*
   3572      * Continuation if the field has not yet been resolved.
   3573      *  a1:  BBBB field ref
   3574      *  rBIX: dvmDex->pResFields
   3575      */
   3576     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3577 #if defined(WITH_JIT)
   3578     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3579 #endif
   3580     EXPORT_PC()                            #  resolve() may throw, so export now
   3581     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3582     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3583     move      a0, v0
   3584     beqz      v0, common_exceptionThrown   #  success? no, handle exception
   3585 #if defined(WITH_JIT)
   3586     /*
   3587      * If the JIT is actively building a trace we need to make sure
   3588      * that the field is fully resolved before including this instruction.
   3589      */
   3590     JAL(common_verifyField)
   3591 #endif
   3592     b        .LOP_SPUT_BOOLEAN_finish            # resume
   3593 
   3594 
   3595 /* ------------------------------ */
   3596     .balign 128
   3597 .L_OP_SPUT_BYTE: /* 0x6b */
   3598 /* File: mips/OP_SPUT_BYTE.S */
   3599 /* File: mips/OP_SPUT.S */
   3600     /*
   3601      * General 32-bit SPUT handler.
   3602      *
   3603      * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
   3604      */
   3605     # op vAA, field                        /* BBBB */
   3606     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3607     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3608     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3609     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3610     bnez      a0, .LOP_SPUT_BYTE_finish       #  is resolved entry null?
   3611     /*
   3612      * Continuation if the field has not yet been resolved.
   3613      *  a1:  BBBB field ref
   3614      *  rBIX: dvmDex->pResFields
   3615      */
   3616     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3617 #if defined(WITH_JIT)
   3618     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3619 #endif
   3620     EXPORT_PC()                            #  resolve() may throw, so export now
   3621     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3622     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3623     move      a0, v0
   3624     beqz      v0, common_exceptionThrown   #  success? no, handle exception
   3625 #if defined(WITH_JIT)
   3626     /*
   3627      * If the JIT is actively building a trace we need to make sure
   3628      * that the field is fully resolved before including this instruction.
   3629      */
   3630     JAL(common_verifyField)
   3631 #endif
   3632     b        .LOP_SPUT_BYTE_finish            # resume
   3633 
   3634 
   3635 /* ------------------------------ */
   3636     .balign 128
   3637 .L_OP_SPUT_CHAR: /* 0x6c */
   3638 /* File: mips/OP_SPUT_CHAR.S */
   3639 /* File: mips/OP_SPUT.S */
   3640     /*
   3641      * General 32-bit SPUT handler.
   3642      *
   3643      * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
   3644      */
   3645     # op vAA, field                        /* BBBB */
   3646     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3647     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3648     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3649     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3650     bnez      a0, .LOP_SPUT_CHAR_finish       #  is resolved entry null?
   3651     /*
   3652      * Continuation if the field has not yet been resolved.
   3653      *  a1:  BBBB field ref
   3654      *  rBIX: dvmDex->pResFields
   3655      */
   3656     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3657 #if defined(WITH_JIT)
   3658     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3659 #endif
   3660     EXPORT_PC()                            #  resolve() may throw, so export now
   3661     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3662     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3663     move      a0, v0
   3664     beqz      v0, common_exceptionThrown   #  success? no, handle exception
   3665 #if defined(WITH_JIT)
   3666     /*
   3667      * If the JIT is actively building a trace we need to make sure
   3668      * that the field is fully resolved before including this instruction.
   3669      */
   3670     JAL(common_verifyField)
   3671 #endif
   3672     b        .LOP_SPUT_CHAR_finish            # resume
   3673 
   3674 
   3675 /* ------------------------------ */
   3676     .balign 128
   3677 .L_OP_SPUT_SHORT: /* 0x6d */
   3678 /* File: mips/OP_SPUT_SHORT.S */
   3679 /* File: mips/OP_SPUT.S */
   3680     /*
   3681      * General 32-bit SPUT handler.
   3682      *
   3683      * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
   3684      */
   3685     # op vAA, field                        /* BBBB */
   3686     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   3687     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   3688     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   3689     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   3690     bnez      a0, .LOP_SPUT_SHORT_finish       #  is resolved entry null?
   3691     /*
   3692      * Continuation if the field has not yet been resolved.
   3693      *  a1:  BBBB field ref
   3694      *  rBIX: dvmDex->pResFields
   3695      */
   3696     LOAD_rSELF_method(a2)                  #  a2 <- current method
   3697 #if defined(WITH_JIT)
   3698     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   3699 #endif
   3700     EXPORT_PC()                            #  resolve() may throw, so export now
   3701     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   3702     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   3703     move      a0, v0
   3704     beqz      v0, common_exceptionThrown   #  success? no, handle exception
   3705 #if defined(WITH_JIT)
   3706     /*
   3707      * If the JIT is actively building a trace we need to make sure
   3708      * that the field is fully resolved before including this instruction.
   3709      */
   3710     JAL(common_verifyField)
   3711 #endif
   3712     b        .LOP_SPUT_SHORT_finish            # resume
   3713 
   3714 
   3715 /* ------------------------------ */
   3716     .balign 128
   3717 .L_OP_INVOKE_VIRTUAL: /* 0x6e */
   3718 /* File: mips/OP_INVOKE_VIRTUAL.S */
   3719     /*
   3720      * Handle a virtual method call.
   3721      *
   3722      * for: invoke-virtual, invoke-virtual/range
   3723      */
   3724     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   3725     # op vAA, {vCCCC..v(CCCC+AA-1)}, meth  /* BBBB */
   3726     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   3727     FETCH(a1, 1)                           #  a1 <- BBBB
   3728     LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
   3729     FETCH(rBIX, 2)                         #  rBIX <- GFED or CCCC
   3730     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved baseMethod
   3731     .if (!0)
   3732     and       rBIX, rBIX, 15               #  rBIX <- D (or stays CCCC)
   3733     .endif
   3734     EXPORT_PC()                            #  must export for invoke
   3735     # already resolved?
   3736     bnez      a0, .LOP_INVOKE_VIRTUAL_continue     #  yes, continue on
   3737 
   3738     LOAD_rSELF_method(a3)                  #  a3 <- self->method
   3739     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   3740     li        a2, METHOD_VIRTUAL           #  resolver method type
   3741     JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
   3742     move      a0, v0
   3743     # got null?
   3744     bnez      v0, .LOP_INVOKE_VIRTUAL_continue     #  no, continue
   3745     b         common_exceptionThrown       #  yes, handle exception
   3746 
   3747 /* ------------------------------ */
   3748     .balign 128
   3749 .L_OP_INVOKE_SUPER: /* 0x6f */
   3750 /* File: mips/OP_INVOKE_SUPER.S */
   3751     /*
   3752      * Handle a "super" method call.
   3753      *
   3754      * for: invoke-super, invoke-super/range
   3755      */
   3756     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   3757     # op vAA, {vCCCC..v(CCCC+AA-1)}, meth  /* BBBB */
   3758     FETCH(t0, 2)                           #  t0 <- GFED or CCCC
   3759     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   3760     .if (!0)
   3761     and       t0, t0, 15                   #  t0 <- D (or stays CCCC)
   3762     .endif
   3763     FETCH(a1, 1)                           #  a1 <- BBBB
   3764     LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
   3765     GET_VREG(rOBJ, t0)                     #  rOBJ <- "this" ptr
   3766     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved baseMethod
   3767     # null "this"?
   3768     LOAD_rSELF_method(t1)                  #  t1 <- current method
   3769     beqz      rOBJ, common_errNullObject   #  null "this", throw exception
   3770     # cmp a0, 0; already resolved?
   3771     LOAD_base_offMethod_clazz(rBIX, t1)    #  rBIX <- method->clazz
   3772     EXPORT_PC()                            #  must export for invoke
   3773     bnez      a0, .LOP_INVOKE_SUPER_continue     #  resolved, continue on
   3774 
   3775     move      a0, rBIX                     #  a0 <- method->clazz
   3776     li        a2, METHOD_VIRTUAL           #  resolver method type
   3777     JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
   3778     move      a0, v0
   3779     # got null?
   3780     beqz      v0, common_exceptionThrown   #  yes, handle exception
   3781     b         .LOP_INVOKE_SUPER_continue
   3782 
   3783 /* ------------------------------ */
   3784     .balign 128
   3785 .L_OP_INVOKE_DIRECT: /* 0x70 */
   3786 /* File: mips/OP_INVOKE_DIRECT.S */
   3787     /*
   3788      * Handle a direct method call.
   3789      *
   3790      * (We could defer the "is 'this' pointer null" test to the common
   3791      * method invocation code, and use a flag to indicate that static
   3792      * calls don't count.  If we do this as part of copying the arguments
   3793      * out we could avoiding loading the first arg twice.)
   3794      *
   3795      * for: invoke-direct, invoke-direct/range
   3796      */
   3797     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   3798     # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
   3799     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   3800     FETCH(a1, 1)                           #  a1 <- BBBB
   3801     LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
   3802     FETCH(rBIX, 2)                         #  rBIX <- GFED or CCCC
   3803     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved methodToCall
   3804     .if (!0)
   3805     and       rBIX, rBIX, 15               #  rBIX <- D (or stays CCCC)
   3806     .endif
   3807     EXPORT_PC()                            #  must export for invoke
   3808     GET_VREG(rOBJ, rBIX)                   #  rOBJ <- "this" ptr
   3809     # already resolved?
   3810     bnez      a0, 1f                       #  resolved, call the function
   3811 
   3812     lw        a3, offThread_method(rSELF)  #  a3 <- self->method
   3813     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   3814     li        a2, METHOD_DIRECT            #  resolver method type
   3815     JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
   3816     move      a0, v0
   3817     # got null?
   3818     beqz      v0, common_exceptionThrown   #  yes, handle exception
   3819 
   3820 1:
   3821     bnez      rOBJ, common_invokeMethodNoRange #  a0=method, rOBJ="this"
   3822     b         common_errNullObject         #  yes, throw exception
   3823 
   3824 
   3825 
   3826 
   3827 /* ------------------------------ */
   3828     .balign 128
   3829 .L_OP_INVOKE_STATIC: /* 0x71 */
   3830 /* File: mips/OP_INVOKE_STATIC.S */
   3831     /*
   3832      * Handle a static method call.
   3833      *
   3834      * for: invoke-static, invoke-static/range
   3835      */
   3836     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   3837     # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
   3838     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   3839     FETCH(a1, 1)                           #  a1 <- BBBB
   3840     LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
   3841     li      rOBJ, 0                        #  null "this" in delay slot
   3842     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved methodToCall
   3843 #if defined(WITH_JIT)
   3844     EAS2(rBIX, a3, a1)                     #  rBIX<- &resolved_metherToCall
   3845 #endif
   3846     EXPORT_PC()                            #  must export for invoke
   3847     # already resolved?
   3848     bnez      a0, common_invokeMethodNoRange #  yes, continue on
   3849     b         .LOP_INVOKE_STATIC_resolve
   3850 
   3851 /* ------------------------------ */
   3852     .balign 128
   3853 .L_OP_INVOKE_INTERFACE: /* 0x72 */
   3854 /* File: mips/OP_INVOKE_INTERFACE.S */
   3855     /*
   3856      * Handle an interface method call.
   3857      *
   3858      * for: invoke-interface, invoke-interface/range
   3859      */
   3860     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   3861     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   3862     FETCH(a2, 2)                           #  a2 <- FEDC or CCCC
   3863     FETCH(a1, 1)                           #  a1 <- BBBB
   3864     .if (!0)
   3865     and       a2, 15                       #  a2 <- C (or stays CCCC)
   3866     .endif
   3867     EXPORT_PC()                            #  must export for invoke
   3868     GET_VREG(rOBJ, a2)                     #  rOBJ <- first arg ("this")
   3869     LOAD_rSELF_methodClassDex(a3)          #  a3 <- methodClassDex
   3870     LOAD_rSELF_method(a2)                  #  a2 <- method
   3871     # null obj?
   3872     beqz      rOBJ, common_errNullObject   #  yes, fail
   3873     LOAD_base_offObject_clazz(a0, rOBJ)      #  a0 <- thisPtr->clazz
   3874     JAL(dvmFindInterfaceMethodInCache)     #  v0 <- call(class, ref, method, dex)
   3875     move      a0, v0
   3876     # failed?
   3877     beqz      v0, common_exceptionThrown   #  yes, handle exception
   3878     b         common_invokeMethodNoRange #  (a0=method, rOBJ="this")
   3879 
   3880 /* ------------------------------ */
   3881     .balign 128
   3882 .L_OP_UNUSED_73: /* 0x73 */
   3883 /* File: mips/OP_UNUSED_73.S */
   3884 /* File: mips/unused.S */
   3885     BAL(common_abort)
   3886 
   3887 
   3888 
   3889 /* ------------------------------ */
   3890     .balign 128
   3891 .L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
   3892 /* File: mips/OP_INVOKE_VIRTUAL_RANGE.S */
   3893 /* File: mips/OP_INVOKE_VIRTUAL.S */
   3894     /*
   3895      * Handle a virtual method call.
   3896      *
   3897      * for: invoke-virtual, invoke-virtual/range
   3898      */
   3899     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   3900     # op vAA, {vCCCC..v(CCCC+AA-1)}, meth  /* BBBB */
   3901     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   3902     FETCH(a1, 1)                           #  a1 <- BBBB
   3903     LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
   3904     FETCH(rBIX, 2)                         #  rBIX <- GFED or CCCC
   3905     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved baseMethod
   3906     .if (!1)
   3907     and       rBIX, rBIX, 15               #  rBIX <- D (or stays CCCC)
   3908     .endif
   3909     EXPORT_PC()                            #  must export for invoke
   3910     # already resolved?
   3911     bnez      a0, .LOP_INVOKE_VIRTUAL_RANGE_continue     #  yes, continue on
   3912 
   3913     LOAD_rSELF_method(a3)                  #  a3 <- self->method
   3914     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   3915     li        a2, METHOD_VIRTUAL           #  resolver method type
   3916     JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
   3917     move      a0, v0
   3918     # got null?
   3919     bnez      v0, .LOP_INVOKE_VIRTUAL_RANGE_continue     #  no, continue
   3920     b         common_exceptionThrown       #  yes, handle exception
   3921 
   3922 
   3923 /* ------------------------------ */
   3924     .balign 128
   3925 .L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
   3926 /* File: mips/OP_INVOKE_SUPER_RANGE.S */
   3927 /* File: mips/OP_INVOKE_SUPER.S */
   3928     /*
   3929      * Handle a "super" method call.
   3930      *
   3931      * for: invoke-super, invoke-super/range
   3932      */
   3933     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   3934     # op vAA, {vCCCC..v(CCCC+AA-1)}, meth  /* BBBB */
   3935     FETCH(t0, 2)                           #  t0 <- GFED or CCCC
   3936     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   3937     .if (!1)
   3938     and       t0, t0, 15                   #  t0 <- D (or stays CCCC)
   3939     .endif
   3940     FETCH(a1, 1)                           #  a1 <- BBBB
   3941     LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
   3942     GET_VREG(rOBJ, t0)                     #  rOBJ <- "this" ptr
   3943     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved baseMethod
   3944     # null "this"?
   3945     LOAD_rSELF_method(t1)                  #  t1 <- current method
   3946     beqz      rOBJ, common_errNullObject   #  null "this", throw exception
   3947     # cmp a0, 0; already resolved?
   3948     LOAD_base_offMethod_clazz(rBIX, t1)    #  rBIX <- method->clazz
   3949     EXPORT_PC()                            #  must export for invoke
   3950     bnez      a0, .LOP_INVOKE_SUPER_RANGE_continue     #  resolved, continue on
   3951 
   3952     move      a0, rBIX                     #  a0 <- method->clazz
   3953     li        a2, METHOD_VIRTUAL           #  resolver method type
   3954     JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
   3955     move      a0, v0
   3956     # got null?
   3957     beqz      v0, common_exceptionThrown   #  yes, handle exception
   3958     b         .LOP_INVOKE_SUPER_RANGE_continue
   3959 
   3960 
   3961 /* ------------------------------ */
   3962     .balign 128
   3963 .L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
   3964 /* File: mips/OP_INVOKE_DIRECT_RANGE.S */
   3965 /* File: mips/OP_INVOKE_DIRECT.S */
   3966     /*
   3967      * Handle a direct method call.
   3968      *
   3969      * (We could defer the "is 'this' pointer null" test to the common
   3970      * method invocation code, and use a flag to indicate that static
   3971      * calls don't count.  If we do this as part of copying the arguments
   3972      * out we could avoiding loading the first arg twice.)
   3973      *
   3974      * for: invoke-direct, invoke-direct/range
   3975      */
   3976     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   3977     # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
   3978     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   3979     FETCH(a1, 1)                           #  a1 <- BBBB
   3980     LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
   3981     FETCH(rBIX, 2)                         #  rBIX <- GFED or CCCC
   3982     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved methodToCall
   3983     .if (!1)
   3984     and       rBIX, rBIX, 15               #  rBIX <- D (or stays CCCC)
   3985     .endif
   3986     EXPORT_PC()                            #  must export for invoke
   3987     GET_VREG(rOBJ, rBIX)                   #  rOBJ <- "this" ptr
   3988     # already resolved?
   3989     bnez      a0, 1f                       #  resolved, call the function
   3990 
   3991     lw        a3, offThread_method(rSELF)  #  a3 <- self->method
   3992     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   3993     li        a2, METHOD_DIRECT            #  resolver method type
   3994     JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
   3995     move      a0, v0
   3996     # got null?
   3997     beqz      v0, common_exceptionThrown   #  yes, handle exception
   3998 
   3999 1:
   4000     bnez      rOBJ, common_invokeMethodRange #  a0=method, rOBJ="this"
   4001     b         common_errNullObject         #  yes, throw exception
   4002 
   4003 
   4004 
   4005 
   4006 
   4007 /* ------------------------------ */
   4008     .balign 128
   4009 .L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
   4010 /* File: mips/OP_INVOKE_STATIC_RANGE.S */
   4011 /* File: mips/OP_INVOKE_STATIC.S */
   4012     /*
   4013      * Handle a static method call.
   4014      *
   4015      * for: invoke-static, invoke-static/range
   4016      */
   4017     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   4018     # op {vCCCC..v(CCCC+AA-1)}, meth       /* BBBB */
   4019     LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
   4020     FETCH(a1, 1)                           #  a1 <- BBBB
   4021     LOAD_base_offDvmDex_pResMethods(a3, a3) #  a3 <- pDvmDex->pResMethods
   4022     li      rOBJ, 0                        #  null "this" in delay slot
   4023     LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved methodToCall
   4024 #if defined(WITH_JIT)
   4025     EAS2(rBIX, a3, a1)                     #  rBIX<- &resolved_metherToCall
   4026 #endif
   4027     EXPORT_PC()                            #  must export for invoke
   4028     # already resolved?
   4029     bnez      a0, common_invokeMethodRange #  yes, continue on
   4030     b         .LOP_INVOKE_STATIC_RANGE_resolve
   4031 
   4032 
   4033 /* ------------------------------ */
   4034     .balign 128
   4035 .L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
   4036 /* File: mips/OP_INVOKE_INTERFACE_RANGE.S */
   4037 /* File: mips/OP_INVOKE_INTERFACE.S */
   4038     /*
   4039      * Handle an interface method call.
   4040      *
   4041      * for: invoke-interface, invoke-interface/range
   4042      */
   4043     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
   4044     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
   4045     FETCH(a2, 2)                           #  a2 <- FEDC or CCCC
   4046     FETCH(a1, 1)                           #  a1 <- BBBB
   4047     .if (!1)
   4048     and       a2, 15                       #  a2 <- C (or stays CCCC)
   4049     .endif
   4050     EXPORT_PC()                            #  must export for invoke
   4051     GET_VREG(rOBJ, a2)                     #  rOBJ <- first arg ("this")
   4052     LOAD_rSELF_methodClassDex(a3)          #  a3 <- methodClassDex
   4053     LOAD_rSELF_method(a2)                  #  a2 <- method
   4054     # null obj?
   4055     beqz      rOBJ, common_errNullObject   #  yes, fail
   4056     LOAD_base_offObject_clazz(a0, rOBJ)      #  a0 <- thisPtr->clazz
   4057     JAL(dvmFindInterfaceMethodInCache)     #  v0 <- call(class, ref, method, dex)
   4058     move      a0, v0
   4059     # failed?
   4060     beqz      v0, common_exceptionThrown   #  yes, handle exception
   4061     b         common_invokeMethodRange #  (a0=method, rOBJ="this")
   4062 
   4063 
   4064 /* ------------------------------ */
   4065     .balign 128
   4066 .L_OP_UNUSED_79: /* 0x79 */
   4067 /* File: mips/OP_UNUSED_79.S */
   4068 /* File: mips/unused.S */
   4069     BAL(common_abort)
   4070 
   4071 
   4072 
   4073 /* ------------------------------ */
   4074     .balign 128
   4075 .L_OP_UNUSED_7A: /* 0x7a */
   4076 /* File: mips/OP_UNUSED_7A.S */
   4077 /* File: mips/unused.S */
   4078     BAL(common_abort)
   4079 
   4080 
   4081 
   4082 /* ------------------------------ */
   4083     .balign 128
   4084 .L_OP_NEG_INT: /* 0x7b */
   4085 /* File: mips/OP_NEG_INT.S */
   4086 /* File: mips/unop.S */
   4087     /*
   4088      * Generic 32-bit unary operation.  Provide an "instr" line that
   4089      * specifies an instruction that performs "result = op a0".
   4090      * This could be a MIPS instruction or a function call.
   4091      *
   4092      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   4093      *      int-to-byte, int-to-char, int-to-short
   4094      */
   4095     /* unop vA, vB */
   4096     GET_OPB(a3)                            #  a3 <- B
   4097     GET_OPA4(t0)                           #  t0 <- A+
   4098     GET_VREG(a0, a3)                       #  a0 <- vB
   4099     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4100                                   #  optional op
   4101     negu a0, a0                                 #  a0 <- op, a0-a3 changed
   4102     GET_INST_OPCODE(t1)                    #  extract opcode from rINST
   4103     SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
   4104     /* 9-10 instructions */
   4105 
   4106 
   4107 /* ------------------------------ */
   4108     .balign 128
   4109 .L_OP_NOT_INT: /* 0x7c */
   4110 /* File: mips/OP_NOT_INT.S */
   4111 /* File: mips/unop.S */
   4112     /*
   4113      * Generic 32-bit unary operation.  Provide an "instr" line that
   4114      * specifies an instruction that performs "result = op a0".
   4115      * This could be a MIPS instruction or a function call.
   4116      *
   4117      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   4118      *      int-to-byte, int-to-char, int-to-short
   4119      */
   4120     /* unop vA, vB */
   4121     GET_OPB(a3)                            #  a3 <- B
   4122     GET_OPA4(t0)                           #  t0 <- A+
   4123     GET_VREG(a0, a3)                       #  a0 <- vB
   4124     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4125                                   #  optional op
   4126     not a0, a0                                 #  a0 <- op, a0-a3 changed
   4127     GET_INST_OPCODE(t1)                    #  extract opcode from rINST
   4128     SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
   4129     /* 9-10 instructions */
   4130 
   4131 
   4132 /* ------------------------------ */
   4133     .balign 128
   4134 .L_OP_NEG_LONG: /* 0x7d */
   4135 /* File: mips/OP_NEG_LONG.S */
   4136 /* File: mips/unopWide.S */
   4137     /*
   4138      * Generic 64-bit unary operation.  Provide an "instr" line that
   4139      * specifies an instruction that performs "result = op a0/a1".
   4140      * This could be MIPS instruction or a function call.
   4141      *
   4142      * For: neg-long, not-long, neg-double, long-to-double, double-to-long
   4143      */
   4144     /* unop vA, vB */
   4145     GET_OPA4(t1)                           #  t1 <- A+
   4146     GET_OPB(a3)                            #  a3 <- B
   4147     EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
   4148     EAS2(rOBJ, rFP, t1)                    #  rOBJ <- &fp[A]
   4149     LOAD64(a0, a1, a3)                     #  a0/a1 <- vAA
   4150     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4151     negu v0, a0                              #  optional op
   4152     negu v1, a1; sltu a0, zero, v0; subu v1, v1, a0                                 #  a0/a1 <- op, a2-a3 changed
   4153     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4154     STORE64(v0, v1, rOBJ)      #  vAA <- a0/a1
   4155     GOTO_OPCODE(t0)                        #  jump to next instruction
   4156     /* 12-13 instructions */
   4157 
   4158 
   4159 
   4160 
   4161 /* ------------------------------ */
   4162     .balign 128
   4163 .L_OP_NOT_LONG: /* 0x7e */
   4164 /* File: mips/OP_NOT_LONG.S */
   4165 /* File: mips/unopWide.S */
   4166     /*
   4167      * Generic 64-bit unary operation.  Provide an "instr" line that
   4168      * specifies an instruction that performs "result = op a0/a1".
   4169      * This could be MIPS instruction or a function call.
   4170      *
   4171      * For: neg-long, not-long, neg-double, long-to-double, double-to-long
   4172      */
   4173     /* unop vA, vB */
   4174     GET_OPA4(t1)                           #  t1 <- A+
   4175     GET_OPB(a3)                            #  a3 <- B
   4176     EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
   4177     EAS2(rOBJ, rFP, t1)                    #  rOBJ <- &fp[A]
   4178     LOAD64(a0, a1, a3)                     #  a0/a1 <- vAA
   4179     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4180     not a0, a0                              #  optional op
   4181     not a1, a1                                 #  a0/a1 <- op, a2-a3 changed
   4182     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4183     STORE64(a0, a1, rOBJ)      #  vAA <- a0/a1
   4184     GOTO_OPCODE(t0)                        #  jump to next instruction
   4185     /* 12-13 instructions */
   4186 
   4187 
   4188 
   4189 /* ------------------------------ */
   4190     .balign 128
   4191 .L_OP_NEG_FLOAT: /* 0x7f */
   4192 /* File: mips/OP_NEG_FLOAT.S */
   4193 /* File: mips/unop.S */
   4194     /*
   4195      * Generic 32-bit unary operation.  Provide an "instr" line that
   4196      * specifies an instruction that performs "result = op a0".
   4197      * This could be a MIPS instruction or a function call.
   4198      *
   4199      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   4200      *      int-to-byte, int-to-char, int-to-short
   4201      */
   4202     /* unop vA, vB */
   4203     GET_OPB(a3)                            #  a3 <- B
   4204     GET_OPA4(t0)                           #  t0 <- A+
   4205     GET_VREG(a0, a3)                       #  a0 <- vB
   4206     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4207                                   #  optional op
   4208     addu a0, a0, 0x80000000                                 #  a0 <- op, a0-a3 changed
   4209     GET_INST_OPCODE(t1)                    #  extract opcode from rINST
   4210     SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
   4211     /* 9-10 instructions */
   4212 
   4213 
   4214 /* ------------------------------ */
   4215     .balign 128
   4216 .L_OP_NEG_DOUBLE: /* 0x80 */
   4217 /* File: mips/OP_NEG_DOUBLE.S */
   4218 /* File: mips/unopWide.S */
   4219     /*
   4220      * Generic 64-bit unary operation.  Provide an "instr" line that
   4221      * specifies an instruction that performs "result = op a0/a1".
   4222      * This could be MIPS instruction or a function call.
   4223      *
   4224      * For: neg-long, not-long, neg-double, long-to-double, double-to-long
   4225      */
   4226     /* unop vA, vB */
   4227     GET_OPA4(t1)                           #  t1 <- A+
   4228     GET_OPB(a3)                            #  a3 <- B
   4229     EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
   4230     EAS2(rOBJ, rFP, t1)                    #  rOBJ <- &fp[A]
   4231     LOAD64(a0, a1, a3)                     #  a0/a1 <- vAA
   4232     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4233                                   #  optional op
   4234     addu a1, a1, 0x80000000                                 #  a0/a1 <- op, a2-a3 changed
   4235     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4236     STORE64(a0, a1, rOBJ)      #  vAA <- a0/a1
   4237     GOTO_OPCODE(t0)                        #  jump to next instruction
   4238     /* 12-13 instructions */
   4239 
   4240 
   4241 
   4242 /* ------------------------------ */
   4243     .balign 128
   4244 .L_OP_INT_TO_LONG: /* 0x81 */
   4245 /* File: mips/OP_INT_TO_LONG.S */
   4246 /* File: mips/unopWider.S */
   4247     /*
   4248      * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
   4249      * that specifies an instruction that performs "result = op a0", where
   4250      * "result" is a 64-bit quantity in a0/a1.
   4251      *
   4252      * For: int-to-long, int-to-double, float-to-long, float-to-double
   4253      */
   4254     /* unop vA, vB */
   4255     GET_OPA4(t1)                           #  t1 <- A+
   4256     GET_OPB(a3)                            #  a3 <- B
   4257     GET_VREG(a0, a3)                       #  a0 <- vB
   4258     EAS2(rOBJ, rFP, t1)                    #  rOBJ <- &fp[A]
   4259     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4260                                   #  optional op
   4261     sra a1, a0, 31                                 #  result <- op, a0-a3 changed
   4262     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4263     STORE64(a0, a1, rOBJ)      #  vA/vA+1 <- a0/a1
   4264     GOTO_OPCODE(t0)                        #  jump to next instruction
   4265     /* 10-11 instructions */
   4266 
   4267 
   4268 /* ------------------------------ */
   4269     .balign 128
   4270 .L_OP_INT_TO_FLOAT: /* 0x82 */
   4271 /* File: mips/OP_INT_TO_FLOAT.S */
   4272 /* File: mips/unflop.S */
   4273     /*
   4274      * Generic 32-bit unary operation.  Provide an "instr" line that
   4275      * specifies an instruction that performs "result = op a0".
   4276      * This could be a MIPS instruction or a function call.
   4277      *
   4278      * for: int-to-float, float-to-int
   4279      */
   4280     /* unop vA, vB */
   4281     GET_OPB(a3)                            #  a3 <- B
   4282     GET_OPA4(rOBJ)                         #  t0 <- A+
   4283 #ifdef SOFT_FLOAT
   4284     GET_VREG(a0, a3)                       #  a0 <- vB
   4285 #else
   4286     GET_VREG_F(fa0, a3)
   4287 #endif
   4288                                   #  optional op
   4289     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4290 #ifdef SOFT_FLOAT
   4291     JAL(__floatsisf)                                 #  a0 <- op, a0-a3 changed
   4292 
   4293 .LOP_INT_TO_FLOAT_set_vreg:
   4294     SET_VREG(v0, rOBJ)                     #  vAA <- result0
   4295 #else
   4296     cvt.s.w fv0, fa0
   4297 
   4298 .LOP_INT_TO_FLOAT_set_vreg_f:
   4299     SET_VREG_F(fv0, rOBJ)
   4300 #endif
   4301     GET_INST_OPCODE(t1)                    #  extract opcode from rINST
   4302     GOTO_OPCODE(t1)                        #  jump to next instruction
   4303     /* 9-10 instructions */
   4304 
   4305 
   4306 /* ------------------------------ */
   4307     .balign 128
   4308 .L_OP_INT_TO_DOUBLE: /* 0x83 */
   4309 /* File: mips/OP_INT_TO_DOUBLE.S */
   4310 /* File: mips/unflopWider.S */
   4311     /*
   4312      * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
   4313      * that specifies an instruction that performs "result = op a0", where
   4314      * "result" is a 64-bit quantity in a0/a1.
   4315      *
   4316      * For: int-to-double, float-to-long, float-to-double
   4317      */
   4318     /* unop vA, vB */
   4319     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   4320     GET_OPB(a3)                            #  a3 <- B
   4321 #ifdef SOFT_FLOAT
   4322     GET_VREG(a0, a3)                       #  a0 <- vB
   4323 #else
   4324     GET_VREG_F(fa0, a3)
   4325 #endif
   4326     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   4327     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4328                                   #  optional op
   4329 #ifdef SOFT_FLOAT
   4330     JAL(__floatsidf)                                 #  result <- op, a0-a3 changed
   4331 
   4332 .LOP_INT_TO_DOUBLE_set_vreg:
   4333     STORE64(rRESULT0, rRESULT1, rOBJ)      #  vA/vA+1 <- a0/a1
   4334 #else
   4335     cvt.d.w fv0, fa0
   4336 
   4337 .LOP_INT_TO_DOUBLE_set_vreg:
   4338     STORE64_F(fv0, fv0f, rOBJ)                             #  vA/vA+1 <- a0/a1
   4339 #endif
   4340     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4341     GOTO_OPCODE(t0)                        #  jump to next instruction
   4342     /* 10-11 instructions */
   4343 
   4344 
   4345 /* ------------------------------ */
   4346     .balign 128
   4347 .L_OP_LONG_TO_INT: /* 0x84 */
   4348 /* File: mips/OP_LONG_TO_INT.S */
   4349     GET_OPB(a1)                            #  a1 <- B from 15:12
   4350     GET_OPA4(a0)                           #  a0 <- A from 11:8
   4351     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4352 #ifdef HAVE_BIG_ENDIAN
   4353     addu      a1, a1, 1
   4354 #endif
   4355     GET_VREG(a2, a1)                       #  a2 <- fp[B]
   4356     GET_INST_OPCODE(t0)                    #  t0 <- opcode from rINST
   4357     SET_VREG_GOTO(a2, a0, t0)              #  fp[A] <- a2
   4358 
   4359 /* ------------------------------ */
   4360     .balign 128
   4361 .L_OP_LONG_TO_FLOAT: /* 0x85 */
   4362 /* File: mips/OP_LONG_TO_FLOAT.S */
   4363 /* File: mips/unopNarrower.S */
   4364     /*
   4365      * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
   4366      * that specifies an instruction that performs "result = op a0/a1", where
   4367      * "result" is a 32-bit quantity in a0.
   4368      *
   4369      * For: long-to-float, double-to-int, double-to-float
   4370      * If hard floating point support is available, use fa0 as the parameter, except for
   4371      * long-to-float opcode.
   4372      * (This would work for long-to-int, but that instruction is actually
   4373      * an exact match for OP_MOVE.)
   4374      */
   4375     /* unop vA, vB */
   4376     GET_OPB(a3)                            #  a3 <- B
   4377     GET_OPA4(rOBJ)                         #  t1 <- A+
   4378     EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
   4379 #ifdef SOFT_FLOAT
   4380     LOAD64(rARG0, rARG1, a3)               #  a0/a1 <- vB/vB+1
   4381 #else
   4382     LOAD64(rARG0, rARG1, a3)
   4383 #endif
   4384     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4385                                   #  optional op
   4386 #ifdef SOFT_FLOAT
   4387     JAL(__floatdisf)                                 #  a0 <- op, a0-a3 changed
   4388 
   4389 .LOP_LONG_TO_FLOAT_set_vreg:
   4390     SET_VREG(v0, rOBJ)                     #  vA <- result0
   4391 #else
   4392     JAL(__floatdisf)
   4393 
   4394 .LOP_LONG_TO_FLOAT_set_vreg_f:
   4395     SET_VREG_F(fv0, rOBJ)                  #  vA <- result0
   4396 #endif
   4397     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4398     GOTO_OPCODE(t0)                        #  jump to next instruction
   4399     /* 10-11 instructions */
   4400 
   4401 
   4402 /* ------------------------------ */
   4403     .balign 128
   4404 .L_OP_LONG_TO_DOUBLE: /* 0x86 */
   4405 /* File: mips/OP_LONG_TO_DOUBLE.S */
   4406 /* File: mips/unflopWide.S */
   4407     /*
   4408      * Generic 64-bit unary operation.  Provide an "instr" line that
   4409      * specifies an instruction that performs "result = op a0/a1".
   4410      * This could be a MIPS instruction or a function call.
   4411      *
   4412      * long-to-double, double-to-long
   4413      */
   4414     /* unop vA, vB */
   4415     GET_OPA4(rOBJ)                         #  t1 <- A+
   4416     GET_OPB(a3)                            #  a3 <- B
   4417     EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
   4418     EAS2(rOBJ, rFP, rOBJ)                  #  t1 <- &fp[A]
   4419 #ifdef SOFT_FLOAT
   4420     LOAD64(rARG0, rARG1, a3)               #  a0/a1 <- vAA
   4421 #else
   4422     LOAD64(rARG0, rARG1, a3)
   4423 #endif
   4424     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4425                                   #  optional op
   4426     JAL(__floatdidf)                                 #  a0/a1 <- op, a2-a3 changed
   4427 
   4428 .LOP_LONG_TO_DOUBLE_set_vreg:
   4429 #ifdef SOFT_FLOAT
   4430     STORE64(rRESULT0, rRESULT1, rOBJ)      #  vAA <- a0/a1
   4431 #else
   4432     STORE64_F(fv0, fv0f, rOBJ)                             #  vAA <- a0/a1
   4433 #endif
   4434     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4435     GOTO_OPCODE(t0)                        #  jump to next instruction
   4436     /* 12-13 instructions */
   4437 
   4438 
   4439 
   4440 /* ------------------------------ */
   4441     .balign 128
   4442 .L_OP_FLOAT_TO_INT: /* 0x87 */
   4443 /* File: mips/OP_FLOAT_TO_INT.S */
   4444 /* File: mips/unflop.S */
   4445     /*
   4446      * Generic 32-bit unary operation.  Provide an "instr" line that
   4447      * specifies an instruction that performs "result = op a0".
   4448      * This could be a MIPS instruction or a function call.
   4449      *
   4450      * for: int-to-float, float-to-int
   4451      */
   4452     /* unop vA, vB */
   4453     GET_OPB(a3)                            #  a3 <- B
   4454     GET_OPA4(rOBJ)                         #  t0 <- A+
   4455 #ifdef SOFT_FLOAT
   4456     GET_VREG(a0, a3)                       #  a0 <- vB
   4457 #else
   4458     GET_VREG_F(fa0, a3)
   4459 #endif
   4460                                   #  optional op
   4461     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4462 #ifdef SOFT_FLOAT
   4463     b f2i_doconv                                 #  a0 <- op, a0-a3 changed
   4464 
   4465 .LOP_FLOAT_TO_INT_set_vreg:
   4466     SET_VREG(v0, rOBJ)                     #  vAA <- result0
   4467 #else
   4468     b f2i_doconv
   4469 
   4470 .LOP_FLOAT_TO_INT_set_vreg_f:
   4471     SET_VREG_F(fv0, rOBJ)
   4472 #endif
   4473     GET_INST_OPCODE(t1)                    #  extract opcode from rINST
   4474     GOTO_OPCODE(t1)                        #  jump to next instruction
   4475     /* 9-10 instructions */
   4476 
   4477 
   4478 /* ------------------------------ */
   4479     .balign 128
   4480 .L_OP_FLOAT_TO_LONG: /* 0x88 */
   4481 /* File: mips/OP_FLOAT_TO_LONG.S */
   4482 /* File: mips/unflopWider.S */
   4483     /*
   4484      * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
   4485      * that specifies an instruction that performs "result = op a0", where
   4486      * "result" is a 64-bit quantity in a0/a1.
   4487      *
   4488      * For: int-to-double, float-to-long, float-to-double
   4489      */
   4490     /* unop vA, vB */
   4491     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   4492     GET_OPB(a3)                            #  a3 <- B
   4493 #ifdef SOFT_FLOAT
   4494     GET_VREG(a0, a3)                       #  a0 <- vB
   4495 #else
   4496     GET_VREG_F(fa0, a3)
   4497 #endif
   4498     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   4499     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4500                                   #  optional op
   4501 #ifdef SOFT_FLOAT
   4502     b f2l_doconv                                 #  result <- op, a0-a3 changed
   4503 
   4504 .LOP_FLOAT_TO_LONG_set_vreg:
   4505     STORE64(rRESULT0, rRESULT1, rOBJ)      #  vA/vA+1 <- a0/a1
   4506 #else
   4507     b f2l_doconv
   4508 
   4509 .LOP_FLOAT_TO_LONG_set_vreg:
   4510     STORE64(rRESULT0, rRESULT1, rOBJ)                             #  vA/vA+1 <- a0/a1
   4511 #endif
   4512     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4513     GOTO_OPCODE(t0)                        #  jump to next instruction
   4514     /* 10-11 instructions */
   4515 
   4516 
   4517 /* ------------------------------ */
   4518     .balign 128
   4519 .L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
   4520 /* File: mips/OP_FLOAT_TO_DOUBLE.S */
   4521 /* File: mips/unflopWider.S */
   4522     /*
   4523      * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
   4524      * that specifies an instruction that performs "result = op a0", where
   4525      * "result" is a 64-bit quantity in a0/a1.
   4526      *
   4527      * For: int-to-double, float-to-long, float-to-double
   4528      */
   4529     /* unop vA, vB */
   4530     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   4531     GET_OPB(a3)                            #  a3 <- B
   4532 #ifdef SOFT_FLOAT
   4533     GET_VREG(a0, a3)                       #  a0 <- vB
   4534 #else
   4535     GET_VREG_F(fa0, a3)
   4536 #endif
   4537     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   4538     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4539                                   #  optional op
   4540 #ifdef SOFT_FLOAT
   4541     JAL(__extendsfdf2)                                 #  result <- op, a0-a3 changed
   4542 
   4543 .LOP_FLOAT_TO_DOUBLE_set_vreg:
   4544     STORE64(rRESULT0, rRESULT1, rOBJ)      #  vA/vA+1 <- a0/a1
   4545 #else
   4546     cvt.d.s fv0, fa0
   4547 
   4548 .LOP_FLOAT_TO_DOUBLE_set_vreg:
   4549     STORE64_F(fv0, fv0f, rOBJ)                             #  vA/vA+1 <- a0/a1
   4550 #endif
   4551     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4552     GOTO_OPCODE(t0)                        #  jump to next instruction
   4553     /* 10-11 instructions */
   4554 
   4555 
   4556 /* ------------------------------ */
   4557     .balign 128
   4558 .L_OP_DOUBLE_TO_INT: /* 0x8a */
   4559 /* File: mips/OP_DOUBLE_TO_INT.S */
   4560 /* File: mips/unopNarrower.S */
   4561     /*
   4562      * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
   4563      * that specifies an instruction that performs "result = op a0/a1", where
   4564      * "result" is a 32-bit quantity in a0.
   4565      *
   4566      * For: long-to-float, double-to-int, double-to-float
   4567      * If hard floating point support is available, use fa0 as the parameter, except for
   4568      * long-to-float opcode.
   4569      * (This would work for long-to-int, but that instruction is actually
   4570      * an exact match for OP_MOVE.)
   4571      */
   4572     /* unop vA, vB */
   4573     GET_OPB(a3)                            #  a3 <- B
   4574     GET_OPA4(rOBJ)                         #  t1 <- A+
   4575     EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
   4576 #ifdef SOFT_FLOAT
   4577     LOAD64(rARG0, rARG1, a3)               #  a0/a1 <- vB/vB+1
   4578 #else
   4579     LOAD64_F(fa0, fa0f, a3)
   4580 #endif
   4581     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4582                                   #  optional op
   4583 #ifdef SOFT_FLOAT
   4584     b d2i_doconv                                 #  a0 <- op, a0-a3 changed
   4585 
   4586 .LOP_DOUBLE_TO_INT_set_vreg:
   4587     SET_VREG(v0, rOBJ)                     #  vA <- result0
   4588 #else
   4589     b d2i_doconv
   4590 
   4591 .LOP_DOUBLE_TO_INT_set_vreg_f:
   4592     SET_VREG_F(fv0, rOBJ)                  #  vA <- result0
   4593 #endif
   4594     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4595     GOTO_OPCODE(t0)                        #  jump to next instruction
   4596     /* 10-11 instructions */
   4597 
   4598 /*
   4599  * Convert the double in a0/a1 to an int in a0.
   4600  *
   4601  * We have to clip values to int min/max per the specification.  The
   4602  * expected common case is a "reasonable" value that converts directly
   4603  * to modest integer.  The EABI convert function isn't doing this for us.
   4604  * Use rBIX / rTEMP as global to hold arguments (they are not bound to a global var)
   4605  */
   4606 
   4607 /* ------------------------------ */
   4608     .balign 128
   4609 .L_OP_DOUBLE_TO_LONG: /* 0x8b */
   4610 /* File: mips/OP_DOUBLE_TO_LONG.S */
   4611 /* File: mips/unflopWide.S */
   4612     /*
   4613      * Generic 64-bit unary operation.  Provide an "instr" line that
   4614      * specifies an instruction that performs "result = op a0/a1".
   4615      * This could be a MIPS instruction or a function call.
   4616      *
   4617      * long-to-double, double-to-long
   4618      */
   4619     /* unop vA, vB */
   4620     GET_OPA4(rOBJ)                         #  t1 <- A+
   4621     GET_OPB(a3)                            #  a3 <- B
   4622     EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
   4623     EAS2(rOBJ, rFP, rOBJ)                  #  t1 <- &fp[A]
   4624 #ifdef SOFT_FLOAT
   4625     LOAD64(rARG0, rARG1, a3)               #  a0/a1 <- vAA
   4626 #else
   4627     LOAD64_F(fa0, fa0f, a3)
   4628 #endif
   4629     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4630                                   #  optional op
   4631     b d2l_doconv                                 #  a0/a1 <- op, a2-a3 changed
   4632 
   4633 .LOP_DOUBLE_TO_LONG_set_vreg:
   4634 #ifdef SOFT_FLOAT
   4635     STORE64(rRESULT0, rRESULT1, rOBJ)      #  vAA <- a0/a1
   4636 #else
   4637     STORE64(rRESULT0, rRESULT1, rOBJ)                             #  vAA <- a0/a1
   4638 #endif
   4639     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4640     GOTO_OPCODE(t0)                        #  jump to next instruction
   4641     /* 12-13 instructions */
   4642 
   4643 
   4644 
   4645 /* ------------------------------ */
   4646     .balign 128
   4647 .L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
   4648 /* File: mips/OP_DOUBLE_TO_FLOAT.S */
   4649 /* File: mips/unopNarrower.S */
   4650     /*
   4651      * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
   4652      * that specifies an instruction that performs "result = op a0/a1", where
   4653      * "result" is a 32-bit quantity in a0.
   4654      *
   4655      * For: long-to-float, double-to-int, double-to-float
   4656      * If hard floating point support is available, use fa0 as the parameter, except for
   4657      * long-to-float opcode.
   4658      * (This would work for long-to-int, but that instruction is actually
   4659      * an exact match for OP_MOVE.)
   4660      */
   4661     /* unop vA, vB */
   4662     GET_OPB(a3)                            #  a3 <- B
   4663     GET_OPA4(rOBJ)                         #  t1 <- A+
   4664     EAS2(a3, rFP, a3)                      #  a3 <- &fp[B]
   4665 #ifdef SOFT_FLOAT
   4666     LOAD64(rARG0, rARG1, a3)               #  a0/a1 <- vB/vB+1
   4667 #else
   4668     LOAD64_F(fa0, fa0f, a3)
   4669 #endif
   4670     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4671                                   #  optional op
   4672 #ifdef SOFT_FLOAT
   4673     JAL(__truncdfsf2)                                 #  a0 <- op, a0-a3 changed
   4674 
   4675 .LOP_DOUBLE_TO_FLOAT_set_vreg:
   4676     SET_VREG(v0, rOBJ)                     #  vA <- result0
   4677 #else
   4678     cvt.s.d fv0, fa0
   4679 
   4680 .LOP_DOUBLE_TO_FLOAT_set_vreg_f:
   4681     SET_VREG_F(fv0, rOBJ)                  #  vA <- result0
   4682 #endif
   4683     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4684     GOTO_OPCODE(t0)                        #  jump to next instruction
   4685     /* 10-11 instructions */
   4686 
   4687 
   4688 /* ------------------------------ */
   4689     .balign 128
   4690 .L_OP_INT_TO_BYTE: /* 0x8d */
   4691 /* File: mips/OP_INT_TO_BYTE.S */
   4692 /* File: mips/unop.S */
   4693     /*
   4694      * Generic 32-bit unary operation.  Provide an "instr" line that
   4695      * specifies an instruction that performs "result = op a0".
   4696      * This could be a MIPS instruction or a function call.
   4697      *
   4698      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   4699      *      int-to-byte, int-to-char, int-to-short
   4700      */
   4701     /* unop vA, vB */
   4702     GET_OPB(a3)                            #  a3 <- B
   4703     GET_OPA4(t0)                           #  t0 <- A+
   4704     GET_VREG(a0, a3)                       #  a0 <- vB
   4705     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4706     sll a0, a0, 24                              #  optional op
   4707     sra a0, a0, 24                                 #  a0 <- op, a0-a3 changed
   4708     GET_INST_OPCODE(t1)                    #  extract opcode from rINST
   4709     SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
   4710     /* 9-10 instructions */
   4711 
   4712 
   4713 /* ------------------------------ */
   4714     .balign 128
   4715 .L_OP_INT_TO_CHAR: /* 0x8e */
   4716 /* File: mips/OP_INT_TO_CHAR.S */
   4717 /* File: mips/unop.S */
   4718     /*
   4719      * Generic 32-bit unary operation.  Provide an "instr" line that
   4720      * specifies an instruction that performs "result = op a0".
   4721      * This could be a MIPS instruction or a function call.
   4722      *
   4723      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   4724      *      int-to-byte, int-to-char, int-to-short
   4725      */
   4726     /* unop vA, vB */
   4727     GET_OPB(a3)                            #  a3 <- B
   4728     GET_OPA4(t0)                           #  t0 <- A+
   4729     GET_VREG(a0, a3)                       #  a0 <- vB
   4730     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4731                                   #  optional op
   4732     and a0, 0xffff                                 #  a0 <- op, a0-a3 changed
   4733     GET_INST_OPCODE(t1)                    #  extract opcode from rINST
   4734     SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
   4735     /* 9-10 instructions */
   4736 
   4737 
   4738 /* ------------------------------ */
   4739     .balign 128
   4740 .L_OP_INT_TO_SHORT: /* 0x8f */
   4741 /* File: mips/OP_INT_TO_SHORT.S */
   4742 /* File: mips/unop.S */
   4743     /*
   4744      * Generic 32-bit unary operation.  Provide an "instr" line that
   4745      * specifies an instruction that performs "result = op a0".
   4746      * This could be a MIPS instruction or a function call.
   4747      *
   4748      * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
   4749      *      int-to-byte, int-to-char, int-to-short
   4750      */
   4751     /* unop vA, vB */
   4752     GET_OPB(a3)                            #  a3 <- B
   4753     GET_OPA4(t0)                           #  t0 <- A+
   4754     GET_VREG(a0, a3)                       #  a0 <- vB
   4755     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   4756     sll a0, 16                              #  optional op
   4757     sra a0, 16                                 #  a0 <- op, a0-a3 changed
   4758     GET_INST_OPCODE(t1)                    #  extract opcode from rINST
   4759     SET_VREG_GOTO(a0, t0, t1)        #  vAA <- result0
   4760     /* 9-10 instructions */
   4761 
   4762 
   4763 /* ------------------------------ */
   4764     .balign 128
   4765 .L_OP_ADD_INT: /* 0x90 */
   4766 /* File: mips/OP_ADD_INT.S */
   4767 /* File: mips/binop.S */
   4768     /*
   4769      * Generic 32-bit binary operation.  Provide an "instr" line that
   4770      * specifies an instruction that performs "result = a0 op a1".
   4771      * This could be a MIPS instruction or a function call.  (If the result
   4772      * comes back in a register other than a0, you can override "result".)
   4773      *
   4774      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4775      * vCC (a1).  Useful for integer division and modulus.  Note that we
   4776      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4777      * handles it correctly.
   4778      *
   4779      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4780      *      xor-int, shl-int, shr-int, ushr-int
   4781      */
   4782     /* binop vAA, vBB, vCC */
   4783     FETCH(a0, 1)                           #  a0 <- CCBB
   4784     GET_OPA(rOBJ)                          #  rOBJ <- AA
   4785     srl       a3, a0, 8                    #  a3 <- CC
   4786     and       a2, a0, 255                  #  a2 <- BB
   4787     GET_VREG(a1, a3)                       #  a1 <- vCC
   4788     GET_VREG(a0, a2)                       #  a0 <- vBB
   4789     .if 0
   4790     # is second operand zero?
   4791     beqz      a1, common_errDivideByZero
   4792     .endif
   4793 
   4794     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   4795                                   #  optional op
   4796     addu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   4797     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4798     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   4799     /* 11-14 instructions */
   4800 
   4801 
   4802 
   4803 /* ------------------------------ */
   4804     .balign 128
   4805 .L_OP_SUB_INT: /* 0x91 */
   4806 /* File: mips/OP_SUB_INT.S */
   4807 /* File: mips/binop.S */
   4808     /*
   4809      * Generic 32-bit binary operation.  Provide an "instr" line that
   4810      * specifies an instruction that performs "result = a0 op a1".
   4811      * This could be a MIPS instruction or a function call.  (If the result
   4812      * comes back in a register other than a0, you can override "result".)
   4813      *
   4814      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4815      * vCC (a1).  Useful for integer division and modulus.  Note that we
   4816      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4817      * handles it correctly.
   4818      *
   4819      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4820      *      xor-int, shl-int, shr-int, ushr-int
   4821      */
   4822     /* binop vAA, vBB, vCC */
   4823     FETCH(a0, 1)                           #  a0 <- CCBB
   4824     GET_OPA(rOBJ)                          #  rOBJ <- AA
   4825     srl       a3, a0, 8                    #  a3 <- CC
   4826     and       a2, a0, 255                  #  a2 <- BB
   4827     GET_VREG(a1, a3)                       #  a1 <- vCC
   4828     GET_VREG(a0, a2)                       #  a0 <- vBB
   4829     .if 0
   4830     # is second operand zero?
   4831     beqz      a1, common_errDivideByZero
   4832     .endif
   4833 
   4834     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   4835                                   #  optional op
   4836     subu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   4837     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4838     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   4839     /* 11-14 instructions */
   4840 
   4841 
   4842 
   4843 /* ------------------------------ */
   4844     .balign 128
   4845 .L_OP_MUL_INT: /* 0x92 */
   4846 /* File: mips/OP_MUL_INT.S */
   4847 /* File: mips/binop.S */
   4848     /*
   4849      * Generic 32-bit binary operation.  Provide an "instr" line that
   4850      * specifies an instruction that performs "result = a0 op a1".
   4851      * This could be a MIPS instruction or a function call.  (If the result
   4852      * comes back in a register other than a0, you can override "result".)
   4853      *
   4854      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4855      * vCC (a1).  Useful for integer division and modulus.  Note that we
   4856      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4857      * handles it correctly.
   4858      *
   4859      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4860      *      xor-int, shl-int, shr-int, ushr-int
   4861      */
   4862     /* binop vAA, vBB, vCC */
   4863     FETCH(a0, 1)                           #  a0 <- CCBB
   4864     GET_OPA(rOBJ)                          #  rOBJ <- AA
   4865     srl       a3, a0, 8                    #  a3 <- CC
   4866     and       a2, a0, 255                  #  a2 <- BB
   4867     GET_VREG(a1, a3)                       #  a1 <- vCC
   4868     GET_VREG(a0, a2)                       #  a0 <- vBB
   4869     .if 0
   4870     # is second operand zero?
   4871     beqz      a1, common_errDivideByZero
   4872     .endif
   4873 
   4874     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   4875                                   #  optional op
   4876     mul a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   4877     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4878     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   4879     /* 11-14 instructions */
   4880 
   4881 
   4882 
   4883 /* ------------------------------ */
   4884     .balign 128
   4885 .L_OP_DIV_INT: /* 0x93 */
   4886 /* File: mips/OP_DIV_INT.S */
   4887 /* File: mips/binop.S */
   4888     /*
   4889      * Generic 32-bit binary operation.  Provide an "instr" line that
   4890      * specifies an instruction that performs "result = a0 op a1".
   4891      * This could be a MIPS instruction or a function call.  (If the result
   4892      * comes back in a register other than a0, you can override "result".)
   4893      *
   4894      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4895      * vCC (a1).  Useful for integer division and modulus.  Note that we
   4896      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4897      * handles it correctly.
   4898      *
   4899      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4900      *      xor-int, shl-int, shr-int, ushr-int
   4901      */
   4902     /* binop vAA, vBB, vCC */
   4903     FETCH(a0, 1)                           #  a0 <- CCBB
   4904     GET_OPA(rOBJ)                          #  rOBJ <- AA
   4905     srl       a3, a0, 8                    #  a3 <- CC
   4906     and       a2, a0, 255                  #  a2 <- BB
   4907     GET_VREG(a1, a3)                       #  a1 <- vCC
   4908     GET_VREG(a0, a2)                       #  a0 <- vBB
   4909     .if 1
   4910     # is second operand zero?
   4911     beqz      a1, common_errDivideByZero
   4912     .endif
   4913 
   4914     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   4915                                   #  optional op
   4916     div zero, a0, a1; mflo a0                                 #  a0 <- op, a0-a3 changed
   4917     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4918     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   4919     /* 11-14 instructions */
   4920 
   4921 
   4922 
   4923 /* ------------------------------ */
   4924     .balign 128
   4925 .L_OP_REM_INT: /* 0x94 */
   4926 /* File: mips/OP_REM_INT.S */
   4927 /* File: mips/binop.S */
   4928     /*
   4929      * Generic 32-bit binary operation.  Provide an "instr" line that
   4930      * specifies an instruction that performs "result = a0 op a1".
   4931      * This could be a MIPS instruction or a function call.  (If the result
   4932      * comes back in a register other than a0, you can override "result".)
   4933      *
   4934      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4935      * vCC (a1).  Useful for integer division and modulus.  Note that we
   4936      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4937      * handles it correctly.
   4938      *
   4939      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4940      *      xor-int, shl-int, shr-int, ushr-int
   4941      */
   4942     /* binop vAA, vBB, vCC */
   4943     FETCH(a0, 1)                           #  a0 <- CCBB
   4944     GET_OPA(rOBJ)                          #  rOBJ <- AA
   4945     srl       a3, a0, 8                    #  a3 <- CC
   4946     and       a2, a0, 255                  #  a2 <- BB
   4947     GET_VREG(a1, a3)                       #  a1 <- vCC
   4948     GET_VREG(a0, a2)                       #  a0 <- vBB
   4949     .if 1
   4950     # is second operand zero?
   4951     beqz      a1, common_errDivideByZero
   4952     .endif
   4953 
   4954     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   4955                                   #  optional op
   4956     div zero, a0, a1; mfhi a0                                 #  a0 <- op, a0-a3 changed
   4957     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4958     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   4959     /* 11-14 instructions */
   4960 
   4961 
   4962 
   4963 /* ------------------------------ */
   4964     .balign 128
   4965 .L_OP_AND_INT: /* 0x95 */
   4966 /* File: mips/OP_AND_INT.S */
   4967 /* File: mips/binop.S */
   4968     /*
   4969      * Generic 32-bit binary operation.  Provide an "instr" line that
   4970      * specifies an instruction that performs "result = a0 op a1".
   4971      * This could be a MIPS instruction or a function call.  (If the result
   4972      * comes back in a register other than a0, you can override "result".)
   4973      *
   4974      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   4975      * vCC (a1).  Useful for integer division and modulus.  Note that we
   4976      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   4977      * handles it correctly.
   4978      *
   4979      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   4980      *      xor-int, shl-int, shr-int, ushr-int
   4981      */
   4982     /* binop vAA, vBB, vCC */
   4983     FETCH(a0, 1)                           #  a0 <- CCBB
   4984     GET_OPA(rOBJ)                          #  rOBJ <- AA
   4985     srl       a3, a0, 8                    #  a3 <- CC
   4986     and       a2, a0, 255                  #  a2 <- BB
   4987     GET_VREG(a1, a3)                       #  a1 <- vCC
   4988     GET_VREG(a0, a2)                       #  a0 <- vBB
   4989     .if 0
   4990     # is second operand zero?
   4991     beqz      a1, common_errDivideByZero
   4992     .endif
   4993 
   4994     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   4995                                   #  optional op
   4996     and a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   4997     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   4998     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   4999     /* 11-14 instructions */
   5000 
   5001 
   5002 
   5003 /* ------------------------------ */
   5004     .balign 128
   5005 .L_OP_OR_INT: /* 0x96 */
   5006 /* File: mips/OP_OR_INT.S */
   5007 /* File: mips/binop.S */
   5008     /*
   5009      * Generic 32-bit binary operation.  Provide an "instr" line that
   5010      * specifies an instruction that performs "result = a0 op a1".
   5011      * This could be a MIPS instruction or a function call.  (If the result
   5012      * comes back in a register other than a0, you can override "result".)
   5013      *
   5014      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5015      * vCC (a1).  Useful for integer division and modulus.  Note that we
   5016      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   5017      * handles it correctly.
   5018      *
   5019      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   5020      *      xor-int, shl-int, shr-int, ushr-int
   5021      */
   5022     /* binop vAA, vBB, vCC */
   5023     FETCH(a0, 1)                           #  a0 <- CCBB
   5024     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5025     srl       a3, a0, 8                    #  a3 <- CC
   5026     and       a2, a0, 255                  #  a2 <- BB
   5027     GET_VREG(a1, a3)                       #  a1 <- vCC
   5028     GET_VREG(a0, a2)                       #  a0 <- vBB
   5029     .if 0
   5030     # is second operand zero?
   5031     beqz      a1, common_errDivideByZero
   5032     .endif
   5033 
   5034     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5035                                   #  optional op
   5036     or a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   5037     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5038     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   5039     /* 11-14 instructions */
   5040 
   5041 
   5042 
   5043 /* ------------------------------ */
   5044     .balign 128
   5045 .L_OP_XOR_INT: /* 0x97 */
   5046 /* File: mips/OP_XOR_INT.S */
   5047 /* File: mips/binop.S */
   5048     /*
   5049      * Generic 32-bit binary operation.  Provide an "instr" line that
   5050      * specifies an instruction that performs "result = a0 op a1".
   5051      * This could be a MIPS instruction or a function call.  (If the result
   5052      * comes back in a register other than a0, you can override "result".)
   5053      *
   5054      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5055      * vCC (a1).  Useful for integer division and modulus.  Note that we
   5056      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   5057      * handles it correctly.
   5058      *
   5059      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   5060      *      xor-int, shl-int, shr-int, ushr-int
   5061      */
   5062     /* binop vAA, vBB, vCC */
   5063     FETCH(a0, 1)                           #  a0 <- CCBB
   5064     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5065     srl       a3, a0, 8                    #  a3 <- CC
   5066     and       a2, a0, 255                  #  a2 <- BB
   5067     GET_VREG(a1, a3)                       #  a1 <- vCC
   5068     GET_VREG(a0, a2)                       #  a0 <- vBB
   5069     .if 0
   5070     # is second operand zero?
   5071     beqz      a1, common_errDivideByZero
   5072     .endif
   5073 
   5074     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5075                                   #  optional op
   5076     xor a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   5077     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5078     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   5079     /* 11-14 instructions */
   5080 
   5081 
   5082 
   5083 /* ------------------------------ */
   5084     .balign 128
   5085 .L_OP_SHL_INT: /* 0x98 */
   5086 /* File: mips/OP_SHL_INT.S */
   5087 /* File: mips/binop.S */
   5088     /*
   5089      * Generic 32-bit binary operation.  Provide an "instr" line that
   5090      * specifies an instruction that performs "result = a0 op a1".
   5091      * This could be a MIPS instruction or a function call.  (If the result
   5092      * comes back in a register other than a0, you can override "result".)
   5093      *
   5094      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5095      * vCC (a1).  Useful for integer division and modulus.  Note that we
   5096      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   5097      * handles it correctly.
   5098      *
   5099      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   5100      *      xor-int, shl-int, shr-int, ushr-int
   5101      */
   5102     /* binop vAA, vBB, vCC */
   5103     FETCH(a0, 1)                           #  a0 <- CCBB
   5104     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5105     srl       a3, a0, 8                    #  a3 <- CC
   5106     and       a2, a0, 255                  #  a2 <- BB
   5107     GET_VREG(a1, a3)                       #  a1 <- vCC
   5108     GET_VREG(a0, a2)                       #  a0 <- vBB
   5109     .if 0
   5110     # is second operand zero?
   5111     beqz      a1, common_errDivideByZero
   5112     .endif
   5113 
   5114     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5115     and a1, a1, 31                              #  optional op
   5116     sll a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   5117     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5118     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   5119     /* 11-14 instructions */
   5120 
   5121 
   5122 
   5123 /* ------------------------------ */
   5124     .balign 128
   5125 .L_OP_SHR_INT: /* 0x99 */
   5126 /* File: mips/OP_SHR_INT.S */
   5127 /* File: mips/binop.S */
   5128     /*
   5129      * Generic 32-bit binary operation.  Provide an "instr" line that
   5130      * specifies an instruction that performs "result = a0 op a1".
   5131      * This could be a MIPS instruction or a function call.  (If the result
   5132      * comes back in a register other than a0, you can override "result".)
   5133      *
   5134      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5135      * vCC (a1).  Useful for integer division and modulus.  Note that we
   5136      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   5137      * handles it correctly.
   5138      *
   5139      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   5140      *      xor-int, shl-int, shr-int, ushr-int
   5141      */
   5142     /* binop vAA, vBB, vCC */
   5143     FETCH(a0, 1)                           #  a0 <- CCBB
   5144     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5145     srl       a3, a0, 8                    #  a3 <- CC
   5146     and       a2, a0, 255                  #  a2 <- BB
   5147     GET_VREG(a1, a3)                       #  a1 <- vCC
   5148     GET_VREG(a0, a2)                       #  a0 <- vBB
   5149     .if 0
   5150     # is second operand zero?
   5151     beqz      a1, common_errDivideByZero
   5152     .endif
   5153 
   5154     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5155     and a1, a1, 31                              #  optional op
   5156     sra a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   5157     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5158     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   5159     /* 11-14 instructions */
   5160 
   5161 
   5162 
   5163 /* ------------------------------ */
   5164     .balign 128
   5165 .L_OP_USHR_INT: /* 0x9a */
   5166 /* File: mips/OP_USHR_INT.S */
   5167 /* File: mips/binop.S */
   5168     /*
   5169      * Generic 32-bit binary operation.  Provide an "instr" line that
   5170      * specifies an instruction that performs "result = a0 op a1".
   5171      * This could be a MIPS instruction or a function call.  (If the result
   5172      * comes back in a register other than a0, you can override "result".)
   5173      *
   5174      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5175      * vCC (a1).  Useful for integer division and modulus.  Note that we
   5176      * *don't* check for (INT_MIN / -1) here, because the ARM math lib
   5177      * handles it correctly.
   5178      *
   5179      * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
   5180      *      xor-int, shl-int, shr-int, ushr-int
   5181      */
   5182     /* binop vAA, vBB, vCC */
   5183     FETCH(a0, 1)                           #  a0 <- CCBB
   5184     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5185     srl       a3, a0, 8                    #  a3 <- CC
   5186     and       a2, a0, 255                  #  a2 <- BB
   5187     GET_VREG(a1, a3)                       #  a1 <- vCC
   5188     GET_VREG(a0, a2)                       #  a0 <- vBB
   5189     .if 0
   5190     # is second operand zero?
   5191     beqz      a1, common_errDivideByZero
   5192     .endif
   5193 
   5194     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5195     and a1, a1, 31                              #  optional op
   5196     srl a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   5197     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5198     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   5199     /* 11-14 instructions */
   5200 
   5201 
   5202 
   5203 /* ------------------------------ */
   5204     .balign 128
   5205 .L_OP_ADD_LONG: /* 0x9b */
   5206 /* File: mips/OP_ADD_LONG.S */
   5207 /*
   5208  *  The compiler generates the following sequence for
   5209  *  [v1 v0] =  [a1 a0] + [a3 a2];
   5210  *    addu v0,a2,a0
   5211  *    addu a1,a3,a1
   5212  *    sltu v1,v0,a2
   5213  *    addu v1,v1,a1
   5214  */
   5215 /* File: mips/binopWide.S */
   5216     /*
   5217      * Generic 64-bit binary operation.  Provide an "instr" line that
   5218      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   5219      * This could be a MIPS instruction or a function call.  (If the result
   5220      * comes back in a register other than a0, you can override "result".)
   5221      *
   5222      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5223      * vCC (a1).  Useful for integer division and modulus.
   5224      *
   5225      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   5226      *      xor-long
   5227      *
   5228      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   5229      */
   5230     /* binop vAA, vBB, vCC */
   5231     FETCH(a0, 1)                           #  a0 <- CCBB
   5232     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5233     and       a2, a0, 255                  #  a2 <- BB
   5234     srl       a3, a0, 8                    #  a3 <- CC
   5235     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[AA]
   5236     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   5237     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   5238     LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
   5239     LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
   5240     .if 0
   5241     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   5242     beqz      t0, common_errDivideByZero
   5243     .endif
   5244     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5245 
   5246     addu v0, a2, a0                              #  optional op
   5247     addu a1, a3, a1; sltu v1, v0, a2; addu v1, v1, a1                                 #  result <- op, a0-a3 changed
   5248     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5249     STORE64(v0, v1, rOBJ)      #  vAA/vAA+1 <- v0/v1
   5250     GOTO_OPCODE(t0)                        #  jump to next instruction
   5251     /* 14-17 instructions */
   5252 
   5253 
   5254 
   5255 /* ------------------------------ */
   5256     .balign 128
   5257 .L_OP_SUB_LONG: /* 0x9c */
   5258 /* File: mips/OP_SUB_LONG.S */
   5259 /*
   5260  * For little endian the code sequence looks as follows:
   5261  *    subu    v0,a0,a2
   5262  *    subu    v1,a1,a3
   5263  *    sltu    a0,a0,v0
   5264  *    subu    v1,v1,a0
   5265  */
   5266 /* File: mips/binopWide.S */
   5267     /*
   5268      * Generic 64-bit binary operation.  Provide an "instr" line that
   5269      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   5270      * This could be a MIPS instruction or a function call.  (If the result
   5271      * comes back in a register other than a0, you can override "result".)
   5272      *
   5273      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5274      * vCC (a1).  Useful for integer division and modulus.
   5275      *
   5276      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   5277      *      xor-long
   5278      *
   5279      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   5280      */
   5281     /* binop vAA, vBB, vCC */
   5282     FETCH(a0, 1)                           #  a0 <- CCBB
   5283     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5284     and       a2, a0, 255                  #  a2 <- BB
   5285     srl       a3, a0, 8                    #  a3 <- CC
   5286     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[AA]
   5287     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   5288     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   5289     LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
   5290     LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
   5291     .if 0
   5292     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   5293     beqz      t0, common_errDivideByZero
   5294     .endif
   5295     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5296 
   5297     subu v0, a0, a2                              #  optional op
   5298     subu v1, a1, a3; sltu a0, a0, v0; subu v1, v1, a0                                 #  result <- op, a0-a3 changed
   5299     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5300     STORE64(v0, v1, rOBJ)      #  vAA/vAA+1 <- v0/v1
   5301     GOTO_OPCODE(t0)                        #  jump to next instruction
   5302     /* 14-17 instructions */
   5303 
   5304 
   5305 
   5306 
   5307 /* ------------------------------ */
   5308     .balign 128
   5309 .L_OP_MUL_LONG: /* 0x9d */
   5310 /* File: mips/OP_MUL_LONG.S */
   5311     /*
   5312      * Signed 64-bit integer multiply.
   5313      *         a1   a0
   5314      *   x     a3   a2
   5315      *   -------------
   5316      *       a2a1 a2a0
   5317      *       a3a0
   5318      *  a3a1 (<= unused)
   5319      *  ---------------
   5320      *         v1   v0
   5321      */
   5322     /* mul-long vAA, vBB, vCC */
   5323     FETCH(a0, 1)                           #  a0 <- CCBB
   5324     and       t0, a0, 255                  #  a2 <- BB
   5325     srl       t1, a0, 8                    #  a3 <- CC
   5326     EAS2(t0, rFP, t0)                      #  t0 <- &fp[BB]
   5327     LOAD64(a0, a1, t0)                     #  a0/a1 <- vBB/vBB+1
   5328 
   5329     EAS2(t1, rFP, t1)                      #  t0 <- &fp[CC]
   5330     LOAD64(a2, a3, t1)                     #  a2/a3 <- vCC/vCC+1
   5331 
   5332     mul       v1, a3, a0                   #  v1= a3a0
   5333     multu     a2, a0
   5334     mfhi      t1
   5335     mflo      v0                           #  v0= a2a0
   5336     mul       t0, a2, a1                   #  t0= a2a1
   5337     addu      v1, v1, t1                   #  v1+= hi(a2a0)
   5338     addu      v1, v1, t0                   #  v1= a3a0 + a2a1;
   5339 
   5340     GET_OPA(a0)                            #  a0 <- AA
   5341     EAS2(a0, rFP, a0)                      #  a0 <- &fp[A]
   5342     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5343     b         .LOP_MUL_LONG_finish
   5344 
   5345 /* ------------------------------ */
   5346     .balign 128
   5347 .L_OP_DIV_LONG: /* 0x9e */
   5348 /* File: mips/OP_DIV_LONG.S */
   5349 #ifdef HAVE_LITTLE_ENDIAN
   5350 /* File: mips/binopWide.S */
   5351     /*
   5352      * Generic 64-bit binary operation.  Provide an "instr" line that
   5353      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   5354      * This could be a MIPS instruction or a function call.  (If the result
   5355      * comes back in a register other than a0, you can override "result".)
   5356      *
   5357      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5358      * vCC (a1).  Useful for integer division and modulus.
   5359      *
   5360      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   5361      *      xor-long
   5362      *
   5363      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   5364      */
   5365     /* binop vAA, vBB, vCC */
   5366     FETCH(a0, 1)                           #  a0 <- CCBB
   5367     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5368     and       a2, a0, 255                  #  a2 <- BB
   5369     srl       a3, a0, 8                    #  a3 <- CC
   5370     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[AA]
   5371     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   5372     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   5373     LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
   5374     LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
   5375     .if 1
   5376     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   5377     beqz      t0, common_errDivideByZero
   5378     .endif
   5379     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5380 
   5381                                   #  optional op
   5382     JAL(__divdi3)                                 #  result <- op, a0-a3 changed
   5383     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5384     STORE64(v0, v1, rOBJ)      #  vAA/vAA+1 <- v0/v1
   5385     GOTO_OPCODE(t0)                        #  jump to next instruction
   5386     /* 14-17 instructions */
   5387 
   5388 
   5389 #else
   5390 /* File: mips/binopWide.S */
   5391     /*
   5392      * Generic 64-bit binary operation.  Provide an "instr" line that
   5393      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   5394      * This could be a MIPS instruction or a function call.  (If the result
   5395      * comes back in a register other than a0, you can override "result".)
   5396      *
   5397      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5398      * vCC (a1).  Useful for integer division and modulus.
   5399      *
   5400      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   5401      *      xor-long
   5402      *
   5403      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   5404      */
   5405     /* binop vAA, vBB, vCC */
   5406     FETCH(a0, 1)                           #  a0 <- CCBB
   5407     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5408     and       a2, a0, 255                  #  a2 <- BB
   5409     srl       a3, a0, 8                    #  a3 <- CC
   5410     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[AA]
   5411     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   5412     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   5413     LOAD64(a1, a0, a2)               #  a0/a1 <- vBB/vBB+1
   5414     LOAD64(a3, a2, t1)               #  a2/a3 <- vCC/vCC+1
   5415     .if 1
   5416     or        t0, a3, a2             #  second arg (a2-a3) is zero?
   5417     beqz      t0, common_errDivideByZero
   5418     .endif
   5419     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5420 
   5421                                   #  optional op
   5422     JAL(__divdi3)                                 #  result <- op, a0-a3 changed
   5423     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5424     STORE64(v1, v0, rOBJ)      #  vAA/vAA+1 <- v1/v0
   5425     GOTO_OPCODE(t0)                        #  jump to next instruction
   5426     /* 14-17 instructions */
   5427 
   5428 
   5429 #endif
   5430 
   5431 /* ------------------------------ */
   5432     .balign 128
   5433 .L_OP_REM_LONG: /* 0x9f */
   5434 /* File: mips/OP_REM_LONG.S */
   5435 /* ldivmod returns quotient in a0/a1 and remainder in a2/a3 */
   5436 #ifdef HAVE_LITTLE_ENDIAN
   5437 /* File: mips/binopWide.S */
   5438     /*
   5439      * Generic 64-bit binary operation.  Provide an "instr" line that
   5440      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   5441      * This could be a MIPS instruction or a function call.  (If the result
   5442      * comes back in a register other than a0, you can override "result".)
   5443      *
   5444      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5445      * vCC (a1).  Useful for integer division and modulus.
   5446      *
   5447      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   5448      *      xor-long
   5449      *
   5450      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   5451      */
   5452     /* binop vAA, vBB, vCC */
   5453     FETCH(a0, 1)                           #  a0 <- CCBB
   5454     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5455     and       a2, a0, 255                  #  a2 <- BB
   5456     srl       a3, a0, 8                    #  a3 <- CC
   5457     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[AA]
   5458     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   5459     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   5460     LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
   5461     LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
   5462     .if 1
   5463     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   5464     beqz      t0, common_errDivideByZero
   5465     .endif
   5466     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5467 
   5468                                   #  optional op
   5469     JAL(__moddi3)                                 #  result <- op, a0-a3 changed
   5470     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5471     STORE64(v0, v1, rOBJ)      #  vAA/vAA+1 <- v0/v1
   5472     GOTO_OPCODE(t0)                        #  jump to next instruction
   5473     /* 14-17 instructions */
   5474 
   5475 
   5476 #else
   5477 /* File: mips/binopWide.S */
   5478     /*
   5479      * Generic 64-bit binary operation.  Provide an "instr" line that
   5480      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   5481      * This could be a MIPS instruction or a function call.  (If the result
   5482      * comes back in a register other than a0, you can override "result".)
   5483      *
   5484      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5485      * vCC (a1).  Useful for integer division and modulus.
   5486      *
   5487      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   5488      *      xor-long
   5489      *
   5490      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   5491      */
   5492     /* binop vAA, vBB, vCC */
   5493     FETCH(a0, 1)                           #  a0 <- CCBB
   5494     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5495     and       a2, a0, 255                  #  a2 <- BB
   5496     srl       a3, a0, 8                    #  a3 <- CC
   5497     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[AA]
   5498     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   5499     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   5500     LOAD64(a1, a0, a2)               #  a0/a1 <- vBB/vBB+1
   5501     LOAD64(a3, a2, t1)               #  a2/a3 <- vCC/vCC+1
   5502     .if 1
   5503     or        t0, a3, a2             #  second arg (a2-a3) is zero?
   5504     beqz      t0, common_errDivideByZero
   5505     .endif
   5506     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5507 
   5508                                   #  optional op
   5509     JAL(__moddi3)                                 #  result <- op, a0-a3 changed
   5510     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5511     STORE64(v1, v0, rOBJ)      #  vAA/vAA+1 <- v1/v0
   5512     GOTO_OPCODE(t0)                        #  jump to next instruction
   5513     /* 14-17 instructions */
   5514 
   5515 
   5516 #endif
   5517 
   5518 /* ------------------------------ */
   5519     .balign 128
   5520 .L_OP_AND_LONG: /* 0xa0 */
   5521 /* File: mips/OP_AND_LONG.S */
   5522 /* File: mips/binopWide.S */
   5523     /*
   5524      * Generic 64-bit binary operation.  Provide an "instr" line that
   5525      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   5526      * This could be a MIPS instruction or a function call.  (If the result
   5527      * comes back in a register other than a0, you can override "result".)
   5528      *
   5529      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5530      * vCC (a1).  Useful for integer division and modulus.
   5531      *
   5532      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   5533      *      xor-long
   5534      *
   5535      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   5536      */
   5537     /* binop vAA, vBB, vCC */
   5538     FETCH(a0, 1)                           #  a0 <- CCBB
   5539     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5540     and       a2, a0, 255                  #  a2 <- BB
   5541     srl       a3, a0, 8                    #  a3 <- CC
   5542     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[AA]
   5543     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   5544     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   5545     LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
   5546     LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
   5547     .if 0
   5548     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   5549     beqz      t0, common_errDivideByZero
   5550     .endif
   5551     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5552 
   5553     and a0, a0, a2                              #  optional op
   5554     and a1, a1, a3                                 #  result <- op, a0-a3 changed
   5555     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5556     STORE64(a0, a1, rOBJ)      #  vAA/vAA+1 <- a0/a1
   5557     GOTO_OPCODE(t0)                        #  jump to next instruction
   5558     /* 14-17 instructions */
   5559 
   5560 
   5561 
   5562 /* ------------------------------ */
   5563     .balign 128
   5564 .L_OP_OR_LONG: /* 0xa1 */
   5565 /* File: mips/OP_OR_LONG.S */
   5566 /* File: mips/binopWide.S */
   5567     /*
   5568      * Generic 64-bit binary operation.  Provide an "instr" line that
   5569      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   5570      * This could be a MIPS instruction or a function call.  (If the result
   5571      * comes back in a register other than a0, you can override "result".)
   5572      *
   5573      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5574      * vCC (a1).  Useful for integer division and modulus.
   5575      *
   5576      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   5577      *      xor-long
   5578      *
   5579      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   5580      */
   5581     /* binop vAA, vBB, vCC */
   5582     FETCH(a0, 1)                           #  a0 <- CCBB
   5583     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5584     and       a2, a0, 255                  #  a2 <- BB
   5585     srl       a3, a0, 8                    #  a3 <- CC
   5586     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[AA]
   5587     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   5588     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   5589     LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
   5590     LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
   5591     .if 0
   5592     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   5593     beqz      t0, common_errDivideByZero
   5594     .endif
   5595     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5596 
   5597     or a0, a0, a2                              #  optional op
   5598     or a1, a1, a3                                 #  result <- op, a0-a3 changed
   5599     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5600     STORE64(a0, a1, rOBJ)      #  vAA/vAA+1 <- a0/a1
   5601     GOTO_OPCODE(t0)                        #  jump to next instruction
   5602     /* 14-17 instructions */
   5603 
   5604 
   5605 
   5606 /* ------------------------------ */
   5607     .balign 128
   5608 .L_OP_XOR_LONG: /* 0xa2 */
   5609 /* File: mips/OP_XOR_LONG.S */
   5610 /* File: mips/binopWide.S */
   5611     /*
   5612      * Generic 64-bit binary operation.  Provide an "instr" line that
   5613      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   5614      * This could be a MIPS instruction or a function call.  (If the result
   5615      * comes back in a register other than a0, you can override "result".)
   5616      *
   5617      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   5618      * vCC (a1).  Useful for integer division and modulus.
   5619      *
   5620      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   5621      *      xor-long
   5622      *
   5623      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   5624      */
   5625     /* binop vAA, vBB, vCC */
   5626     FETCH(a0, 1)                           #  a0 <- CCBB
   5627     GET_OPA(rOBJ)                          #  rOBJ <- AA
   5628     and       a2, a0, 255                  #  a2 <- BB
   5629     srl       a3, a0, 8                    #  a3 <- CC
   5630     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[AA]
   5631     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   5632     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   5633     LOAD64(a0, a1, a2)               #  a0/a1 <- vBB/vBB+1
   5634     LOAD64(a2, a3, t1)               #  a2/a3 <- vCC/vCC+1
   5635     .if 0
   5636     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   5637     beqz      t0, common_errDivideByZero
   5638     .endif
   5639     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5640 
   5641     xor a0, a0, a2                              #  optional op
   5642     xor a1, a1, a3                                 #  result <- op, a0-a3 changed
   5643     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5644     STORE64(a0, a1, rOBJ)      #  vAA/vAA+1 <- a0/a1
   5645     GOTO_OPCODE(t0)                        #  jump to next instruction
   5646     /* 14-17 instructions */
   5647 
   5648 
   5649 
   5650 /* ------------------------------ */
   5651     .balign 128
   5652 .L_OP_SHL_LONG: /* 0xa3 */
   5653 /* File: mips/OP_SHL_LONG.S */
   5654     /*
   5655      * Long integer shift.  This is different from the generic 32/64-bit
   5656      * binary operations because vAA/vBB are 64-bit but vCC (the shift
   5657      * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
   5658      * 6 bits of the shift distance.
   5659      */
   5660     /* shl-long vAA, vBB, vCC */
   5661     FETCH(a0, 1)                           #  a0 <- CCBB
   5662     GET_OPA(t2)                            #  t2 <- AA
   5663     and       a3, a0, 255                  #  a3 <- BB
   5664     srl       a0, a0, 8                    #  a0 <- CC
   5665     EAS2(a3, rFP, a3)                      #  a3 <- &fp[BB]
   5666     GET_VREG(a2, a0)                       #  a2 <- vCC
   5667     LOAD64(a0, a1, a3)                     #  a0/a1 <- vBB/vBB+1
   5668 
   5669     EAS2(t2, rFP, t2)                      #  t2 <- &fp[AA]
   5670     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5671 
   5672     sll     v0, a0, a2                     #  rlo<- alo << (shift&31)
   5673     not     v1, a2                         #  rhi<- 31-shift  (shift is 5b)
   5674     srl     a0, 1
   5675     srl     a0, v1                         #  alo<- alo >> (32-(shift&31))
   5676     sll     v1, a1, a2                     #  rhi<- ahi << (shift&31)
   5677     or      v1, a0                         #  rhi<- rhi | alo
   5678     andi    a2, 0x20                       #  shift< shift & 0x20
   5679     movn    v1, v0, a2                     #  rhi<- rlo (if shift&0x20)
   5680     movn    v0, zero, a2                   #  rlo<- 0  (if shift&0x20)
   5681 
   5682     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5683     STORE64(v0, v1, t2)                    #  vAA/vAA+1 <- a0/a1
   5684     GOTO_OPCODE(t0)                        #  jump to next instruction
   5685 
   5686 
   5687 /* ------------------------------ */
   5688     .balign 128
   5689 .L_OP_SHR_LONG: /* 0xa4 */
   5690 /* File: mips/OP_SHR_LONG.S */
   5691     /*
   5692      * Long integer shift.  This is different from the generic 32/64-bit
   5693      * binary operations because vAA/vBB are 64-bit but vCC (the shift
   5694      * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
   5695      * 6 bits of the shift distance.
   5696      */
   5697     /* shr-long vAA, vBB, vCC */
   5698     FETCH(a0, 1)                           #  a0 <- CCBB
   5699     GET_OPA(t3)                            #  t3 <- AA
   5700     and       a3, a0, 255                  #  a3 <- BB
   5701     srl       a0, a0, 8                    #  a0 <- CC
   5702     EAS2(a3, rFP, a3)                      #  a3 <- &fp[BB]
   5703     GET_VREG(a2, a0)                       #  a2 <- vCC
   5704     LOAD64(a0, a1, a3)                     #  a0/a1 <- vBB/vBB+1
   5705     EAS2(t3, rFP, t3)                      #  t3 <- &fp[AA]
   5706     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5707 
   5708     sra     v1, a1, a2                     #  rhi<- ahi >> (shift&31)
   5709     srl     v0, a0, a2                     #  rlo<- alo >> (shift&31)
   5710     sra     a3, a1, 31                     #  a3<- sign(ah)
   5711     not     a0, a2                         #  alo<- 31-shift (shift is 5b)
   5712     sll     a1, 1
   5713     sll     a1, a0                         #  ahi<- ahi << (32-(shift&31))
   5714     or      v0, a1                         #  rlo<- rlo | ahi
   5715     andi    a2, 0x20                       #  shift & 0x20
   5716     movn    v0, v1, a2                     #  rlo<- rhi (if shift&0x20)
   5717     movn    v1, a3, a2                     #  rhi<- sign(ahi) (if shift&0x20)
   5718 
   5719     STORE64(v0, v1, t3)                    #  vAA/VAA+1 <- v0/v0
   5720     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5721     GOTO_OPCODE(t0)                        #  jump to next instruction
   5722 
   5723 
   5724 /* ------------------------------ */
   5725     .balign 128
   5726 .L_OP_USHR_LONG: /* 0xa5 */
   5727 /* File: mips/OP_USHR_LONG.S */
   5728     /*
   5729      * Long integer shift.  This is different from the generic 32/64-bit
   5730      * binary operations because vAA/vBB are 64-bit but vCC (the shift
   5731      * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
   5732      * 6 bits of the shift distance.
   5733      */
   5734     /* ushr-long vAA, vBB, vCC */
   5735     FETCH(a0, 1)                           #  a0 <- CCBB
   5736     GET_OPA(t0)                            #  t3 <- AA
   5737     and       a3, a0, 255                  #  a3 <- BB
   5738     srl       a0, a0, 8                    #  a0 <- CC
   5739     EAS2(a3, rFP, a3)                      #  a3 <- &fp[BB]
   5740     GET_VREG(a2, a0)                       #  a2 <- vCC
   5741     LOAD64(a0, a1, a3)                     #  a0/a1 <- vBB/vBB+1
   5742     EAS2(rOBJ, rFP, t0)                    #  rOBJ <- &fp[AA]
   5743 
   5744     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5745     srl       v1, a1, a2                   #  rhi<- ahi >> (shift&31)
   5746     srl       v0, a0, a2                   #  rlo<- alo >> (shift&31)
   5747     not       a0, a2                       #  alo<- 31-n  (shift is 5b)
   5748     sll       a1, 1
   5749     sll       a1, a0                       #  ahi<- ahi << (32-(shift&31))
   5750     or        v0, a1                       #  rlo<- rlo | ahi
   5751     andi      a2, 0x20                     #  shift & 0x20
   5752     movn      v0, v1, a2                   #  rlo<- rhi (if shift&0x20)
   5753     movn      v1, zero, a2                 #  rhi<- 0 (if shift&0x20)
   5754 
   5755     STORE64(v0, v1, rOBJ)                  #  vAA/vAA+1 <- v0/v1
   5756     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5757     GOTO_OPCODE(t0)                        #  jump to next instruction
   5758 
   5759 
   5760 /* ------------------------------ */
   5761     .balign 128
   5762 .L_OP_ADD_FLOAT: /* 0xa6 */
   5763 /* File: mips/OP_ADD_FLOAT.S */
   5764 /* File: mips/binflop.S */
   5765     /*
   5766      * Generic 32-bit binary float operation.
   5767      *
   5768      * For: add-fp, sub-fp, mul-fp, div-fp
   5769      */
   5770 
   5771     /* binop vAA, vBB, vCC */
   5772     FETCH(a0, 1)                           #  a0 <- CCBB
   5773     GET_OPA(rOBJ)                          #  s5 <- AA
   5774     srl       a3, a0, 8                    #  a3 <- CC
   5775     and       a2, a0, 255                  #  a2 <- BB
   5776 #ifdef SOFT_FLOAT
   5777     GET_VREG(a1, a3)                       #  a1 <- vCC
   5778     GET_VREG(a0, a2)                       #  a0 <- vBB
   5779     .if 0
   5780     # is second operand zero?
   5781     beqz      a1, common_errDivideByZero
   5782     .endif
   5783 #else
   5784     GET_VREG_F(fa1, a3)                    #  a1 <- vCC
   5785     GET_VREG_F(fa0, a2)                    #  a0 <- vBB
   5786 
   5787     .if 0
   5788     # is second operand zero?
   5789     li.s      ft0, 0
   5790     c.eq.s    fcc0, ft0, fa1               #  condition bit and comparision with 0
   5791     bc1t      fcc0, common_errDivideByZero
   5792     .endif
   5793 #endif
   5794 
   5795     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5796                                   #  optional op
   5797 #ifdef SOFT_FLOAT
   5798     JAL(__addsf3)                                 #  v0 = result
   5799     SET_VREG(v0, rOBJ)                     #  vAA <- v0
   5800 #else
   5801     add.s fv0, fa0, fa1                               #  f0 = result
   5802     SET_VREG_F(fv0, rOBJ)                  #  vAA <- fv0
   5803 #endif
   5804     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5805     GOTO_OPCODE(t0)                        #  jump to next instruction
   5806     /* 11-14 instructions */
   5807 
   5808 
   5809 
   5810 /* ------------------------------ */
   5811     .balign 128
   5812 .L_OP_SUB_FLOAT: /* 0xa7 */
   5813 /* File: mips/OP_SUB_FLOAT.S */
   5814 /* File: mips/binflop.S */
   5815     /*
   5816      * Generic 32-bit binary float operation.
   5817      *
   5818      * For: add-fp, sub-fp, mul-fp, div-fp
   5819      */
   5820 
   5821     /* binop vAA, vBB, vCC */
   5822     FETCH(a0, 1)                           #  a0 <- CCBB
   5823     GET_OPA(rOBJ)                          #  s5 <- AA
   5824     srl       a3, a0, 8                    #  a3 <- CC
   5825     and       a2, a0, 255                  #  a2 <- BB
   5826 #ifdef SOFT_FLOAT
   5827     GET_VREG(a1, a3)                       #  a1 <- vCC
   5828     GET_VREG(a0, a2)                       #  a0 <- vBB
   5829     .if 0
   5830     # is second operand zero?
   5831     beqz      a1, common_errDivideByZero
   5832     .endif
   5833 #else
   5834     GET_VREG_F(fa1, a3)                    #  a1 <- vCC
   5835     GET_VREG_F(fa0, a2)                    #  a0 <- vBB
   5836 
   5837     .if 0
   5838     # is second operand zero?
   5839     li.s      ft0, 0
   5840     c.eq.s    fcc0, ft0, fa1               #  condition bit and comparision with 0
   5841     bc1t      fcc0, common_errDivideByZero
   5842     .endif
   5843 #endif
   5844 
   5845     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5846                                   #  optional op
   5847 #ifdef SOFT_FLOAT
   5848     JAL(__subsf3)                                 #  v0 = result
   5849     SET_VREG(v0, rOBJ)                     #  vAA <- v0
   5850 #else
   5851     sub.s fv0, fa0, fa1                               #  f0 = result
   5852     SET_VREG_F(fv0, rOBJ)                  #  vAA <- fv0
   5853 #endif
   5854     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5855     GOTO_OPCODE(t0)                        #  jump to next instruction
   5856     /* 11-14 instructions */
   5857 
   5858 
   5859 
   5860 /* ------------------------------ */
   5861     .balign 128
   5862 .L_OP_MUL_FLOAT: /* 0xa8 */
   5863 /* File: mips/OP_MUL_FLOAT.S */
   5864 /* File: mips/binflop.S */
   5865     /*
   5866      * Generic 32-bit binary float operation.
   5867      *
   5868      * For: add-fp, sub-fp, mul-fp, div-fp
   5869      */
   5870 
   5871     /* binop vAA, vBB, vCC */
   5872     FETCH(a0, 1)                           #  a0 <- CCBB
   5873     GET_OPA(rOBJ)                          #  s5 <- AA
   5874     srl       a3, a0, 8                    #  a3 <- CC
   5875     and       a2, a0, 255                  #  a2 <- BB
   5876 #ifdef SOFT_FLOAT
   5877     GET_VREG(a1, a3)                       #  a1 <- vCC
   5878     GET_VREG(a0, a2)                       #  a0 <- vBB
   5879     .if 0
   5880     # is second operand zero?
   5881     beqz      a1, common_errDivideByZero
   5882     .endif
   5883 #else
   5884     GET_VREG_F(fa1, a3)                    #  a1 <- vCC
   5885     GET_VREG_F(fa0, a2)                    #  a0 <- vBB
   5886 
   5887     .if 0
   5888     # is second operand zero?
   5889     li.s      ft0, 0
   5890     c.eq.s    fcc0, ft0, fa1               #  condition bit and comparision with 0
   5891     bc1t      fcc0, common_errDivideByZero
   5892     .endif
   5893 #endif
   5894 
   5895     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5896                                   #  optional op
   5897 #ifdef SOFT_FLOAT
   5898     JAL(__mulsf3)                                 #  v0 = result
   5899     SET_VREG(v0, rOBJ)                     #  vAA <- v0
   5900 #else
   5901     mul.s fv0, fa0, fa1                               #  f0 = result
   5902     SET_VREG_F(fv0, rOBJ)                  #  vAA <- fv0
   5903 #endif
   5904     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5905     GOTO_OPCODE(t0)                        #  jump to next instruction
   5906     /* 11-14 instructions */
   5907 
   5908 
   5909 
   5910 /* ------------------------------ */
   5911     .balign 128
   5912 .L_OP_DIV_FLOAT: /* 0xa9 */
   5913 /* File: mips/OP_DIV_FLOAT.S */
   5914 /* File: mips/binflop.S */
   5915     /*
   5916      * Generic 32-bit binary float operation.
   5917      *
   5918      * For: add-fp, sub-fp, mul-fp, div-fp
   5919      */
   5920 
   5921     /* binop vAA, vBB, vCC */
   5922     FETCH(a0, 1)                           #  a0 <- CCBB
   5923     GET_OPA(rOBJ)                          #  s5 <- AA
   5924     srl       a3, a0, 8                    #  a3 <- CC
   5925     and       a2, a0, 255                  #  a2 <- BB
   5926 #ifdef SOFT_FLOAT
   5927     GET_VREG(a1, a3)                       #  a1 <- vCC
   5928     GET_VREG(a0, a2)                       #  a0 <- vBB
   5929     .if 0
   5930     # is second operand zero?
   5931     beqz      a1, common_errDivideByZero
   5932     .endif
   5933 #else
   5934     GET_VREG_F(fa1, a3)                    #  a1 <- vCC
   5935     GET_VREG_F(fa0, a2)                    #  a0 <- vBB
   5936 
   5937     .if 0
   5938     # is second operand zero?
   5939     li.s      ft0, 0
   5940     c.eq.s    fcc0, ft0, fa1               #  condition bit and comparision with 0
   5941     bc1t      fcc0, common_errDivideByZero
   5942     .endif
   5943 #endif
   5944 
   5945     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5946                                   #  optional op
   5947 #ifdef SOFT_FLOAT
   5948     JAL(__divsf3)                                 #  v0 = result
   5949     SET_VREG(v0, rOBJ)                     #  vAA <- v0
   5950 #else
   5951     div.s fv0, fa0, fa1                               #  f0 = result
   5952     SET_VREG_F(fv0, rOBJ)                  #  vAA <- fv0
   5953 #endif
   5954     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   5955     GOTO_OPCODE(t0)                        #  jump to next instruction
   5956     /* 11-14 instructions */
   5957 
   5958 
   5959 
   5960 /* ------------------------------ */
   5961     .balign 128
   5962 .L_OP_REM_FLOAT: /* 0xaa */
   5963 /* File: mips/OP_REM_FLOAT.S */
   5964 /* File: mips/binflop.S */
   5965     /*
   5966      * Generic 32-bit binary float operation.
   5967      *
   5968      * For: add-fp, sub-fp, mul-fp, div-fp
   5969      */
   5970 
   5971     /* binop vAA, vBB, vCC */
   5972     FETCH(a0, 1)                           #  a0 <- CCBB
   5973     GET_OPA(rOBJ)                          #  s5 <- AA
   5974     srl       a3, a0, 8                    #  a3 <- CC
   5975     and       a2, a0, 255                  #  a2 <- BB
   5976 #ifdef SOFT_FLOAT
   5977     GET_VREG(a1, a3)                       #  a1 <- vCC
   5978     GET_VREG(a0, a2)                       #  a0 <- vBB
   5979     .if 0
   5980     # is second operand zero?
   5981     beqz      a1, common_errDivideByZero
   5982     .endif
   5983 #else
   5984     GET_VREG_F(fa1, a3)                    #  a1 <- vCC
   5985     GET_VREG_F(fa0, a2)                    #  a0 <- vBB
   5986 
   5987     .if 0
   5988     # is second operand zero?
   5989     li.s      ft0, 0
   5990     c.eq.s    fcc0, ft0, fa1               #  condition bit and comparision with 0
   5991     bc1t      fcc0, common_errDivideByZero
   5992     .endif
   5993 #endif
   5994 
   5995     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   5996                                   #  optional op
   5997 #ifdef SOFT_FLOAT
   5998     JAL(fmodf)                                 #  v0 = result
   5999     SET_VREG(v0, rOBJ)                     #  vAA <- v0
   6000 #else
   6001     JAL(fmodf)                               #  f0 = result
   6002     SET_VREG_F(fv0, rOBJ)                  #  vAA <- fv0
   6003 #endif
   6004     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6005     GOTO_OPCODE(t0)                        #  jump to next instruction
   6006     /* 11-14 instructions */
   6007 
   6008 
   6009 
   6010 /* ------------------------------ */
   6011     .balign 128
   6012 .L_OP_ADD_DOUBLE: /* 0xab */
   6013 /* File: mips/OP_ADD_DOUBLE.S */
   6014 /* File: mips/binflopWide.S */
   6015     /*
   6016      * Generic 64-bit binary operation.  Provide an "instr" line that
   6017      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   6018      * This could be an MIPS instruction or a function call.
   6019      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6020      * vCC (a1).  Useful for integer division and modulus.
   6021      *
   6022      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   6023      *      xor-long, add-double, sub-double, mul-double, div-double,
   6024      *      rem-double
   6025      *
   6026      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   6027      */
   6028     /* binop vAA, vBB, vCC */
   6029     FETCH(a0, 1)                           #  a0 <- CCBB
   6030     GET_OPA(rOBJ)                          #  s5 <- AA
   6031     and       a2, a0, 255                  #  a2 <- BB
   6032     srl       a3, a0, 8                    #  a3 <- CC
   6033     EAS2(rOBJ, rFP, rOBJ)                  #  s5 <- &fp[AA]
   6034     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   6035     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   6036 #ifdef SOFT_FLOAT
   6037     LOAD64(rARG0, rARG1, a2)               #  a0/a1 <- vBB/vBB+1
   6038     LOAD64(rARG2, rARG3, t1)               #  a2/a3 <- vCC/vCC+1
   6039     .if 0
   6040     or        t0, rARG2, rARG3             #  second arg (a2-a3) is zero?
   6041     beqz      t0, common_errDivideByZero
   6042     .endif
   6043 #else
   6044     LOAD64_F(fa0, fa0f, a2)
   6045     LOAD64_F(fa1, fa1f, t1)
   6046     .if 0
   6047     li.d      ft0, 0
   6048     c.eq.d    fcc0, fa1, ft0
   6049     bc1t      fcc0, common_errDivideByZero
   6050     .endif
   6051 #endif
   6052 1:
   6053     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   6054                                   #  optional op
   6055 #ifdef SOFT_FLOAT
   6056     JAL(__adddf3)                                 #  result <- op, a0-a3 changed
   6057     STORE64(rRESULT0, rRESULT1, rOBJ)
   6058 #else
   6059     add.d fv0, fa0, fa1
   6060     STORE64_F(fv0, fv0f, rOBJ)
   6061 #endif
   6062     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6063     GOTO_OPCODE(t0)                        #  jump to next instruction
   6064     /* 14-17 instructions */
   6065 
   6066 
   6067 
   6068 /* ------------------------------ */
   6069     .balign 128
   6070 .L_OP_SUB_DOUBLE: /* 0xac */
   6071 /* File: mips/OP_SUB_DOUBLE.S */
   6072 /* File: mips/binflopWide.S */
   6073     /*
   6074      * Generic 64-bit binary operation.  Provide an "instr" line that
   6075      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   6076      * This could be an MIPS instruction or a function call.
   6077      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6078      * vCC (a1).  Useful for integer division and modulus.
   6079      *
   6080      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   6081      *      xor-long, add-double, sub-double, mul-double, div-double,
   6082      *      rem-double
   6083      *
   6084      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   6085      */
   6086     /* binop vAA, vBB, vCC */
   6087     FETCH(a0, 1)                           #  a0 <- CCBB
   6088     GET_OPA(rOBJ)                          #  s5 <- AA
   6089     and       a2, a0, 255                  #  a2 <- BB
   6090     srl       a3, a0, 8                    #  a3 <- CC
   6091     EAS2(rOBJ, rFP, rOBJ)                  #  s5 <- &fp[AA]
   6092     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   6093     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   6094 #ifdef SOFT_FLOAT
   6095     LOAD64(rARG0, rARG1, a2)               #  a0/a1 <- vBB/vBB+1
   6096     LOAD64(rARG2, rARG3, t1)               #  a2/a3 <- vCC/vCC+1
   6097     .if 0
   6098     or        t0, rARG2, rARG3             #  second arg (a2-a3) is zero?
   6099     beqz      t0, common_errDivideByZero
   6100     .endif
   6101 #else
   6102     LOAD64_F(fa0, fa0f, a2)
   6103     LOAD64_F(fa1, fa1f, t1)
   6104     .if 0
   6105     li.d      ft0, 0
   6106     c.eq.d    fcc0, fa1, ft0
   6107     bc1t      fcc0, common_errDivideByZero
   6108     .endif
   6109 #endif
   6110 1:
   6111     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   6112                                   #  optional op
   6113 #ifdef SOFT_FLOAT
   6114     JAL(__subdf3)                                 #  result <- op, a0-a3 changed
   6115     STORE64(rRESULT0, rRESULT1, rOBJ)
   6116 #else
   6117     sub.d fv0, fa0, fa1
   6118     STORE64_F(fv0, fv0f, rOBJ)
   6119 #endif
   6120     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6121     GOTO_OPCODE(t0)                        #  jump to next instruction
   6122     /* 14-17 instructions */
   6123 
   6124 
   6125 
   6126 /* ------------------------------ */
   6127     .balign 128
   6128 .L_OP_MUL_DOUBLE: /* 0xad */
   6129 /* File: mips/OP_MUL_DOUBLE.S */
   6130 /* File: mips/binflopWide.S */
   6131     /*
   6132      * Generic 64-bit binary operation.  Provide an "instr" line that
   6133      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   6134      * This could be an MIPS instruction or a function call.
   6135      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6136      * vCC (a1).  Useful for integer division and modulus.
   6137      *
   6138      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   6139      *      xor-long, add-double, sub-double, mul-double, div-double,
   6140      *      rem-double
   6141      *
   6142      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   6143      */
   6144     /* binop vAA, vBB, vCC */
   6145     FETCH(a0, 1)                           #  a0 <- CCBB
   6146     GET_OPA(rOBJ)                          #  s5 <- AA
   6147     and       a2, a0, 255                  #  a2 <- BB
   6148     srl       a3, a0, 8                    #  a3 <- CC
   6149     EAS2(rOBJ, rFP, rOBJ)                  #  s5 <- &fp[AA]
   6150     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   6151     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   6152 #ifdef SOFT_FLOAT
   6153     LOAD64(rARG0, rARG1, a2)               #  a0/a1 <- vBB/vBB+1
   6154     LOAD64(rARG2, rARG3, t1)               #  a2/a3 <- vCC/vCC+1
   6155     .if 0
   6156     or        t0, rARG2, rARG3             #  second arg (a2-a3) is zero?
   6157     beqz      t0, common_errDivideByZero
   6158     .endif
   6159 #else
   6160     LOAD64_F(fa0, fa0f, a2)
   6161     LOAD64_F(fa1, fa1f, t1)
   6162     .if 0
   6163     li.d      ft0, 0
   6164     c.eq.d    fcc0, fa1, ft0
   6165     bc1t      fcc0, common_errDivideByZero
   6166     .endif
   6167 #endif
   6168 1:
   6169     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   6170                                   #  optional op
   6171 #ifdef SOFT_FLOAT
   6172     JAL(__muldf3)                                 #  result <- op, a0-a3 changed
   6173     STORE64(rRESULT0, rRESULT1, rOBJ)
   6174 #else
   6175     mul.d fv0, fa0, fa1
   6176     STORE64_F(fv0, fv0f, rOBJ)
   6177 #endif
   6178     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6179     GOTO_OPCODE(t0)                        #  jump to next instruction
   6180     /* 14-17 instructions */
   6181 
   6182 
   6183 
   6184 /* ------------------------------ */
   6185     .balign 128
   6186 .L_OP_DIV_DOUBLE: /* 0xae */
   6187 /* File: mips/OP_DIV_DOUBLE.S */
   6188 /* File: mips/binflopWide.S */
   6189     /*
   6190      * Generic 64-bit binary operation.  Provide an "instr" line that
   6191      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   6192      * This could be an MIPS instruction or a function call.
   6193      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6194      * vCC (a1).  Useful for integer division and modulus.
   6195      *
   6196      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   6197      *      xor-long, add-double, sub-double, mul-double, div-double,
   6198      *      rem-double
   6199      *
   6200      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   6201      */
   6202     /* binop vAA, vBB, vCC */
   6203     FETCH(a0, 1)                           #  a0 <- CCBB
   6204     GET_OPA(rOBJ)                          #  s5 <- AA
   6205     and       a2, a0, 255                  #  a2 <- BB
   6206     srl       a3, a0, 8                    #  a3 <- CC
   6207     EAS2(rOBJ, rFP, rOBJ)                  #  s5 <- &fp[AA]
   6208     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   6209     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   6210 #ifdef SOFT_FLOAT
   6211     LOAD64(rARG0, rARG1, a2)               #  a0/a1 <- vBB/vBB+1
   6212     LOAD64(rARG2, rARG3, t1)               #  a2/a3 <- vCC/vCC+1
   6213     .if 0
   6214     or        t0, rARG2, rARG3             #  second arg (a2-a3) is zero?
   6215     beqz      t0, common_errDivideByZero
   6216     .endif
   6217 #else
   6218     LOAD64_F(fa0, fa0f, a2)
   6219     LOAD64_F(fa1, fa1f, t1)
   6220     .if 0
   6221     li.d      ft0, 0
   6222     c.eq.d    fcc0, fa1, ft0
   6223     bc1t      fcc0, common_errDivideByZero
   6224     .endif
   6225 #endif
   6226 1:
   6227     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   6228                                   #  optional op
   6229 #ifdef SOFT_FLOAT
   6230     JAL(__divdf3)                                 #  result <- op, a0-a3 changed
   6231     STORE64(rRESULT0, rRESULT1, rOBJ)
   6232 #else
   6233     div.d fv0, fa0, fa1
   6234     STORE64_F(fv0, fv0f, rOBJ)
   6235 #endif
   6236     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6237     GOTO_OPCODE(t0)                        #  jump to next instruction
   6238     /* 14-17 instructions */
   6239 
   6240 
   6241 
   6242 /* ------------------------------ */
   6243     .balign 128
   6244 .L_OP_REM_DOUBLE: /* 0xaf */
   6245 /* File: mips/OP_REM_DOUBLE.S */
   6246 /* File: mips/binflopWide.S */
   6247     /*
   6248      * Generic 64-bit binary operation.  Provide an "instr" line that
   6249      * specifies an instruction that performs "result = a0-a1 op a2-a3".
   6250      * This could be an MIPS instruction or a function call.
   6251      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6252      * vCC (a1).  Useful for integer division and modulus.
   6253      *
   6254      * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
   6255      *      xor-long, add-double, sub-double, mul-double, div-double,
   6256      *      rem-double
   6257      *
   6258      * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
   6259      */
   6260     /* binop vAA, vBB, vCC */
   6261     FETCH(a0, 1)                           #  a0 <- CCBB
   6262     GET_OPA(rOBJ)                          #  s5 <- AA
   6263     and       a2, a0, 255                  #  a2 <- BB
   6264     srl       a3, a0, 8                    #  a3 <- CC
   6265     EAS2(rOBJ, rFP, rOBJ)                  #  s5 <- &fp[AA]
   6266     EAS2(a2, rFP, a2)                      #  a2 <- &fp[BB]
   6267     EAS2(t1, rFP, a3)                      #  a3 <- &fp[CC]
   6268 #ifdef SOFT_FLOAT
   6269     LOAD64(rARG0, rARG1, a2)               #  a0/a1 <- vBB/vBB+1
   6270     LOAD64(rARG2, rARG3, t1)               #  a2/a3 <- vCC/vCC+1
   6271     .if 0
   6272     or        t0, rARG2, rARG3             #  second arg (a2-a3) is zero?
   6273     beqz      t0, common_errDivideByZero
   6274     .endif
   6275 #else
   6276     LOAD64_F(fa0, fa0f, a2)
   6277     LOAD64_F(fa1, fa1f, t1)
   6278     .if 0
   6279     li.d      ft0, 0
   6280     c.eq.d    fcc0, fa1, ft0
   6281     bc1t      fcc0, common_errDivideByZero
   6282     .endif
   6283 #endif
   6284 1:
   6285     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   6286                                   #  optional op
   6287 #ifdef SOFT_FLOAT
   6288     JAL(fmod)                                 #  result <- op, a0-a3 changed
   6289     STORE64(rRESULT0, rRESULT1, rOBJ)
   6290 #else
   6291     JAL(fmod)
   6292     STORE64_F(fv0, fv0f, rOBJ)
   6293 #endif
   6294     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6295     GOTO_OPCODE(t0)                        #  jump to next instruction
   6296     /* 14-17 instructions */
   6297 
   6298 
   6299 
   6300 /* ------------------------------ */
   6301     .balign 128
   6302 .L_OP_ADD_INT_2ADDR: /* 0xb0 */
   6303 /* File: mips/OP_ADD_INT_2ADDR.S */
   6304 /* File: mips/binop2addr.S */
   6305     /*
   6306      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6307      * that specifies an instruction that performs "result = a0 op a1".
   6308      * This could be an MIPS instruction or a function call.
   6309      *
   6310      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6311      * vCC (a1).  Useful for integer division and modulus.
   6312      *
   6313      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6314      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6315      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6316      */
   6317     /* binop/2addr vA, vB */
   6318     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6319     GET_OPB(a3)                            #  a3 <- B
   6320     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6321     GET_VREG(a1, a3)                       #  a1 <- vB
   6322     .if 0
   6323     # is second operand zero?
   6324     beqz      a1, common_errDivideByZero
   6325     .endif
   6326     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6327 
   6328                                   #  optional op
   6329     addu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   6330     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6331     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6332     /* 10-13 instructions */
   6333 
   6334 
   6335 
   6336 /* ------------------------------ */
   6337     .balign 128
   6338 .L_OP_SUB_INT_2ADDR: /* 0xb1 */
   6339 /* File: mips/OP_SUB_INT_2ADDR.S */
   6340 /* File: mips/binop2addr.S */
   6341     /*
   6342      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6343      * that specifies an instruction that performs "result = a0 op a1".
   6344      * This could be an MIPS instruction or a function call.
   6345      *
   6346      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6347      * vCC (a1).  Useful for integer division and modulus.
   6348      *
   6349      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6350      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6351      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6352      */
   6353     /* binop/2addr vA, vB */
   6354     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6355     GET_OPB(a3)                            #  a3 <- B
   6356     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6357     GET_VREG(a1, a3)                       #  a1 <- vB
   6358     .if 0
   6359     # is second operand zero?
   6360     beqz      a1, common_errDivideByZero
   6361     .endif
   6362     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6363 
   6364                                   #  optional op
   6365     subu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   6366     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6367     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6368     /* 10-13 instructions */
   6369 
   6370 
   6371 
   6372 /* ------------------------------ */
   6373     .balign 128
   6374 .L_OP_MUL_INT_2ADDR: /* 0xb2 */
   6375 /* File: mips/OP_MUL_INT_2ADDR.S */
   6376 /* File: mips/binop2addr.S */
   6377     /*
   6378      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6379      * that specifies an instruction that performs "result = a0 op a1".
   6380      * This could be an MIPS instruction or a function call.
   6381      *
   6382      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6383      * vCC (a1).  Useful for integer division and modulus.
   6384      *
   6385      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6386      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6387      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6388      */
   6389     /* binop/2addr vA, vB */
   6390     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6391     GET_OPB(a3)                            #  a3 <- B
   6392     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6393     GET_VREG(a1, a3)                       #  a1 <- vB
   6394     .if 0
   6395     # is second operand zero?
   6396     beqz      a1, common_errDivideByZero
   6397     .endif
   6398     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6399 
   6400                                   #  optional op
   6401     mul a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   6402     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6403     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6404     /* 10-13 instructions */
   6405 
   6406 
   6407 
   6408 /* ------------------------------ */
   6409     .balign 128
   6410 .L_OP_DIV_INT_2ADDR: /* 0xb3 */
   6411 /* File: mips/OP_DIV_INT_2ADDR.S */
   6412 /* File: mips/binop2addr.S */
   6413     /*
   6414      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6415      * that specifies an instruction that performs "result = a0 op a1".
   6416      * This could be an MIPS instruction or a function call.
   6417      *
   6418      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6419      * vCC (a1).  Useful for integer division and modulus.
   6420      *
   6421      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6422      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6423      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6424      */
   6425     /* binop/2addr vA, vB */
   6426     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6427     GET_OPB(a3)                            #  a3 <- B
   6428     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6429     GET_VREG(a1, a3)                       #  a1 <- vB
   6430     .if 1
   6431     # is second operand zero?
   6432     beqz      a1, common_errDivideByZero
   6433     .endif
   6434     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6435 
   6436                                   #  optional op
   6437     div zero, a0, a1; mflo a0                                 #  a0 <- op, a0-a3 changed
   6438     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6439     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6440     /* 10-13 instructions */
   6441 
   6442 
   6443 
   6444 /* ------------------------------ */
   6445     .balign 128
   6446 .L_OP_REM_INT_2ADDR: /* 0xb4 */
   6447 /* File: mips/OP_REM_INT_2ADDR.S */
   6448 /* File: mips/binop2addr.S */
   6449     /*
   6450      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6451      * that specifies an instruction that performs "result = a0 op a1".
   6452      * This could be an MIPS instruction or a function call.
   6453      *
   6454      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6455      * vCC (a1).  Useful for integer division and modulus.
   6456      *
   6457      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6458      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6459      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6460      */
   6461     /* binop/2addr vA, vB */
   6462     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6463     GET_OPB(a3)                            #  a3 <- B
   6464     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6465     GET_VREG(a1, a3)                       #  a1 <- vB
   6466     .if 1
   6467     # is second operand zero?
   6468     beqz      a1, common_errDivideByZero
   6469     .endif
   6470     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6471 
   6472                                   #  optional op
   6473     div zero, a0, a1; mfhi a0                                 #  a0 <- op, a0-a3 changed
   6474     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6475     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6476     /* 10-13 instructions */
   6477 
   6478 
   6479 
   6480 /* ------------------------------ */
   6481     .balign 128
   6482 .L_OP_AND_INT_2ADDR: /* 0xb5 */
   6483 /* File: mips/OP_AND_INT_2ADDR.S */
   6484 /* File: mips/binop2addr.S */
   6485     /*
   6486      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6487      * that specifies an instruction that performs "result = a0 op a1".
   6488      * This could be an MIPS instruction or a function call.
   6489      *
   6490      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6491      * vCC (a1).  Useful for integer division and modulus.
   6492      *
   6493      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6494      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6495      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6496      */
   6497     /* binop/2addr vA, vB */
   6498     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6499     GET_OPB(a3)                            #  a3 <- B
   6500     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6501     GET_VREG(a1, a3)                       #  a1 <- vB
   6502     .if 0
   6503     # is second operand zero?
   6504     beqz      a1, common_errDivideByZero
   6505     .endif
   6506     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6507 
   6508                                   #  optional op
   6509     and a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   6510     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6511     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6512     /* 10-13 instructions */
   6513 
   6514 
   6515 
   6516 /* ------------------------------ */
   6517     .balign 128
   6518 .L_OP_OR_INT_2ADDR: /* 0xb6 */
   6519 /* File: mips/OP_OR_INT_2ADDR.S */
   6520 /* File: mips/binop2addr.S */
   6521     /*
   6522      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6523      * that specifies an instruction that performs "result = a0 op a1".
   6524      * This could be an MIPS instruction or a function call.
   6525      *
   6526      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6527      * vCC (a1).  Useful for integer division and modulus.
   6528      *
   6529      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6530      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6531      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6532      */
   6533     /* binop/2addr vA, vB */
   6534     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6535     GET_OPB(a3)                            #  a3 <- B
   6536     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6537     GET_VREG(a1, a3)                       #  a1 <- vB
   6538     .if 0
   6539     # is second operand zero?
   6540     beqz      a1, common_errDivideByZero
   6541     .endif
   6542     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6543 
   6544                                   #  optional op
   6545     or a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   6546     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6547     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6548     /* 10-13 instructions */
   6549 
   6550 
   6551 
   6552 /* ------------------------------ */
   6553     .balign 128
   6554 .L_OP_XOR_INT_2ADDR: /* 0xb7 */
   6555 /* File: mips/OP_XOR_INT_2ADDR.S */
   6556 /* File: mips/binop2addr.S */
   6557     /*
   6558      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6559      * that specifies an instruction that performs "result = a0 op a1".
   6560      * This could be an MIPS instruction or a function call.
   6561      *
   6562      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6563      * vCC (a1).  Useful for integer division and modulus.
   6564      *
   6565      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6566      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6567      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6568      */
   6569     /* binop/2addr vA, vB */
   6570     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6571     GET_OPB(a3)                            #  a3 <- B
   6572     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6573     GET_VREG(a1, a3)                       #  a1 <- vB
   6574     .if 0
   6575     # is second operand zero?
   6576     beqz      a1, common_errDivideByZero
   6577     .endif
   6578     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6579 
   6580                                   #  optional op
   6581     xor a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   6582     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6583     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6584     /* 10-13 instructions */
   6585 
   6586 
   6587 
   6588 /* ------------------------------ */
   6589     .balign 128
   6590 .L_OP_SHL_INT_2ADDR: /* 0xb8 */
   6591 /* File: mips/OP_SHL_INT_2ADDR.S */
   6592 /* File: mips/binop2addr.S */
   6593     /*
   6594      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6595      * that specifies an instruction that performs "result = a0 op a1".
   6596      * This could be an MIPS instruction or a function call.
   6597      *
   6598      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6599      * vCC (a1).  Useful for integer division and modulus.
   6600      *
   6601      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6602      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6603      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6604      */
   6605     /* binop/2addr vA, vB */
   6606     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6607     GET_OPB(a3)                            #  a3 <- B
   6608     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6609     GET_VREG(a1, a3)                       #  a1 <- vB
   6610     .if 0
   6611     # is second operand zero?
   6612     beqz      a1, common_errDivideByZero
   6613     .endif
   6614     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6615 
   6616     and a1, a1, 31                              #  optional op
   6617     sll a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   6618     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6619     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6620     /* 10-13 instructions */
   6621 
   6622 
   6623 
   6624 /* ------------------------------ */
   6625     .balign 128
   6626 .L_OP_SHR_INT_2ADDR: /* 0xb9 */
   6627 /* File: mips/OP_SHR_INT_2ADDR.S */
   6628 /* File: mips/binop2addr.S */
   6629     /*
   6630      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6631      * that specifies an instruction that performs "result = a0 op a1".
   6632      * This could be an MIPS instruction or a function call.
   6633      *
   6634      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6635      * vCC (a1).  Useful for integer division and modulus.
   6636      *
   6637      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6638      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6639      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6640      */
   6641     /* binop/2addr vA, vB */
   6642     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6643     GET_OPB(a3)                            #  a3 <- B
   6644     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6645     GET_VREG(a1, a3)                       #  a1 <- vB
   6646     .if 0
   6647     # is second operand zero?
   6648     beqz      a1, common_errDivideByZero
   6649     .endif
   6650     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6651 
   6652     and a1, a1, 31                              #  optional op
   6653     sra a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   6654     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6655     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6656     /* 10-13 instructions */
   6657 
   6658 
   6659 
   6660 /* ------------------------------ */
   6661     .balign 128
   6662 .L_OP_USHR_INT_2ADDR: /* 0xba */
   6663 /* File: mips/OP_USHR_INT_2ADDR.S */
   6664 /* File: mips/binop2addr.S */
   6665     /*
   6666      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
   6667      * that specifies an instruction that performs "result = a0 op a1".
   6668      * This could be an MIPS instruction or a function call.
   6669      *
   6670      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6671      * vCC (a1).  Useful for integer division and modulus.
   6672      *
   6673      * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
   6674      *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
   6675      *      shl-int/2addr, shr-int/2addr, ushr-int/2addr
   6676      */
   6677     /* binop/2addr vA, vB */
   6678     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6679     GET_OPB(a3)                            #  a3 <- B
   6680     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   6681     GET_VREG(a1, a3)                       #  a1 <- vB
   6682     .if 0
   6683     # is second operand zero?
   6684     beqz      a1, common_errDivideByZero
   6685     .endif
   6686     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6687 
   6688     and a1, a1, 31                              #  optional op
   6689     srl a0, a0, a1                                  #  a0 <- op, a0-a3 changed
   6690     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6691     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   6692     /* 10-13 instructions */
   6693 
   6694 
   6695 
   6696 /* ------------------------------ */
   6697     .balign 128
   6698 .L_OP_ADD_LONG_2ADDR: /* 0xbb */
   6699 /* File: mips/OP_ADD_LONG_2ADDR.S */
   6700 /*
   6701  *See OP_ADD_LONG.S for details
   6702  */
   6703 /* File: mips/binopWide2addr.S */
   6704     /*
   6705      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   6706      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   6707      * This could be a MIPS instruction or a function call.  (If the result
   6708      * comes back in a register other than a0, you can override "result".)
   6709      *
   6710      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6711      * vCC (a1).  Useful for integer division and modulus.
   6712      *
   6713      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   6714      *      and-long/2addr, or-long/2addr, xor-long/2addr
   6715      *      rem-double/2addr
   6716      */
   6717     /* binop/2addr vA, vB */
   6718     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6719     GET_OPB(a1)                            #  a1 <- B
   6720     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   6721     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   6722     LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
   6723     LOAD64(a0, a1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   6724     .if 0
   6725     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   6726     beqz      t0, common_errDivideByZero
   6727     .endif
   6728     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6729 
   6730     addu v0, a2, a0                              #  optional op
   6731     addu a1, a3, a1; sltu v1, v0, a2; addu v1, v1, a1                                 #  result <- op, a0-a3 changed
   6732     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6733     STORE64(v0, v1, rOBJ)      #  vAA/vAA+1 <- v0/v1
   6734     GOTO_OPCODE(t0)                        #  jump to next instruction
   6735     /* 12-15 instructions */
   6736 
   6737 
   6738 
   6739 /* ------------------------------ */
   6740     .balign 128
   6741 .L_OP_SUB_LONG_2ADDR: /* 0xbc */
   6742 /* File: mips/OP_SUB_LONG_2ADDR.S */
   6743 /*
   6744  * See comments in OP_SUB_LONG.S
   6745  */
   6746 /* File: mips/binopWide2addr.S */
   6747     /*
   6748      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   6749      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   6750      * This could be a MIPS instruction or a function call.  (If the result
   6751      * comes back in a register other than a0, you can override "result".)
   6752      *
   6753      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6754      * vCC (a1).  Useful for integer division and modulus.
   6755      *
   6756      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   6757      *      and-long/2addr, or-long/2addr, xor-long/2addr
   6758      *      rem-double/2addr
   6759      */
   6760     /* binop/2addr vA, vB */
   6761     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6762     GET_OPB(a1)                            #  a1 <- B
   6763     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   6764     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   6765     LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
   6766     LOAD64(a0, a1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   6767     .if 0
   6768     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   6769     beqz      t0, common_errDivideByZero
   6770     .endif
   6771     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6772 
   6773     subu v0, a0, a2                              #  optional op
   6774     subu v1, a1, a3; sltu a0, a0, v0; subu v1, v1, a0                                 #  result <- op, a0-a3 changed
   6775     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6776     STORE64(v0, v1, rOBJ)      #  vAA/vAA+1 <- v0/v1
   6777     GOTO_OPCODE(t0)                        #  jump to next instruction
   6778     /* 12-15 instructions */
   6779 
   6780 
   6781 
   6782 /* ------------------------------ */
   6783     .balign 128
   6784 .L_OP_MUL_LONG_2ADDR: /* 0xbd */
   6785 /* File: mips/OP_MUL_LONG_2ADDR.S */
   6786     /*
   6787      * See comments in OP_MUL_LONG.S
   6788      */
   6789     /* mul-long/2addr vA, vB */
   6790     GET_OPA4(t0)                           #  t0 <- A+
   6791 
   6792     EAS2(t0, rFP, t0)                      #  t0 <- &fp[A]
   6793     LOAD64(a0, a1, t0)                     #  vAA.low / high
   6794 
   6795     GET_OPB(t1)                            #  t1 <- B
   6796     EAS2(t1, rFP, t1)                      #  t1 <- &fp[B]
   6797     LOAD64(a2, a3, t1)                     #  vBB.low / high
   6798 
   6799     mul       v1, a3, a0                   #  v1= a3a0
   6800     multu     a2, a0
   6801     mfhi      t1
   6802     mflo      v0                           #  v0= a2a0
   6803     mul       t2, a2, a1                   #  t2= a2a1
   6804     addu      v1, v1, t1                   #  v1= a3a0 + hi(a2a0)
   6805     addu      v1, v1, t2                   #  v1= v1 + a2a1;
   6806 
   6807     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6808     GET_INST_OPCODE(t1)                    #  extract opcode from rINST
   6809     # vAA <- v0 (low)
   6810     STORE64(v0, v1, t0)                    #  vAA+1 <- v1 (high)
   6811     GOTO_OPCODE(t1)                        #  jump to next instruction
   6812 
   6813 
   6814 /* ------------------------------ */
   6815     .balign 128
   6816 .L_OP_DIV_LONG_2ADDR: /* 0xbe */
   6817 /* File: mips/OP_DIV_LONG_2ADDR.S */
   6818 #ifdef HAVE_LITTLE_ENDIAN
   6819 /* File: mips/binopWide2addr.S */
   6820     /*
   6821      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   6822      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   6823      * This could be a MIPS instruction or a function call.  (If the result
   6824      * comes back in a register other than a0, you can override "result".)
   6825      *
   6826      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6827      * vCC (a1).  Useful for integer division and modulus.
   6828      *
   6829      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   6830      *      and-long/2addr, or-long/2addr, xor-long/2addr
   6831      *      rem-double/2addr
   6832      */
   6833     /* binop/2addr vA, vB */
   6834     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6835     GET_OPB(a1)                            #  a1 <- B
   6836     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   6837     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   6838     LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
   6839     LOAD64(a0, a1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   6840     .if 1
   6841     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   6842     beqz      t0, common_errDivideByZero
   6843     .endif
   6844     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6845 
   6846                                   #  optional op
   6847     JAL(__divdi3)                                 #  result <- op, a0-a3 changed
   6848     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6849     STORE64(v0, v1, rOBJ)      #  vAA/vAA+1 <- v0/v1
   6850     GOTO_OPCODE(t0)                        #  jump to next instruction
   6851     /* 12-15 instructions */
   6852 
   6853 
   6854 #else
   6855 /* File: mips/binopWide2addr.S */
   6856     /*
   6857      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   6858      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   6859      * This could be a MIPS instruction or a function call.  (If the result
   6860      * comes back in a register other than a0, you can override "result".)
   6861      *
   6862      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6863      * vCC (a1).  Useful for integer division and modulus.
   6864      *
   6865      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   6866      *      and-long/2addr, or-long/2addr, xor-long/2addr
   6867      *      rem-double/2addr
   6868      */
   6869     /* binop/2addr vA, vB */
   6870     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6871     GET_OPB(a1)                            #  a1 <- B
   6872     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   6873     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   6874     LOAD64(a3, a2, a1)               #  a2/a3 <- vBB/vBB+1
   6875     LOAD64(a1, a0, rOBJ)             #  a0/a1 <- vAA/vAA+1
   6876     .if 1
   6877     or        t0, a3, a2             #  second arg (a2-a3) is zero?
   6878     beqz      t0, common_errDivideByZero
   6879     .endif
   6880     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6881 
   6882                                   #  optional op
   6883     JAL(__divdi3)                                 #  result <- op, a0-a3 changed
   6884     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6885     STORE64(v1, v0, rOBJ)      #  vAA/vAA+1 <- v1/v0
   6886     GOTO_OPCODE(t0)                        #  jump to next instruction
   6887     /* 12-15 instructions */
   6888 
   6889 
   6890 #endif
   6891 
   6892 /* ------------------------------ */
   6893     .balign 128
   6894 .L_OP_REM_LONG_2ADDR: /* 0xbf */
   6895 /* File: mips/OP_REM_LONG_2ADDR.S */
   6896 #ifdef HAVE_LITTLE_ENDIAN
   6897 /* File: mips/binopWide2addr.S */
   6898     /*
   6899      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   6900      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   6901      * This could be a MIPS instruction or a function call.  (If the result
   6902      * comes back in a register other than a0, you can override "result".)
   6903      *
   6904      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6905      * vCC (a1).  Useful for integer division and modulus.
   6906      *
   6907      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   6908      *      and-long/2addr, or-long/2addr, xor-long/2addr
   6909      *      rem-double/2addr
   6910      */
   6911     /* binop/2addr vA, vB */
   6912     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6913     GET_OPB(a1)                            #  a1 <- B
   6914     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   6915     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   6916     LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
   6917     LOAD64(a0, a1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   6918     .if 1
   6919     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   6920     beqz      t0, common_errDivideByZero
   6921     .endif
   6922     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6923 
   6924                                   #  optional op
   6925     JAL(__moddi3)                                 #  result <- op, a0-a3 changed
   6926     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6927     STORE64(v0, v1, rOBJ)      #  vAA/vAA+1 <- v0/v1
   6928     GOTO_OPCODE(t0)                        #  jump to next instruction
   6929     /* 12-15 instructions */
   6930 
   6931 
   6932 #else
   6933 /* File: mips/binopWide2addr.S */
   6934     /*
   6935      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   6936      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   6937      * This could be a MIPS instruction or a function call.  (If the result
   6938      * comes back in a register other than a0, you can override "result".)
   6939      *
   6940      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6941      * vCC (a1).  Useful for integer division and modulus.
   6942      *
   6943      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   6944      *      and-long/2addr, or-long/2addr, xor-long/2addr
   6945      *      rem-double/2addr
   6946      */
   6947     /* binop/2addr vA, vB */
   6948     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6949     GET_OPB(a1)                            #  a1 <- B
   6950     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   6951     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   6952     LOAD64(a3, a2, a1)               #  a2/a3 <- vBB/vBB+1
   6953     LOAD64(a1, a0, rOBJ)             #  a0/a1 <- vAA/vAA+1
   6954     .if 1
   6955     or        t0, a3, a2             #  second arg (a2-a3) is zero?
   6956     beqz      t0, common_errDivideByZero
   6957     .endif
   6958     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   6959 
   6960                                   #  optional op
   6961     JAL(__moddi3)                                 #  result <- op, a0-a3 changed
   6962     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   6963     STORE64(v1, v0, rOBJ)      #  vAA/vAA+1 <- v1/v0
   6964     GOTO_OPCODE(t0)                        #  jump to next instruction
   6965     /* 12-15 instructions */
   6966 
   6967 
   6968 #endif
   6969 
   6970 /* ------------------------------ */
   6971     .balign 128
   6972 .L_OP_AND_LONG_2ADDR: /* 0xc0 */
   6973 /* File: mips/OP_AND_LONG_2ADDR.S */
   6974 /* File: mips/binopWide2addr.S */
   6975     /*
   6976      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   6977      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   6978      * This could be a MIPS instruction or a function call.  (If the result
   6979      * comes back in a register other than a0, you can override "result".)
   6980      *
   6981      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   6982      * vCC (a1).  Useful for integer division and modulus.
   6983      *
   6984      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   6985      *      and-long/2addr, or-long/2addr, xor-long/2addr
   6986      *      rem-double/2addr
   6987      */
   6988     /* binop/2addr vA, vB */
   6989     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   6990     GET_OPB(a1)                            #  a1 <- B
   6991     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   6992     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   6993     LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
   6994     LOAD64(a0, a1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   6995     .if 0
   6996     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   6997     beqz      t0, common_errDivideByZero
   6998     .endif
   6999     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7000 
   7001     and a0, a0, a2                              #  optional op
   7002     and a1, a1, a3                                 #  result <- op, a0-a3 changed
   7003     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7004     STORE64(a0, a1, rOBJ)      #  vAA/vAA+1 <- a0/a1
   7005     GOTO_OPCODE(t0)                        #  jump to next instruction
   7006     /* 12-15 instructions */
   7007 
   7008 
   7009 
   7010 /* ------------------------------ */
   7011     .balign 128
   7012 .L_OP_OR_LONG_2ADDR: /* 0xc1 */
   7013 /* File: mips/OP_OR_LONG_2ADDR.S */
   7014 /* File: mips/binopWide2addr.S */
   7015     /*
   7016      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   7017      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   7018      * This could be a MIPS instruction or a function call.  (If the result
   7019      * comes back in a register other than a0, you can override "result".)
   7020      *
   7021      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7022      * vCC (a1).  Useful for integer division and modulus.
   7023      *
   7024      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   7025      *      and-long/2addr, or-long/2addr, xor-long/2addr
   7026      *      rem-double/2addr
   7027      */
   7028     /* binop/2addr vA, vB */
   7029     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   7030     GET_OPB(a1)                            #  a1 <- B
   7031     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   7032     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   7033     LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
   7034     LOAD64(a0, a1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   7035     .if 0
   7036     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   7037     beqz      t0, common_errDivideByZero
   7038     .endif
   7039     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7040 
   7041     or a0, a0, a2                              #  optional op
   7042     or a1, a1, a3                                 #  result <- op, a0-a3 changed
   7043     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7044     STORE64(a0, a1, rOBJ)      #  vAA/vAA+1 <- a0/a1
   7045     GOTO_OPCODE(t0)                        #  jump to next instruction
   7046     /* 12-15 instructions */
   7047 
   7048 
   7049 
   7050 /* ------------------------------ */
   7051     .balign 128
   7052 .L_OP_XOR_LONG_2ADDR: /* 0xc2 */
   7053 /* File: mips/OP_XOR_LONG_2ADDR.S */
   7054 /* File: mips/binopWide2addr.S */
   7055     /*
   7056      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   7057      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   7058      * This could be a MIPS instruction or a function call.  (If the result
   7059      * comes back in a register other than a0, you can override "result".)
   7060      *
   7061      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7062      * vCC (a1).  Useful for integer division and modulus.
   7063      *
   7064      * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
   7065      *      and-long/2addr, or-long/2addr, xor-long/2addr
   7066      *      rem-double/2addr
   7067      */
   7068     /* binop/2addr vA, vB */
   7069     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   7070     GET_OPB(a1)                            #  a1 <- B
   7071     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   7072     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   7073     LOAD64(a2, a3, a1)               #  a2/a3 <- vBB/vBB+1
   7074     LOAD64(a0, a1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   7075     .if 0
   7076     or        t0, a2, a3             #  second arg (a2-a3) is zero?
   7077     beqz      t0, common_errDivideByZero
   7078     .endif
   7079     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7080 
   7081     xor a0, a0, a2                              #  optional op
   7082     xor a1, a1, a3                                 #  result <- op, a0-a3 changed
   7083     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7084     STORE64(a0, a1, rOBJ)      #  vAA/vAA+1 <- a0/a1
   7085     GOTO_OPCODE(t0)                        #  jump to next instruction
   7086     /* 12-15 instructions */
   7087 
   7088 
   7089 
   7090 /* ------------------------------ */
   7091     .balign 128
   7092 .L_OP_SHL_LONG_2ADDR: /* 0xc3 */
   7093 /* File: mips/OP_SHL_LONG_2ADDR.S */
   7094     /*
   7095      * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
   7096      * 32-bit shift distance.
   7097      */
   7098     /* shl-long/2addr vA, vB */
   7099     GET_OPA4(t2)                           #  t2 <- A+
   7100     GET_OPB(a3)                            #  a3 <- B
   7101     GET_VREG(a2, a3)                       #  a2 <- vB
   7102     EAS2(rOBJ, rFP, t2)                    #  rOBJ <- &fp[A]
   7103     LOAD64(a0, a1, rOBJ)                   #  a0/a1 <- vAA/vAA+1
   7104 
   7105     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7106 
   7107     sll     v0, a0, a2                     #  rlo<- alo << (shift&31)
   7108     not     v1, a2                         #  rhi<- 31-shift  (shift is 5b)
   7109     srl     a0, 1
   7110     srl     a0, v1                         #  alo<- alo >> (32-(shift&31))
   7111     sll     v1, a1, a2                     #  rhi<- ahi << (shift&31)
   7112     or      v1, a0                         #  rhi<- rhi | alo
   7113     andi    a2, 0x20                       #  shift< shift & 0x20
   7114     movn    v1, v0, a2                     #  rhi<- rlo (if shift&0x20)
   7115     movn    v0, zero, a2                   #  rlo<- 0  (if shift&0x20)
   7116 
   7117     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7118     STORE64(v0, v1, rOBJ)                  #  vAA/vAA+1 <- a0/a1
   7119     GOTO_OPCODE(t0)                        #  jump to next instruction
   7120 
   7121 
   7122 /* ------------------------------ */
   7123     .balign 128
   7124 .L_OP_SHR_LONG_2ADDR: /* 0xc4 */
   7125 /* File: mips/OP_SHR_LONG_2ADDR.S */
   7126     /*
   7127      * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
   7128      * 32-bit shift distance.
   7129      */
   7130     /* shr-long/2addr vA, vB */
   7131     GET_OPA4(t2)                           #  t2 <- A+
   7132     GET_OPB(a3)                            #  a3 <- B
   7133     GET_VREG(a2, a3)                       #  a2 <- vB
   7134     EAS2(t2, rFP, t2)                      #  t2 <- &fp[A]
   7135     LOAD64(a0, a1, t2)                     #  a0/a1 <- vAA/vAA+1
   7136     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7137 
   7138     sra     v1, a1, a2                     #  rhi<- ahi >> (shift&31)
   7139     srl     v0, a0, a2                     #  rlo<- alo >> (shift&31)
   7140     sra     a3, a1, 31                     #  a3<- sign(ah)
   7141     not     a0, a2                         #  alo<- 31-shift (shift is 5b)
   7142     sll     a1, 1
   7143     sll     a1, a0                         #  ahi<- ahi << (32-(shift&31))
   7144     or      v0, a1                         #  rlo<- rlo | ahi
   7145     andi    a2, 0x20                       #  shift & 0x20
   7146     movn    v0, v1, a2                     #  rlo<- rhi (if shift&0x20)
   7147     movn    v1, a3, a2                     #  rhi<- sign(ahi) (if shift&0x20)
   7148 
   7149     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7150     STORE64(v0, v1, t2)                    #  vAA/vAA+1 <- a0/a1
   7151     GOTO_OPCODE(t0)                        #  jump to next instruction
   7152 
   7153 
   7154 /* ------------------------------ */
   7155     .balign 128
   7156 .L_OP_USHR_LONG_2ADDR: /* 0xc5 */
   7157 /* File: mips/OP_USHR_LONG_2ADDR.S */
   7158     /*
   7159      * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
   7160      * 32-bit shift distance.
   7161      */
   7162     /* ushr-long/2addr vA, vB */
   7163     GET_OPA4(t3)                           #  t3 <- A+
   7164     GET_OPB(a3)                            #  a3 <- B
   7165     GET_VREG(a2, a3)                       #  a2 <- vB
   7166     EAS2(t3, rFP, t3)                      #  t3 <- &fp[A]
   7167     LOAD64(a0, a1, t3)                     #  a0/a1 <- vAA/vAA+1
   7168 
   7169     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7170     srl       v1, a1, a2                   #  rhi<- ahi >> (shift&31)
   7171     srl       v0, a0, a2                   #  rlo<- alo >> (shift&31)
   7172     not       a0, a2                       #  alo<- 31-n  (shift is 5b)
   7173     sll       a1, 1
   7174     sll       a1, a0                       #  ahi<- ahi << (32-(shift&31))
   7175     or        v0, a1                       #  rlo<- rlo | ahi
   7176     andi      a2, 0x20                     #  shift & 0x20
   7177     movn      v0, v1, a2                   #  rlo<- rhi (if shift&0x20)
   7178     movn      v1, zero, a2                 #  rhi<- 0 (if shift&0x20)
   7179 
   7180     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7181     STORE64(v0, v1, t3)                    #  vAA/vAA+1 <- a0/a1
   7182     GOTO_OPCODE(t0)                        #  jump to next instruction
   7183 
   7184 
   7185 /* ------------------------------ */
   7186     .balign 128
   7187 .L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
   7188 /* File: mips/OP_ADD_FLOAT_2ADDR.S */
   7189 /* File: mips/binflop2addr.S */
   7190     /*
   7191      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" and
   7192      * "instr_f" line
   7193      * that specifies an instruction that performs "result = a0 op a1".
   7194      * This could be an MIPS instruction or a function call.
   7195      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7196      * vCC (a1).  Useful for integer division and modulus.
   7197      *
   7198      * For: add-float/2addr, sub-float/2addr, mul-float/2addr,
   7199      * div-float/2addr, rem-float/2addr
   7200      */
   7201     /* binop/2addr vA, vB */
   7202     GET_OPA4(rOBJ)                         #  t1 <- A+
   7203     GET_OPB(a3)                            #  a3 <- B
   7204 #ifdef SOFT_FLOAT
   7205     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   7206     GET_VREG(a1, a3)                       #  a1 <- vB
   7207     .if 0
   7208     # is second operand zero?
   7209     beqz      a1, common_errDivideByZero
   7210     .endif
   7211 #else
   7212     GET_VREG_F(fa0, rOBJ)
   7213     GET_VREG_F(fa1, a3)
   7214     .if 0
   7215     # is second operand zero?
   7216     li.s      ft0, 0
   7217     c.eq.s    fcc0, ft0, fa1
   7218     bc1t      fcc0, common_errDivideByZero
   7219     .endif
   7220 #endif
   7221     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7222                                   #  optional op
   7223 #ifdef SOFT_FLOAT
   7224     JAL(__addsf3)                                 #  result <- op, a0-a3 changed
   7225     SET_VREG(v0, rOBJ)                     #  vAA <- result
   7226 #else
   7227     add.s fv0, fa0, fa1
   7228     SET_VREG_F(fv0, rOBJ)                  #  vAA <- result
   7229 #endif
   7230     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7231     GOTO_OPCODE(t0)                        #  jump to next instruction
   7232     /* 10-13 instructions */
   7233 
   7234 
   7235 
   7236 /* ------------------------------ */
   7237     .balign 128
   7238 .L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
   7239 /* File: mips/OP_SUB_FLOAT_2ADDR.S */
   7240 /* File: mips/binflop2addr.S */
   7241     /*
   7242      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" and
   7243      * "instr_f" line
   7244      * that specifies an instruction that performs "result = a0 op a1".
   7245      * This could be an MIPS instruction or a function call.
   7246      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7247      * vCC (a1).  Useful for integer division and modulus.
   7248      *
   7249      * For: add-float/2addr, sub-float/2addr, mul-float/2addr,
   7250      * div-float/2addr, rem-float/2addr
   7251      */
   7252     /* binop/2addr vA, vB */
   7253     GET_OPA4(rOBJ)                         #  t1 <- A+
   7254     GET_OPB(a3)                            #  a3 <- B
   7255 #ifdef SOFT_FLOAT
   7256     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   7257     GET_VREG(a1, a3)                       #  a1 <- vB
   7258     .if 0
   7259     # is second operand zero?
   7260     beqz      a1, common_errDivideByZero
   7261     .endif
   7262 #else
   7263     GET_VREG_F(fa0, rOBJ)
   7264     GET_VREG_F(fa1, a3)
   7265     .if 0
   7266     # is second operand zero?
   7267     li.s      ft0, 0
   7268     c.eq.s    fcc0, ft0, fa1
   7269     bc1t      fcc0, common_errDivideByZero
   7270     .endif
   7271 #endif
   7272     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7273                                   #  optional op
   7274 #ifdef SOFT_FLOAT
   7275     JAL(__subsf3)                                 #  result <- op, a0-a3 changed
   7276     SET_VREG(v0, rOBJ)                     #  vAA <- result
   7277 #else
   7278     sub.s fv0, fa0, fa1
   7279     SET_VREG_F(fv0, rOBJ)                  #  vAA <- result
   7280 #endif
   7281     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7282     GOTO_OPCODE(t0)                        #  jump to next instruction
   7283     /* 10-13 instructions */
   7284 
   7285 
   7286 
   7287 /* ------------------------------ */
   7288     .balign 128
   7289 .L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
   7290 /* File: mips/OP_MUL_FLOAT_2ADDR.S */
   7291 /* File: mips/binflop2addr.S */
   7292     /*
   7293      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" and
   7294      * "instr_f" line
   7295      * that specifies an instruction that performs "result = a0 op a1".
   7296      * This could be an MIPS instruction or a function call.
   7297      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7298      * vCC (a1).  Useful for integer division and modulus.
   7299      *
   7300      * For: add-float/2addr, sub-float/2addr, mul-float/2addr,
   7301      * div-float/2addr, rem-float/2addr
   7302      */
   7303     /* binop/2addr vA, vB */
   7304     GET_OPA4(rOBJ)                         #  t1 <- A+
   7305     GET_OPB(a3)                            #  a3 <- B
   7306 #ifdef SOFT_FLOAT
   7307     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   7308     GET_VREG(a1, a3)                       #  a1 <- vB
   7309     .if 0
   7310     # is second operand zero?
   7311     beqz      a1, common_errDivideByZero
   7312     .endif
   7313 #else
   7314     GET_VREG_F(fa0, rOBJ)
   7315     GET_VREG_F(fa1, a3)
   7316     .if 0
   7317     # is second operand zero?
   7318     li.s      ft0, 0
   7319     c.eq.s    fcc0, ft0, fa1
   7320     bc1t      fcc0, common_errDivideByZero
   7321     .endif
   7322 #endif
   7323     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7324                                   #  optional op
   7325 #ifdef SOFT_FLOAT
   7326     JAL(__mulsf3)                                 #  result <- op, a0-a3 changed
   7327     SET_VREG(v0, rOBJ)                     #  vAA <- result
   7328 #else
   7329     mul.s fv0, fa0, fa1
   7330     SET_VREG_F(fv0, rOBJ)                  #  vAA <- result
   7331 #endif
   7332     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7333     GOTO_OPCODE(t0)                        #  jump to next instruction
   7334     /* 10-13 instructions */
   7335 
   7336 
   7337 
   7338 /* ------------------------------ */
   7339     .balign 128
   7340 .L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
   7341 /* File: mips/OP_DIV_FLOAT_2ADDR.S */
   7342 /* File: mips/binflop2addr.S */
   7343     /*
   7344      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" and
   7345      * "instr_f" line
   7346      * that specifies an instruction that performs "result = a0 op a1".
   7347      * This could be an MIPS instruction or a function call.
   7348      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7349      * vCC (a1).  Useful for integer division and modulus.
   7350      *
   7351      * For: add-float/2addr, sub-float/2addr, mul-float/2addr,
   7352      * div-float/2addr, rem-float/2addr
   7353      */
   7354     /* binop/2addr vA, vB */
   7355     GET_OPA4(rOBJ)                         #  t1 <- A+
   7356     GET_OPB(a3)                            #  a3 <- B
   7357 #ifdef SOFT_FLOAT
   7358     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   7359     GET_VREG(a1, a3)                       #  a1 <- vB
   7360     .if 0
   7361     # is second operand zero?
   7362     beqz      a1, common_errDivideByZero
   7363     .endif
   7364 #else
   7365     GET_VREG_F(fa0, rOBJ)
   7366     GET_VREG_F(fa1, a3)
   7367     .if 0
   7368     # is second operand zero?
   7369     li.s      ft0, 0
   7370     c.eq.s    fcc0, ft0, fa1
   7371     bc1t      fcc0, common_errDivideByZero
   7372     .endif
   7373 #endif
   7374     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7375                                   #  optional op
   7376 #ifdef SOFT_FLOAT
   7377     JAL(__divsf3)                                 #  result <- op, a0-a3 changed
   7378     SET_VREG(v0, rOBJ)                     #  vAA <- result
   7379 #else
   7380     div.s fv0, fa0, fa1
   7381     SET_VREG_F(fv0, rOBJ)                  #  vAA <- result
   7382 #endif
   7383     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7384     GOTO_OPCODE(t0)                        #  jump to next instruction
   7385     /* 10-13 instructions */
   7386 
   7387 
   7388 
   7389 /* ------------------------------ */
   7390     .balign 128
   7391 .L_OP_REM_FLOAT_2ADDR: /* 0xca */
   7392 /* File: mips/OP_REM_FLOAT_2ADDR.S */
   7393 /* File: mips/binflop2addr.S */
   7394     /*
   7395      * Generic 32-bit "/2addr" binary operation.  Provide an "instr" and
   7396      * "instr_f" line
   7397      * that specifies an instruction that performs "result = a0 op a1".
   7398      * This could be an MIPS instruction or a function call.
   7399      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7400      * vCC (a1).  Useful for integer division and modulus.
   7401      *
   7402      * For: add-float/2addr, sub-float/2addr, mul-float/2addr,
   7403      * div-float/2addr, rem-float/2addr
   7404      */
   7405     /* binop/2addr vA, vB */
   7406     GET_OPA4(rOBJ)                         #  t1 <- A+
   7407     GET_OPB(a3)                            #  a3 <- B
   7408 #ifdef SOFT_FLOAT
   7409     GET_VREG(a0, rOBJ)                     #  a0 <- vA
   7410     GET_VREG(a1, a3)                       #  a1 <- vB
   7411     .if 0
   7412     # is second operand zero?
   7413     beqz      a1, common_errDivideByZero
   7414     .endif
   7415 #else
   7416     GET_VREG_F(fa0, rOBJ)
   7417     GET_VREG_F(fa1, a3)
   7418     .if 0
   7419     # is second operand zero?
   7420     li.s      ft0, 0
   7421     c.eq.s    fcc0, ft0, fa1
   7422     bc1t      fcc0, common_errDivideByZero
   7423     .endif
   7424 #endif
   7425     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7426                                   #  optional op
   7427 #ifdef SOFT_FLOAT
   7428     JAL(fmodf)                                 #  result <- op, a0-a3 changed
   7429     SET_VREG(v0, rOBJ)                     #  vAA <- result
   7430 #else
   7431     JAL(fmodf)
   7432     SET_VREG_F(fv0, rOBJ)                  #  vAA <- result
   7433 #endif
   7434     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7435     GOTO_OPCODE(t0)                        #  jump to next instruction
   7436     /* 10-13 instructions */
   7437 
   7438 
   7439 
   7440 /* ------------------------------ */
   7441     .balign 128
   7442 .L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
   7443 /* File: mips/OP_ADD_DOUBLE_2ADDR.S */
   7444 /* File: mips/binflopWide2addr.S */
   7445     /*
   7446      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   7447      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   7448      * This could be an MIPS instruction or a function call.
   7449      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7450      * vCC (a1).  Useful for integer division and modulus.
   7451      *
   7452      * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
   7453      *  div-double/2addr, rem-double/2addr
   7454      */
   7455     /* binop/2addr vA, vB */
   7456     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   7457     GET_OPB(a1)                            #  a1 <- B
   7458     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   7459     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   7460 #ifdef SOFT_FLOAT
   7461     LOAD64(rARG2, rARG3, a1)               #  a2/a3 <- vBB/vBB+1
   7462     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   7463     .if 0
   7464     or        t0, rARG2, rARG3             #  second arg (a2-a3) is zero?
   7465     beqz      t0, common_errDivideByZero
   7466     .endif
   7467 #else
   7468     LOAD64_F(fa0, fa0f, rOBJ)
   7469     LOAD64_F(fa1, fa1f, a1)
   7470     .if 0
   7471     li.d      ft0, 0
   7472     c.eq.d    fcc0, fa1, ft0
   7473     bc1t      fcc0, common_errDivideByZero
   7474     .endif
   7475 #endif
   7476 1:
   7477     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7478                                   #  optional op
   7479 #ifdef SOFT_FLOAT
   7480     JAL(__adddf3)                                 #  result <- op, a0-a3 changed
   7481     STORE64(rRESULT0, rRESULT1, rOBJ)
   7482 #else
   7483     add.d fv0, fa0, fa1
   7484     STORE64_F(fv0, fv0f, rOBJ)
   7485 #endif
   7486     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7487     GOTO_OPCODE(t0)                        #  jump to next instruction
   7488     /* 12-15 instructions */
   7489 
   7490 
   7491 
   7492 /* ------------------------------ */
   7493     .balign 128
   7494 .L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
   7495 /* File: mips/OP_SUB_DOUBLE_2ADDR.S */
   7496 /* File: mips/binflopWide2addr.S */
   7497     /*
   7498      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   7499      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   7500      * This could be an MIPS instruction or a function call.
   7501      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7502      * vCC (a1).  Useful for integer division and modulus.
   7503      *
   7504      * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
   7505      *  div-double/2addr, rem-double/2addr
   7506      */
   7507     /* binop/2addr vA, vB */
   7508     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   7509     GET_OPB(a1)                            #  a1 <- B
   7510     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   7511     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   7512 #ifdef SOFT_FLOAT
   7513     LOAD64(rARG2, rARG3, a1)               #  a2/a3 <- vBB/vBB+1
   7514     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   7515     .if 0
   7516     or        t0, rARG2, rARG3             #  second arg (a2-a3) is zero?
   7517     beqz      t0, common_errDivideByZero
   7518     .endif
   7519 #else
   7520     LOAD64_F(fa0, fa0f, rOBJ)
   7521     LOAD64_F(fa1, fa1f, a1)
   7522     .if 0
   7523     li.d      ft0, 0
   7524     c.eq.d    fcc0, fa1, ft0
   7525     bc1t      fcc0, common_errDivideByZero
   7526     .endif
   7527 #endif
   7528 1:
   7529     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7530                                   #  optional op
   7531 #ifdef SOFT_FLOAT
   7532     JAL(__subdf3)                                 #  result <- op, a0-a3 changed
   7533     STORE64(rRESULT0, rRESULT1, rOBJ)
   7534 #else
   7535     sub.d fv0, fa0, fa1
   7536     STORE64_F(fv0, fv0f, rOBJ)
   7537 #endif
   7538     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7539     GOTO_OPCODE(t0)                        #  jump to next instruction
   7540     /* 12-15 instructions */
   7541 
   7542 
   7543 
   7544 /* ------------------------------ */
   7545     .balign 128
   7546 .L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
   7547 /* File: mips/OP_MUL_DOUBLE_2ADDR.S */
   7548 /* File: mips/binflopWide2addr.S */
   7549     /*
   7550      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   7551      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   7552      * This could be an MIPS instruction or a function call.
   7553      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7554      * vCC (a1).  Useful for integer division and modulus.
   7555      *
   7556      * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
   7557      *  div-double/2addr, rem-double/2addr
   7558      */
   7559     /* binop/2addr vA, vB */
   7560     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   7561     GET_OPB(a1)                            #  a1 <- B
   7562     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   7563     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   7564 #ifdef SOFT_FLOAT
   7565     LOAD64(rARG2, rARG3, a1)               #  a2/a3 <- vBB/vBB+1
   7566     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   7567     .if 0
   7568     or        t0, rARG2, rARG3             #  second arg (a2-a3) is zero?
   7569     beqz      t0, common_errDivideByZero
   7570     .endif
   7571 #else
   7572     LOAD64_F(fa0, fa0f, rOBJ)
   7573     LOAD64_F(fa1, fa1f, a1)
   7574     .if 0
   7575     li.d      ft0, 0
   7576     c.eq.d    fcc0, fa1, ft0
   7577     bc1t      fcc0, common_errDivideByZero
   7578     .endif
   7579 #endif
   7580 1:
   7581     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7582                                   #  optional op
   7583 #ifdef SOFT_FLOAT
   7584     JAL(__muldf3)                                 #  result <- op, a0-a3 changed
   7585     STORE64(rRESULT0, rRESULT1, rOBJ)
   7586 #else
   7587     mul.d fv0, fa0, fa1
   7588     STORE64_F(fv0, fv0f, rOBJ)
   7589 #endif
   7590     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7591     GOTO_OPCODE(t0)                        #  jump to next instruction
   7592     /* 12-15 instructions */
   7593 
   7594 
   7595 
   7596 /* ------------------------------ */
   7597     .balign 128
   7598 .L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
   7599 /* File: mips/OP_DIV_DOUBLE_2ADDR.S */
   7600 /* File: mips/binflopWide2addr.S */
   7601     /*
   7602      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   7603      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   7604      * This could be an MIPS instruction or a function call.
   7605      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7606      * vCC (a1).  Useful for integer division and modulus.
   7607      *
   7608      * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
   7609      *  div-double/2addr, rem-double/2addr
   7610      */
   7611     /* binop/2addr vA, vB */
   7612     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   7613     GET_OPB(a1)                            #  a1 <- B
   7614     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   7615     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   7616 #ifdef SOFT_FLOAT
   7617     LOAD64(rARG2, rARG3, a1)               #  a2/a3 <- vBB/vBB+1
   7618     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   7619     .if 0
   7620     or        t0, rARG2, rARG3             #  second arg (a2-a3) is zero?
   7621     beqz      t0, common_errDivideByZero
   7622     .endif
   7623 #else
   7624     LOAD64_F(fa0, fa0f, rOBJ)
   7625     LOAD64_F(fa1, fa1f, a1)
   7626     .if 0
   7627     li.d      ft0, 0
   7628     c.eq.d    fcc0, fa1, ft0
   7629     bc1t      fcc0, common_errDivideByZero
   7630     .endif
   7631 #endif
   7632 1:
   7633     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7634                                   #  optional op
   7635 #ifdef SOFT_FLOAT
   7636     JAL(__divdf3)                                 #  result <- op, a0-a3 changed
   7637     STORE64(rRESULT0, rRESULT1, rOBJ)
   7638 #else
   7639     div.d fv0, fa0, fa1
   7640     STORE64_F(fv0, fv0f, rOBJ)
   7641 #endif
   7642     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7643     GOTO_OPCODE(t0)                        #  jump to next instruction
   7644     /* 12-15 instructions */
   7645 
   7646 
   7647 
   7648 /* ------------------------------ */
   7649     .balign 128
   7650 .L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
   7651 /* File: mips/OP_REM_DOUBLE_2ADDR.S */
   7652 /* File: mips/binflopWide2addr.S */
   7653     /*
   7654      * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
   7655      * that specifies an instruction that performs "result = a0-a1 op a2-a3".
   7656      * This could be an MIPS instruction or a function call.
   7657      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7658      * vCC (a1).  Useful for integer division and modulus.
   7659      *
   7660      * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
   7661      *  div-double/2addr, rem-double/2addr
   7662      */
   7663     /* binop/2addr vA, vB */
   7664     GET_OPA4(rOBJ)                         #  rOBJ <- A+
   7665     GET_OPB(a1)                            #  a1 <- B
   7666     EAS2(a1, rFP, a1)                      #  a1 <- &fp[B]
   7667     EAS2(rOBJ, rFP, rOBJ)                  #  rOBJ <- &fp[A]
   7668 #ifdef SOFT_FLOAT
   7669     LOAD64(rARG2, rARG3, a1)               #  a2/a3 <- vBB/vBB+1
   7670     LOAD64(rARG0, rARG1, rOBJ)             #  a0/a1 <- vAA/vAA+1
   7671     .if 0
   7672     or        t0, rARG2, rARG3             #  second arg (a2-a3) is zero?
   7673     beqz      t0, common_errDivideByZero
   7674     .endif
   7675 #else
   7676     LOAD64_F(fa0, fa0f, rOBJ)
   7677     LOAD64_F(fa1, fa1f, a1)
   7678     .if 0
   7679     li.d      ft0, 0
   7680     c.eq.d    fcc0, fa1, ft0
   7681     bc1t      fcc0, common_errDivideByZero
   7682     .endif
   7683 #endif
   7684 1:
   7685     FETCH_ADVANCE_INST(1)                  #  advance rPC, load rINST
   7686                                   #  optional op
   7687 #ifdef SOFT_FLOAT
   7688     JAL(fmod)                                 #  result <- op, a0-a3 changed
   7689     STORE64(rRESULT0, rRESULT1, rOBJ)
   7690 #else
   7691     JAL(fmod)
   7692     STORE64_F(fv0, fv0f, rOBJ)
   7693 #endif
   7694     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7695     GOTO_OPCODE(t0)                        #  jump to next instruction
   7696     /* 12-15 instructions */
   7697 
   7698 
   7699 
   7700 /* ------------------------------ */
   7701     .balign 128
   7702 .L_OP_ADD_INT_LIT16: /* 0xd0 */
   7703 /* File: mips/OP_ADD_INT_LIT16.S */
   7704 /* File: mips/binopLit16.S */
   7705     /*
   7706      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   7707      * that specifies an instruction that performs "result = a0 op a1".
   7708      * This could be an MIPS instruction or a function call.  (If the result
   7709      * comes back in a register other than a0, you can override "result".)
   7710      *
   7711      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7712      * vCC (a1).  Useful for integer division and modulus.
   7713      *
   7714      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   7715      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   7716      */
   7717     # binop/lit16 vA, vB,                  /* +CCCC */
   7718     FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
   7719     GET_OPB(a2)                            #  a2 <- B
   7720     GET_OPA(rOBJ)                          #  rOBJ <- A+
   7721     GET_VREG(a0, a2)                       #  a0 <- vB
   7722     and       rOBJ, rOBJ, 15
   7723     .if 0
   7724     # cmp a1, 0; is second operand zero?
   7725     beqz      a1, common_errDivideByZero
   7726     .endif
   7727     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   7728 
   7729     addu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   7730     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7731     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   7732     /* 10-13 instructions */
   7733 
   7734 
   7735 
   7736 /* ------------------------------ */
   7737     .balign 128
   7738 .L_OP_RSUB_INT: /* 0xd1 */
   7739 /* File: mips/OP_RSUB_INT.S */
   7740 /* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
   7741 /* File: mips/binopLit16.S */
   7742     /*
   7743      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   7744      * that specifies an instruction that performs "result = a0 op a1".
   7745      * This could be an MIPS instruction or a function call.  (If the result
   7746      * comes back in a register other than a0, you can override "result".)
   7747      *
   7748      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7749      * vCC (a1).  Useful for integer division and modulus.
   7750      *
   7751      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   7752      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   7753      */
   7754     # binop/lit16 vA, vB,                  /* +CCCC */
   7755     FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
   7756     GET_OPB(a2)                            #  a2 <- B
   7757     GET_OPA(rOBJ)                          #  rOBJ <- A+
   7758     GET_VREG(a0, a2)                       #  a0 <- vB
   7759     and       rOBJ, rOBJ, 15
   7760     .if 0
   7761     # cmp a1, 0; is second operand zero?
   7762     beqz      a1, common_errDivideByZero
   7763     .endif
   7764     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   7765 
   7766     subu a0, a1, a0                                 #  a0 <- op, a0-a3 changed
   7767     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7768     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   7769     /* 10-13 instructions */
   7770 
   7771 
   7772 
   7773 /* ------------------------------ */
   7774     .balign 128
   7775 .L_OP_MUL_INT_LIT16: /* 0xd2 */
   7776 /* File: mips/OP_MUL_INT_LIT16.S */
   7777 /* File: mips/binopLit16.S */
   7778     /*
   7779      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   7780      * that specifies an instruction that performs "result = a0 op a1".
   7781      * This could be an MIPS instruction or a function call.  (If the result
   7782      * comes back in a register other than a0, you can override "result".)
   7783      *
   7784      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7785      * vCC (a1).  Useful for integer division and modulus.
   7786      *
   7787      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   7788      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   7789      */
   7790     # binop/lit16 vA, vB,                  /* +CCCC */
   7791     FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
   7792     GET_OPB(a2)                            #  a2 <- B
   7793     GET_OPA(rOBJ)                          #  rOBJ <- A+
   7794     GET_VREG(a0, a2)                       #  a0 <- vB
   7795     and       rOBJ, rOBJ, 15
   7796     .if 0
   7797     # cmp a1, 0; is second operand zero?
   7798     beqz      a1, common_errDivideByZero
   7799     .endif
   7800     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   7801 
   7802     mul a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   7803     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7804     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   7805     /* 10-13 instructions */
   7806 
   7807 
   7808 
   7809 /* ------------------------------ */
   7810     .balign 128
   7811 .L_OP_DIV_INT_LIT16: /* 0xd3 */
   7812 /* File: mips/OP_DIV_INT_LIT16.S */
   7813 /* File: mips/binopLit16.S */
   7814     /*
   7815      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   7816      * that specifies an instruction that performs "result = a0 op a1".
   7817      * This could be an MIPS instruction or a function call.  (If the result
   7818      * comes back in a register other than a0, you can override "result".)
   7819      *
   7820      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7821      * vCC (a1).  Useful for integer division and modulus.
   7822      *
   7823      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   7824      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   7825      */
   7826     # binop/lit16 vA, vB,                  /* +CCCC */
   7827     FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
   7828     GET_OPB(a2)                            #  a2 <- B
   7829     GET_OPA(rOBJ)                          #  rOBJ <- A+
   7830     GET_VREG(a0, a2)                       #  a0 <- vB
   7831     and       rOBJ, rOBJ, 15
   7832     .if 1
   7833     # cmp a1, 0; is second operand zero?
   7834     beqz      a1, common_errDivideByZero
   7835     .endif
   7836     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   7837 
   7838     div zero, a0, a1; mflo a0                                 #  a0 <- op, a0-a3 changed
   7839     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7840     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   7841     /* 10-13 instructions */
   7842 
   7843 
   7844 
   7845 /* ------------------------------ */
   7846     .balign 128
   7847 .L_OP_REM_INT_LIT16: /* 0xd4 */
   7848 /* File: mips/OP_REM_INT_LIT16.S */
   7849 /* File: mips/binopLit16.S */
   7850     /*
   7851      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   7852      * that specifies an instruction that performs "result = a0 op a1".
   7853      * This could be an MIPS instruction or a function call.  (If the result
   7854      * comes back in a register other than a0, you can override "result".)
   7855      *
   7856      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7857      * vCC (a1).  Useful for integer division and modulus.
   7858      *
   7859      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   7860      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   7861      */
   7862     # binop/lit16 vA, vB,                  /* +CCCC */
   7863     FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
   7864     GET_OPB(a2)                            #  a2 <- B
   7865     GET_OPA(rOBJ)                          #  rOBJ <- A+
   7866     GET_VREG(a0, a2)                       #  a0 <- vB
   7867     and       rOBJ, rOBJ, 15
   7868     .if 1
   7869     # cmp a1, 0; is second operand zero?
   7870     beqz      a1, common_errDivideByZero
   7871     .endif
   7872     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   7873 
   7874     div zero, a0, a1; mfhi a0                                 #  a0 <- op, a0-a3 changed
   7875     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7876     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   7877     /* 10-13 instructions */
   7878 
   7879 
   7880 
   7881 /* ------------------------------ */
   7882     .balign 128
   7883 .L_OP_AND_INT_LIT16: /* 0xd5 */
   7884 /* File: mips/OP_AND_INT_LIT16.S */
   7885 /* File: mips/binopLit16.S */
   7886     /*
   7887      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   7888      * that specifies an instruction that performs "result = a0 op a1".
   7889      * This could be an MIPS instruction or a function call.  (If the result
   7890      * comes back in a register other than a0, you can override "result".)
   7891      *
   7892      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7893      * vCC (a1).  Useful for integer division and modulus.
   7894      *
   7895      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   7896      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   7897      */
   7898     # binop/lit16 vA, vB,                  /* +CCCC */
   7899     FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
   7900     GET_OPB(a2)                            #  a2 <- B
   7901     GET_OPA(rOBJ)                          #  rOBJ <- A+
   7902     GET_VREG(a0, a2)                       #  a0 <- vB
   7903     and       rOBJ, rOBJ, 15
   7904     .if 0
   7905     # cmp a1, 0; is second operand zero?
   7906     beqz      a1, common_errDivideByZero
   7907     .endif
   7908     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   7909 
   7910     and a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   7911     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7912     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   7913     /* 10-13 instructions */
   7914 
   7915 
   7916 
   7917 /* ------------------------------ */
   7918     .balign 128
   7919 .L_OP_OR_INT_LIT16: /* 0xd6 */
   7920 /* File: mips/OP_OR_INT_LIT16.S */
   7921 /* File: mips/binopLit16.S */
   7922     /*
   7923      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   7924      * that specifies an instruction that performs "result = a0 op a1".
   7925      * This could be an MIPS instruction or a function call.  (If the result
   7926      * comes back in a register other than a0, you can override "result".)
   7927      *
   7928      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7929      * vCC (a1).  Useful for integer division and modulus.
   7930      *
   7931      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   7932      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   7933      */
   7934     # binop/lit16 vA, vB,                  /* +CCCC */
   7935     FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
   7936     GET_OPB(a2)                            #  a2 <- B
   7937     GET_OPA(rOBJ)                          #  rOBJ <- A+
   7938     GET_VREG(a0, a2)                       #  a0 <- vB
   7939     and       rOBJ, rOBJ, 15
   7940     .if 0
   7941     # cmp a1, 0; is second operand zero?
   7942     beqz      a1, common_errDivideByZero
   7943     .endif
   7944     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   7945 
   7946     or a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   7947     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7948     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   7949     /* 10-13 instructions */
   7950 
   7951 
   7952 
   7953 /* ------------------------------ */
   7954     .balign 128
   7955 .L_OP_XOR_INT_LIT16: /* 0xd7 */
   7956 /* File: mips/OP_XOR_INT_LIT16.S */
   7957 /* File: mips/binopLit16.S */
   7958     /*
   7959      * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
   7960      * that specifies an instruction that performs "result = a0 op a1".
   7961      * This could be an MIPS instruction or a function call.  (If the result
   7962      * comes back in a register other than a0, you can override "result".)
   7963      *
   7964      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   7965      * vCC (a1).  Useful for integer division and modulus.
   7966      *
   7967      * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
   7968      *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
   7969      */
   7970     # binop/lit16 vA, vB,                  /* +CCCC */
   7971     FETCH_S(a1, 1)                         #  a1 <- ssssCCCC (sign-extended)
   7972     GET_OPB(a2)                            #  a2 <- B
   7973     GET_OPA(rOBJ)                          #  rOBJ <- A+
   7974     GET_VREG(a0, a2)                       #  a0 <- vB
   7975     and       rOBJ, rOBJ, 15
   7976     .if 0
   7977     # cmp a1, 0; is second operand zero?
   7978     beqz      a1, common_errDivideByZero
   7979     .endif
   7980     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   7981 
   7982     xor a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   7983     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   7984     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   7985     /* 10-13 instructions */
   7986 
   7987 
   7988 
   7989 /* ------------------------------ */
   7990     .balign 128
   7991 .L_OP_ADD_INT_LIT8: /* 0xd8 */
   7992 /* File: mips/OP_ADD_INT_LIT8.S */
   7993 /* File: mips/binopLit8.S */
   7994     /*
   7995      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   7996      * that specifies an instruction that performs "result = a0 op a1".
   7997      * This could be an MIPS instruction or a function call.  (If the result
   7998      * comes back in a register other than a0, you can override "result".)
   7999      *
   8000      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8001      * vCC (a1).  Useful for integer division and modulus.
   8002      *
   8003      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8004      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8005      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8006      */
   8007     # binop/lit8 vAA, vBB,                 /* +CC */
   8008     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8009     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8010     and       a2, a3, 255                  #  a2 <- BB
   8011     GET_VREG(a0, a2)                       #  a0 <- vBB
   8012     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8013     .if 0
   8014     # is second operand zero?
   8015     beqz      a1, common_errDivideByZero
   8016     .endif
   8017     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8018 
   8019                                   #  optional op
   8020     addu a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   8021     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8022     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8023     /* 10-12 instructions */
   8024 
   8025 
   8026 
   8027 /* ------------------------------ */
   8028     .balign 128
   8029 .L_OP_RSUB_INT_LIT8: /* 0xd9 */
   8030 /* File: mips/OP_RSUB_INT_LIT8.S */
   8031 /* File: mips/binopLit8.S */
   8032     /*
   8033      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   8034      * that specifies an instruction that performs "result = a0 op a1".
   8035      * This could be an MIPS instruction or a function call.  (If the result
   8036      * comes back in a register other than a0, you can override "result".)
   8037      *
   8038      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8039      * vCC (a1).  Useful for integer division and modulus.
   8040      *
   8041      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8042      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8043      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8044      */
   8045     # binop/lit8 vAA, vBB,                 /* +CC */
   8046     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8047     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8048     and       a2, a3, 255                  #  a2 <- BB
   8049     GET_VREG(a0, a2)                       #  a0 <- vBB
   8050     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8051     .if 0
   8052     # is second operand zero?
   8053     beqz      a1, common_errDivideByZero
   8054     .endif
   8055     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8056 
   8057                                   #  optional op
   8058     subu a0, a1, a0                                 #  a0 <- op, a0-a3 changed
   8059     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8060     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8061     /* 10-12 instructions */
   8062 
   8063 
   8064 
   8065 /* ------------------------------ */
   8066     .balign 128
   8067 .L_OP_MUL_INT_LIT8: /* 0xda */
   8068 /* File: mips/OP_MUL_INT_LIT8.S */
   8069 /* File: mips/binopLit8.S */
   8070     /*
   8071      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   8072      * that specifies an instruction that performs "result = a0 op a1".
   8073      * This could be an MIPS instruction or a function call.  (If the result
   8074      * comes back in a register other than a0, you can override "result".)
   8075      *
   8076      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8077      * vCC (a1).  Useful for integer division and modulus.
   8078      *
   8079      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8080      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8081      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8082      */
   8083     # binop/lit8 vAA, vBB,                 /* +CC */
   8084     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8085     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8086     and       a2, a3, 255                  #  a2 <- BB
   8087     GET_VREG(a0, a2)                       #  a0 <- vBB
   8088     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8089     .if 0
   8090     # is second operand zero?
   8091     beqz      a1, common_errDivideByZero
   8092     .endif
   8093     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8094 
   8095                                   #  optional op
   8096     mul a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   8097     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8098     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8099     /* 10-12 instructions */
   8100 
   8101 
   8102 
   8103 /* ------------------------------ */
   8104     .balign 128
   8105 .L_OP_DIV_INT_LIT8: /* 0xdb */
   8106 /* File: mips/OP_DIV_INT_LIT8.S */
   8107 /* File: mips/binopLit8.S */
   8108     /*
   8109      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   8110      * that specifies an instruction that performs "result = a0 op a1".
   8111      * This could be an MIPS instruction or a function call.  (If the result
   8112      * comes back in a register other than a0, you can override "result".)
   8113      *
   8114      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8115      * vCC (a1).  Useful for integer division and modulus.
   8116      *
   8117      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8118      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8119      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8120      */
   8121     # binop/lit8 vAA, vBB,                 /* +CC */
   8122     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8123     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8124     and       a2, a3, 255                  #  a2 <- BB
   8125     GET_VREG(a0, a2)                       #  a0 <- vBB
   8126     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8127     .if 1
   8128     # is second operand zero?
   8129     beqz      a1, common_errDivideByZero
   8130     .endif
   8131     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8132 
   8133                                   #  optional op
   8134     div zero, a0, a1; mflo a0                                 #  a0 <- op, a0-a3 changed
   8135     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8136     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8137     /* 10-12 instructions */
   8138 
   8139 
   8140 
   8141 /* ------------------------------ */
   8142     .balign 128
   8143 .L_OP_REM_INT_LIT8: /* 0xdc */
   8144 /* File: mips/OP_REM_INT_LIT8.S */
   8145 /* File: mips/binopLit8.S */
   8146     /*
   8147      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   8148      * that specifies an instruction that performs "result = a0 op a1".
   8149      * This could be an MIPS instruction or a function call.  (If the result
   8150      * comes back in a register other than a0, you can override "result".)
   8151      *
   8152      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8153      * vCC (a1).  Useful for integer division and modulus.
   8154      *
   8155      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8156      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8157      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8158      */
   8159     # binop/lit8 vAA, vBB,                 /* +CC */
   8160     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8161     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8162     and       a2, a3, 255                  #  a2 <- BB
   8163     GET_VREG(a0, a2)                       #  a0 <- vBB
   8164     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8165     .if 1
   8166     # is second operand zero?
   8167     beqz      a1, common_errDivideByZero
   8168     .endif
   8169     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8170 
   8171                                   #  optional op
   8172     div zero, a0, a1; mfhi a0                                 #  a0 <- op, a0-a3 changed
   8173     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8174     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8175     /* 10-12 instructions */
   8176 
   8177 
   8178 
   8179 /* ------------------------------ */
   8180     .balign 128
   8181 .L_OP_AND_INT_LIT8: /* 0xdd */
   8182 /* File: mips/OP_AND_INT_LIT8.S */
   8183 /* File: mips/binopLit8.S */
   8184     /*
   8185      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   8186      * that specifies an instruction that performs "result = a0 op a1".
   8187      * This could be an MIPS instruction or a function call.  (If the result
   8188      * comes back in a register other than a0, you can override "result".)
   8189      *
   8190      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8191      * vCC (a1).  Useful for integer division and modulus.
   8192      *
   8193      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8194      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8195      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8196      */
   8197     # binop/lit8 vAA, vBB,                 /* +CC */
   8198     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8199     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8200     and       a2, a3, 255                  #  a2 <- BB
   8201     GET_VREG(a0, a2)                       #  a0 <- vBB
   8202     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8203     .if 0
   8204     # is second operand zero?
   8205     beqz      a1, common_errDivideByZero
   8206     .endif
   8207     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8208 
   8209                                   #  optional op
   8210     and a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   8211     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8212     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8213     /* 10-12 instructions */
   8214 
   8215 
   8216 
   8217 /* ------------------------------ */
   8218     .balign 128
   8219 .L_OP_OR_INT_LIT8: /* 0xde */
   8220 /* File: mips/OP_OR_INT_LIT8.S */
   8221 /* File: mips/binopLit8.S */
   8222     /*
   8223      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   8224      * that specifies an instruction that performs "result = a0 op a1".
   8225      * This could be an MIPS instruction or a function call.  (If the result
   8226      * comes back in a register other than a0, you can override "result".)
   8227      *
   8228      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8229      * vCC (a1).  Useful for integer division and modulus.
   8230      *
   8231      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8232      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8233      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8234      */
   8235     # binop/lit8 vAA, vBB,                 /* +CC */
   8236     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8237     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8238     and       a2, a3, 255                  #  a2 <- BB
   8239     GET_VREG(a0, a2)                       #  a0 <- vBB
   8240     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8241     .if 0
   8242     # is second operand zero?
   8243     beqz      a1, common_errDivideByZero
   8244     .endif
   8245     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8246 
   8247                                   #  optional op
   8248     or a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   8249     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8250     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8251     /* 10-12 instructions */
   8252 
   8253 
   8254 
   8255 /* ------------------------------ */
   8256     .balign 128
   8257 .L_OP_XOR_INT_LIT8: /* 0xdf */
   8258 /* File: mips/OP_XOR_INT_LIT8.S */
   8259 /* File: mips/binopLit8.S */
   8260     /*
   8261      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   8262      * that specifies an instruction that performs "result = a0 op a1".
   8263      * This could be an MIPS instruction or a function call.  (If the result
   8264      * comes back in a register other than a0, you can override "result".)
   8265      *
   8266      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8267      * vCC (a1).  Useful for integer division and modulus.
   8268      *
   8269      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8270      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8271      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8272      */
   8273     # binop/lit8 vAA, vBB,                 /* +CC */
   8274     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8275     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8276     and       a2, a3, 255                  #  a2 <- BB
   8277     GET_VREG(a0, a2)                       #  a0 <- vBB
   8278     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8279     .if 0
   8280     # is second operand zero?
   8281     beqz      a1, common_errDivideByZero
   8282     .endif
   8283     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8284 
   8285                                   #  optional op
   8286     xor a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   8287     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8288     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8289     /* 10-12 instructions */
   8290 
   8291 
   8292 
   8293 /* ------------------------------ */
   8294     .balign 128
   8295 .L_OP_SHL_INT_LIT8: /* 0xe0 */
   8296 /* File: mips/OP_SHL_INT_LIT8.S */
   8297 /* File: mips/binopLit8.S */
   8298     /*
   8299      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   8300      * that specifies an instruction that performs "result = a0 op a1".
   8301      * This could be an MIPS instruction or a function call.  (If the result
   8302      * comes back in a register other than a0, you can override "result".)
   8303      *
   8304      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8305      * vCC (a1).  Useful for integer division and modulus.
   8306      *
   8307      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8308      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8309      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8310      */
   8311     # binop/lit8 vAA, vBB,                 /* +CC */
   8312     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8313     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8314     and       a2, a3, 255                  #  a2 <- BB
   8315     GET_VREG(a0, a2)                       #  a0 <- vBB
   8316     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8317     .if 0
   8318     # is second operand zero?
   8319     beqz      a1, common_errDivideByZero
   8320     .endif
   8321     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8322 
   8323     and a1, a1, 31                              #  optional op
   8324     sll a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   8325     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8326     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8327     /* 10-12 instructions */
   8328 
   8329 
   8330 
   8331 /* ------------------------------ */
   8332     .balign 128
   8333 .L_OP_SHR_INT_LIT8: /* 0xe1 */
   8334 /* File: mips/OP_SHR_INT_LIT8.S */
   8335 /* File: mips/binopLit8.S */
   8336     /*
   8337      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   8338      * that specifies an instruction that performs "result = a0 op a1".
   8339      * This could be an MIPS instruction or a function call.  (If the result
   8340      * comes back in a register other than a0, you can override "result".)
   8341      *
   8342      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8343      * vCC (a1).  Useful for integer division and modulus.
   8344      *
   8345      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8346      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8347      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8348      */
   8349     # binop/lit8 vAA, vBB,                 /* +CC */
   8350     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8351     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8352     and       a2, a3, 255                  #  a2 <- BB
   8353     GET_VREG(a0, a2)                       #  a0 <- vBB
   8354     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8355     .if 0
   8356     # is second operand zero?
   8357     beqz      a1, common_errDivideByZero
   8358     .endif
   8359     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8360 
   8361     and a1, a1, 31                              #  optional op
   8362     sra a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   8363     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8364     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8365     /* 10-12 instructions */
   8366 
   8367 
   8368 
   8369 /* ------------------------------ */
   8370     .balign 128
   8371 .L_OP_USHR_INT_LIT8: /* 0xe2 */
   8372 /* File: mips/OP_USHR_INT_LIT8.S */
   8373 /* File: mips/binopLit8.S */
   8374     /*
   8375      * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
   8376      * that specifies an instruction that performs "result = a0 op a1".
   8377      * This could be an MIPS instruction or a function call.  (If the result
   8378      * comes back in a register other than a0, you can override "result".)
   8379      *
   8380      * If "chkzero" is set to 1, we perform a divide-by-zero check on
   8381      * vCC (a1).  Useful for integer division and modulus.
   8382      *
   8383      * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
   8384      *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
   8385      *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
   8386      */
   8387     # binop/lit8 vAA, vBB,                 /* +CC */
   8388     FETCH_S(a3, 1)                         #  a3 <- ssssCCBB (sign-extended for CC)
   8389     GET_OPA(rOBJ)                          #  rOBJ <- AA
   8390     and       a2, a3, 255                  #  a2 <- BB
   8391     GET_VREG(a0, a2)                       #  a0 <- vBB
   8392     sra       a1, a3, 8                    #  a1 <- ssssssCC (sign extended)
   8393     .if 0
   8394     # is second operand zero?
   8395     beqz      a1, common_errDivideByZero
   8396     .endif
   8397     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8398 
   8399     and a1, a1, 31                              #  optional op
   8400     srl a0, a0, a1                                 #  a0 <- op, a0-a3 changed
   8401     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8402     SET_VREG_GOTO(a0, rOBJ, t0)       #  vAA <- a0
   8403     /* 10-12 instructions */
   8404 
   8405 
   8406 
   8407 /* ------------------------------ */
   8408     .balign 128
   8409 .L_OP_IGET_VOLATILE: /* 0xe3 */
   8410 /* File: mips/OP_IGET_VOLATILE.S */
   8411 /* File: mips/OP_IGET.S */
   8412     /*
   8413      * General 32-bit instance field get.
   8414      *
   8415      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   8416      */
   8417     # op vA, vB, field                     /* CCCC */
   8418     GET_OPB(a0)                            #  a0 <- B
   8419     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   8420     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   8421     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   8422     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   8423     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   8424     # is resolved entry null?
   8425     bnez      a0, .LOP_IGET_VOLATILE_finish       #  no, already resolved
   8426     LOAD_rSELF_method(a2)                  #  a2 <- current method
   8427     EXPORT_PC()                            #  resolve() could throw
   8428     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   8429     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   8430     # test results
   8431     move      a0, v0
   8432     bnez      v0, .LOP_IGET_VOLATILE_finish
   8433     b         common_exceptionThrown
   8434 
   8435 
   8436 /* ------------------------------ */
   8437     .balign 128
   8438 .L_OP_IPUT_VOLATILE: /* 0xe4 */
   8439 /* File: mips/OP_IPUT_VOLATILE.S */
   8440 /* File: mips/OP_IPUT.S */
   8441     /*
   8442      * General 32-bit instance field put.
   8443      *
   8444      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
   8445      */
   8446     # op vA, vB, field                     /* CCCC */
   8447     GET_OPB(a0)                            #  a0 <- B
   8448     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   8449     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   8450     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   8451     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   8452     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   8453     # is resolved entry null?
   8454     bnez      a0, .LOP_IPUT_VOLATILE_finish       #  no, already resolved
   8455     LOAD_rSELF_method(a2)                  #  a2 <- current method
   8456     EXPORT_PC()                            #  resolve() could throw
   8457     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   8458     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   8459     # success?
   8460     move      a0, v0
   8461     bnez      v0, .LOP_IPUT_VOLATILE_finish       #  yes, finish up
   8462     b         common_exceptionThrown
   8463 
   8464 
   8465 /* ------------------------------ */
   8466     .balign 128
   8467 .L_OP_SGET_VOLATILE: /* 0xe5 */
   8468 /* File: mips/OP_SGET_VOLATILE.S */
   8469 /* File: mips/OP_SGET.S */
   8470     /*
   8471      * General 32-bit SGET handler.
   8472      *
   8473      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   8474      */
   8475     # op vAA, field                        /* BBBB */
   8476     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   8477     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   8478     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   8479     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   8480     # is resolved entry !null?
   8481     bnez      a0, .LOP_SGET_VOLATILE_finish
   8482 
   8483     /*
   8484      * Continuation if the field has not yet been resolved.
   8485      *  a1:  BBBB field ref
   8486      *  rBIX: dvmDex->pResFields
   8487      */
   8488     LOAD_rSELF_method(a2)                  #  a2 <- current method
   8489 #if defined(WITH_JIT)
   8490     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   8491 #endif
   8492     EXPORT_PC()                            #  resolve() could throw, so export now
   8493     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   8494     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   8495     move      a0, v0
   8496     # success?
   8497     beqz      v0, common_exceptionThrown   #  no, handle exception
   8498 #if defined(WITH_JIT)
   8499     /*
   8500      * If the JIT is actively building a trace we need to make sure
   8501      * that the field is fully resolved before including this instruction.
   8502      */
   8503     JAL(common_verifyField)
   8504 #endif
   8505     b        .LOP_SGET_VOLATILE_finish            # resume
   8506 
   8507 
   8508 /* ------------------------------ */
   8509     .balign 128
   8510 .L_OP_SPUT_VOLATILE: /* 0xe6 */
   8511 /* File: mips/OP_SPUT_VOLATILE.S */
   8512 /* File: mips/OP_SPUT.S */
   8513     /*
   8514      * General 32-bit SPUT handler.
   8515      *
   8516      * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
   8517      */
   8518     # op vAA, field                        /* BBBB */
   8519     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   8520     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   8521     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   8522     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   8523     bnez      a0, .LOP_SPUT_VOLATILE_finish       #  is resolved entry null?
   8524     /*
   8525      * Continuation if the field has not yet been resolved.
   8526      *  a1:  BBBB field ref
   8527      *  rBIX: dvmDex->pResFields
   8528      */
   8529     LOAD_rSELF_method(a2)                  #  a2 <- current method
   8530 #if defined(WITH_JIT)
   8531     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   8532 #endif
   8533     EXPORT_PC()                            #  resolve() may throw, so export now
   8534     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   8535     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   8536     move      a0, v0
   8537     beqz      v0, common_exceptionThrown   #  success? no, handle exception
   8538 #if defined(WITH_JIT)
   8539     /*
   8540      * If the JIT is actively building a trace we need to make sure
   8541      * that the field is fully resolved before including this instruction.
   8542      */
   8543     JAL(common_verifyField)
   8544 #endif
   8545     b        .LOP_SPUT_VOLATILE_finish            # resume
   8546 
   8547 
   8548 /* ------------------------------ */
   8549     .balign 128
   8550 .L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
   8551 /* File: mips/OP_IGET_OBJECT_VOLATILE.S */
   8552 /* File: mips/OP_IGET.S */
   8553     /*
   8554      * General 32-bit instance field get.
   8555      *
   8556      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
   8557      */
   8558     # op vA, vB, field                     /* CCCC */
   8559     GET_OPB(a0)                            #  a0 <- B
   8560     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   8561     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   8562     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   8563     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   8564     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   8565     # is resolved entry null?
   8566     bnez      a0, .LOP_IGET_OBJECT_VOLATILE_finish       #  no, already resolved
   8567     LOAD_rSELF_method(a2)                  #  a2 <- current method
   8568     EXPORT_PC()                            #  resolve() could throw
   8569     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   8570     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   8571     # test results
   8572     move      a0, v0
   8573     bnez      v0, .LOP_IGET_OBJECT_VOLATILE_finish
   8574     b         common_exceptionThrown
   8575 
   8576 
   8577 /* ------------------------------ */
   8578     .balign 128
   8579 .L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
   8580 /* File: mips/OP_IGET_WIDE_VOLATILE.S */
   8581 /* File: mips/OP_IGET_WIDE.S */
   8582     /*
   8583      * Wide 32-bit instance field get.
   8584      */
   8585     # iget-wide vA, vB, field              /* CCCC */
   8586     GET_OPB(a0)                            #  a0 <- B
   8587     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   8588     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   8589     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pResFields
   8590     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   8591     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   8592     # is resolved entry null?
   8593     bnez      a0, .LOP_IGET_WIDE_VOLATILE_finish       #  no, already resolved
   8594     LOAD_rSELF_method(a2)                  #  a2 <- current method
   8595     EXPORT_PC()                            #  resolve() could throw
   8596     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   8597     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   8598     # test return code
   8599     move      a0, v0
   8600     bnez      v0, .LOP_IGET_WIDE_VOLATILE_finish
   8601     b         common_exceptionThrown
   8602 
   8603 
   8604 /* ------------------------------ */
   8605     .balign 128
   8606 .L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
   8607 /* File: mips/OP_IPUT_WIDE_VOLATILE.S */
   8608 /* File: mips/OP_IPUT_WIDE.S */
   8609     # iput-wide vA, vB, field              /* CCCC */
   8610     GET_OPB(a0)                            #  a0 <- B
   8611     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   8612     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   8613     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pResFields
   8614     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   8615     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   8616     # is resolved entry null?
   8617     bnez      a0, .LOP_IPUT_WIDE_VOLATILE_finish       #  no, already resolved
   8618     LOAD_rSELF_method(a2)                  #  a2 <- current method
   8619     EXPORT_PC()                            #  resolve() could throw
   8620     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   8621     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   8622     # success?
   8623     move      a0, v0
   8624     bnez      v0, .LOP_IPUT_WIDE_VOLATILE_finish       #  yes, finish up
   8625     b         common_exceptionThrown
   8626 
   8627 
   8628 /* ------------------------------ */
   8629     .balign 128
   8630 .L_OP_SGET_WIDE_VOLATILE: /* 0xea */
   8631 /* File: mips/OP_SGET_WIDE_VOLATILE.S */
   8632 /* File: mips/OP_SGET_WIDE.S */
   8633     /*
   8634      * 64-bit SGET handler.
   8635      */
   8636     # sget-wide vAA, field                 /* BBBB */
   8637     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   8638     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   8639     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   8640     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   8641     # is resolved entry null?
   8642     bnez      a0, .LOP_SGET_WIDE_VOLATILE_finish
   8643 
   8644     /*
   8645      * Continuation if the field has not yet been resolved.
   8646      *  a1:  BBBB field ref
   8647      *  rBIX: dvmDex->pResFields
   8648      *
   8649      * Returns StaticField pointer in v0.
   8650      */
   8651     LOAD_rSELF_method(a2)                  #  a2 <- current method
   8652 #if defined(WITH_JIT)
   8653     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   8654 #endif
   8655     EXPORT_PC()                            #  resolve() could throw, so export now
   8656     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   8657     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   8658     move      a0, v0
   8659     # success?
   8660     beqz      v0, common_exceptionThrown   #  no, handle exception
   8661 #if defined(WITH_JIT)
   8662     /*
   8663      * If the JIT is actively building a trace we need to make sure
   8664      * that the field is fully resolved before including this instruction.
   8665      */
   8666     JAL(common_verifyField)
   8667 #endif
   8668 
   8669     b        .LOP_SGET_WIDE_VOLATILE_finish            # resume
   8670 
   8671 
   8672 /* ------------------------------ */
   8673     .balign 128
   8674 .L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
   8675 /* File: mips/OP_SPUT_WIDE_VOLATILE.S */
   8676 /* File: mips/OP_SPUT_WIDE.S */
   8677     /*
   8678      * 64-bit SPUT handler.
   8679      */
   8680     # sput-wide vAA, field                 /* BBBB */
   8681     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   8682     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   8683     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   8684     GET_OPA(t0)                            #  t0 <- AA
   8685     LOAD_eas2(a2, rBIX, a1)                #  a2 <- resolved StaticField ptr
   8686     EAS2(rOBJ, rFP, t0)                    #  rOBJ<- &fp[AA]
   8687     # is resolved entry null?
   8688     beqz      a2, .LOP_SPUT_WIDE_VOLATILE_resolve      #  yes, do resolve
   8689 .LOP_SPUT_WIDE_VOLATILE_finish:                        #  field ptr in a2, AA in rOBJ
   8690     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8691     LOAD64(a0, a1, rOBJ)                   #  a0/a1 <- vAA/vAA+1
   8692     GET_INST_OPCODE(rBIX)                  #  extract opcode from rINST
   8693     .if 1
   8694     addu    a2, offStaticField_value       #  a2<- pointer to data
   8695     JAL(dvmQuasiAtomicSwap64Sync)          #  stores a0/a1 into addr a2
   8696     .else
   8697     STORE64_off(a0, a1, a2, offStaticField_value) #  field <- vAA/vAA+1
   8698     .endif
   8699     GOTO_OPCODE(rBIX)                      #  jump to next instruction
   8700 
   8701 
   8702 /* ------------------------------ */
   8703     .balign 128
   8704 .L_OP_BREAKPOINT: /* 0xec */
   8705     /* (stub) */
   8706     SAVE_PC_TO_SELF()            # only need to export PC and FP
   8707     SAVE_FP_TO_SELF()
   8708     move        a0, rSELF        # self is first arg to function
   8709     JAL(dvmMterp_OP_BREAKPOINT)      # call
   8710     LOAD_PC_FROM_SELF()          # retrieve updated values
   8711     LOAD_FP_FROM_SELF()
   8712     FETCH_INST()                 # load next instruction from rPC
   8713     GET_INST_OPCODE(t0)          # ...trim down to just the opcode
   8714     GOTO_OPCODE(t0)              # ...and jump to the handler
   8715 /* ------------------------------ */
   8716     .balign 128
   8717 .L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
   8718 /* File: mips/OP_THROW_VERIFICATION_ERROR.S */
   8719     /*
   8720      * Handle a throw-verification-error instruction.  This throws an
   8721      * exception for an error discovered during verification.  The
   8722      * exception is indicated by AA, with some detail provided by BBBB.
   8723      */
   8724     /* op AA, ref@BBBB */
   8725 
   8726     LOAD_rSELF_method(a0)                  #  a0 <- self->method
   8727     FETCH(a2, 1)                           #  a2 <- BBBB
   8728     EXPORT_PC()                            #  export the PC
   8729     GET_OPA(a1)                            #  a1 <- AA
   8730     JAL(dvmThrowVerificationError)         #  always throws
   8731     b         common_exceptionThrown       #  handle exception
   8732 
   8733 
   8734 /* ------------------------------ */
   8735     .balign 128
   8736 .L_OP_EXECUTE_INLINE: /* 0xee */
   8737 /* File: mips/OP_EXECUTE_INLINE.S */
   8738     /*
   8739      * Execute a "native inline" instruction.
   8740      *
   8741      * We need to call an InlineOp4Func:
   8742      *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
   8743      *
   8744      * The first four args are in a0-a3, pointer to return value storage
   8745      * is on the stack.  The function's return value is a flag that tells
   8746      * us if an exception was thrown.
   8747      *
   8748      * TUNING: could maintain two tables, pointer in Thread and
   8749      * swap if profiler/debuggger active.
   8750      */
   8751     /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
   8752     lhu       a2, offThread_subMode(rSELF)
   8753     FETCH(rBIX, 1)                         #  rBIX <- BBBB
   8754     EXPORT_PC()                            #  can throw
   8755     and       a2, kSubModeDebugProfile     #  Any going on?
   8756     bnez      a2, .LOP_EXECUTE_INLINE_debugmode    #  yes - take slow path
   8757 .LOP_EXECUTE_INLINE_resume:
   8758     addu      a1, rSELF, offThread_retval  #  a1 <- &self->retval
   8759     GET_OPB(a0)                            #  a0 <- B
   8760     # Stack should have 16/20 available
   8761     sw        a1, STACK_OFFSET_ARG04(sp)   #  push &self->retval
   8762     BAL(.LOP_EXECUTE_INLINE_continue)              #  make call; will return after
   8763     lw        gp, STACK_OFFSET_GP(sp)      #  restore gp
   8764     # test boolean result of inline
   8765     beqz      v0, common_exceptionThrown   #  returned false, handle exception
   8766     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
   8767     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8768     GOTO_OPCODE(t0)                        #  jump to next instruction
   8769 
   8770 /* ------------------------------ */
   8771     .balign 128
   8772 .L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
   8773 /* File: mips/OP_EXECUTE_INLINE_RANGE.S */
   8774     /*
   8775      * Execute a "native inline" instruction, using "/range" semantics.
   8776      * Same idea as execute-inline, but we get the args differently.
   8777      *
   8778      * We need to call an InlineOp4Func:
   8779      *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
   8780      *
   8781      * The first four args are in a0-a3, pointer to return value storage
   8782      * is on the stack.  The function's return value is a flag that tells
   8783      * us if an exception was thrown.
   8784      */
   8785     /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
   8786     lhu       a2, offThread_subMode(rSELF)
   8787     FETCH(rBIX, 1)                       # rBIX<- BBBB
   8788     EXPORT_PC()                          # can throw
   8789     and       a2, kSubModeDebugProfile   # Any going on?
   8790     bnez      a2, .LOP_EXECUTE_INLINE_RANGE_debugmode  # yes - take slow path
   8791 .LOP_EXECUTE_INLINE_RANGE_resume:
   8792     addu      a1, rSELF, offThread_retval # a1<- &self->retval
   8793     GET_OPA(a0)
   8794     sw        a1, STACK_OFFSET_ARG04(sp)  # push &self->retval
   8795     BAL(.LOP_EXECUTE_INLINE_RANGE_continue)             # make call; will return after
   8796     lw        gp, STACK_OFFSET_GP(sp)     #  restore gp
   8797     beqz      v0, common_exceptionThrown  # returned false, handle exception
   8798     FETCH_ADVANCE_INST(3)                 # advance rPC, load rINST
   8799     GET_INST_OPCODE(t0)                   # extract opcode from rINST
   8800     GOTO_OPCODE(t0)                       # jump to next instruction
   8801 
   8802 
   8803 /* ------------------------------ */
   8804     .balign 128
   8805 .L_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
   8806 /* File: mips/OP_INVOKE_OBJECT_INIT_RANGE.S */
   8807     /*
   8808      * Invoke Object.<init> on an object.  In practice we know that
   8809      * Object's nullary constructor doesn't do anything, so we just
   8810      * skip it unless a debugger is active.
   8811      */
   8812     FETCH(a1, 2)                  # a1<- CCCC
   8813     GET_VREG(a0, a1)                    # a0<- "this" ptr
   8814     # check for NULL
   8815     beqz    a0, common_errNullObject    # export PC and throw NPE
   8816     LOAD_base_offObject_clazz(a1, a0)   # a1<- obj->clazz
   8817     LOAD_base_offClassObject_accessFlags(a2, a1) # a2<- clazz->accessFlags
   8818     and     a2, CLASS_ISFINALIZABLE     # is this class finalizable?
   8819     beqz    a2, .LOP_INVOKE_OBJECT_INIT_RANGE_finish      # no, go
   8820 
   8821 .LOP_INVOKE_OBJECT_INIT_RANGE_setFinal:
   8822     EXPORT_PC()                         # can throw
   8823     JAL(dvmSetFinalizable)              # call dvmSetFinalizable(obj)
   8824     LOAD_offThread_exception(a0, rSELF)	# a0<- self->exception
   8825     # exception pending?
   8826     bnez    a0, common_exceptionThrown  # yes, handle it
   8827 
   8828 .LOP_INVOKE_OBJECT_INIT_RANGE_finish:
   8829     lhu     a1, offThread_subMode(rSELF)
   8830     and     a1, kSubModeDebuggerActive  # debugger active?
   8831     bnez    a1, .LOP_INVOKE_OBJECT_INIT_RANGE_debugger    # Yes - skip optimization
   8832     FETCH_ADVANCE_INST(2+1)       # advance to next instr, load rINST
   8833     GET_INST_OPCODE(t0)                 # t0<- opcode from rINST
   8834     GOTO_OPCODE(t0)                     # execute it
   8835 
   8836 
   8837 /* ------------------------------ */
   8838     .balign 128
   8839 .L_OP_RETURN_VOID_BARRIER: /* 0xf1 */
   8840 /* File: mips/OP_RETURN_VOID_BARRIER.S */
   8841     SMP_DMB
   8842     b         common_returnFromMethod
   8843 
   8844 /* ------------------------------ */
   8845     .balign 128
   8846 .L_OP_IGET_QUICK: /* 0xf2 */
   8847 /* File: mips/OP_IGET_QUICK.S */
   8848     /* For: iget-quick, iget-object-quick */
   8849     # op vA, vB, offset                    /* CCCC */
   8850     GET_OPB(a2)                            #  a2 <- B
   8851     GET_VREG(a3, a2)                       #  a3 <- object we're operating on
   8852     FETCH(a1, 1)                           #  a1 <- field byte offset
   8853     GET_OPA4(a2)                           #  a2 <- A(+)
   8854     # check object for null
   8855     beqz      a3, common_errNullObject     #  object was null
   8856     addu      t0, a3, a1 #
   8857     lw        a0, 0(t0)                    #  a0 <- obj.field (always 32 bits)
   8858     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8859     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8860     SET_VREG(a0, a2)                       #  fp[A] <- a0
   8861     GOTO_OPCODE(t0)                        #  jump to next instruction
   8862 
   8863 
   8864 /* ------------------------------ */
   8865     .balign 128
   8866 .L_OP_IGET_WIDE_QUICK: /* 0xf3 */
   8867 /* File: mips/OP_IGET_WIDE_QUICK.S */
   8868     # iget-wide-quick vA, vB, offset       /* CCCC */
   8869     GET_OPB(a2)                            #  a2 <- B
   8870     GET_VREG(a3, a2)                       #  a3 <- object we're operating on
   8871     FETCH(a1, 1)                           #  a1 <- field byte offset
   8872     GET_OPA4(a2)                           #  a2 <- A(+)
   8873     # check object for null
   8874     beqz      a3, common_errNullObject     #  object was null
   8875     addu      t0, a3, a1                   #  t0 <- a3 + a1
   8876     LOAD64(a0, a1, t0)                     #  a0 <- obj.field (64 bits, aligned)
   8877     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8878     EAS2(a3, rFP, a2)
   8879     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8880     STORE64(a0, a1, a3)                    #  fp[A] <- a0/a1
   8881     GOTO_OPCODE(t0)                        #  jump to next instruction
   8882 
   8883 
   8884 /* ------------------------------ */
   8885     .balign 128
   8886 .L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
   8887 /* File: mips/OP_IGET_OBJECT_QUICK.S */
   8888 /* File: mips/OP_IGET_QUICK.S */
   8889     /* For: iget-quick, iget-object-quick */
   8890     # op vA, vB, offset                    /* CCCC */
   8891     GET_OPB(a2)                            #  a2 <- B
   8892     GET_VREG(a3, a2)                       #  a3 <- object we're operating on
   8893     FETCH(a1, 1)                           #  a1 <- field byte offset
   8894     GET_OPA4(a2)                           #  a2 <- A(+)
   8895     # check object for null
   8896     beqz      a3, common_errNullObject     #  object was null
   8897     addu      t0, a3, a1 #
   8898     lw        a0, 0(t0)                    #  a0 <- obj.field (always 32 bits)
   8899     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8900     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8901     SET_VREG(a0, a2)                       #  fp[A] <- a0
   8902     GOTO_OPCODE(t0)                        #  jump to next instruction
   8903 
   8904 
   8905 
   8906 /* ------------------------------ */
   8907     .balign 128
   8908 .L_OP_IPUT_QUICK: /* 0xf5 */
   8909 /* File: mips/OP_IPUT_QUICK.S */
   8910     /* For: iput-quick, iput-object-quick */
   8911     # op vA, vB, offset                    /* CCCC */
   8912     GET_OPB(a2)                            #  a2 <- B
   8913     GET_VREG(a3, a2)                       #  a3 <- fp[B], the object pointer
   8914     FETCH(a1, 1)                           #  a1 <- field byte offset
   8915     GET_OPA4(a2)                           #  a2 <- A(+)
   8916     beqz      a3, common_errNullObject     #  object was null
   8917     GET_VREG(a0, a2)                       #  a0 <- fp[A]
   8918     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8919     addu      t0, a3, a1
   8920     sw        a0, 0(t0)                    #  obj.field (always 32 bits) <- a0
   8921     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8922     GOTO_OPCODE(t0)                        #  jump to next instruction
   8923 
   8924 
   8925 /* ------------------------------ */
   8926     .balign 128
   8927 .L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
   8928 /* File: mips/OP_IPUT_WIDE_QUICK.S */
   8929     # iput-wide-quick vA, vB, offset       /* CCCC */
   8930     GET_OPA4(a0)                           #  a0 <- A(+)
   8931     GET_OPB(a1)                            #  a1 <- B
   8932     GET_VREG(a2, a1)                       #  a2 <- fp[B], the object pointer
   8933     EAS2(a3, rFP, a0)                      #  a3 <- &fp[A]
   8934     LOAD64(a0, a1, a3)                     #  a0/a1 <- fp[A]
   8935     # check object for null
   8936     beqz      a2, common_errNullObject     #  object was null
   8937     FETCH(a3, 1)                           #  a3 <- field byte offset
   8938     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8939     addu      a2, a2, a3                   #  obj.field (64 bits, aligned) <- a0/a1
   8940     STORE64(a0, a1, a2)                    #  obj.field (64 bits, aligned) <- a0/a1
   8941     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8942     GOTO_OPCODE(t0)                        #  jump to next instruction
   8943 
   8944 
   8945 /* ------------------------------ */
   8946     .balign 128
   8947 .L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
   8948 /* File: mips/OP_IPUT_OBJECT_QUICK.S */
   8949     /* For: iput-object-quick */
   8950     # op vA, vB, offset                    /* CCCC */
   8951     GET_OPB(a2)                            #  a2 <- B
   8952     GET_VREG(a3, a2)                       #  a3 <- fp[B], the object pointer
   8953     FETCH(a1, 1)                           #  a1 <- field byte offset
   8954     GET_OPA4(a2)                           #  a2 <- A(+)
   8955     beqz      a3, common_errNullObject     #  object was null
   8956     GET_VREG(a0, a2)                       #  a0 <- fp[A]
   8957     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   8958     addu      t0, a3, a1
   8959     sw        a0, 0(t0)                    #  obj.field (always 32 bits) <- a0
   8960     beqz      a0, 1f
   8961     lw        a2, offThread_cardTable(rSELF) #  a2 <- card table base
   8962     srl       t1, a3, GC_CARD_SHIFT
   8963     addu      t2, a2, t1
   8964     sb        a2, 0(t2)
   8965 1:
   8966     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   8967     GOTO_OPCODE(t0)                        #  jump to next instruction
   8968 
   8969 /* ------------------------------ */
   8970     .balign 128
   8971 .L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
   8972 /* File: mips/OP_INVOKE_VIRTUAL_QUICK.S */
   8973     /*
   8974      * Handle an optimized virtual method call.
   8975      *
   8976      * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
   8977      */
   8978     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   8979     # op vAA, {vCCCC..v(CCCC+AA-1)}, meth  /* BBBB */
   8980     FETCH(a3, 2)                           #  a3 <- FEDC or CCCC
   8981     FETCH(a1, 1)                           #  a1 <- BBBB
   8982     .if (!0)
   8983     and       a3, a3, 15                   #  a3 <- C (or stays CCCC)
   8984     .endif
   8985     GET_VREG(rOBJ, a3)                     #  rOBJ <- vC ("this" ptr)
   8986     # is "this" null?
   8987     beqz      rOBJ, common_errNullObject   #  null "this", throw exception
   8988     LOAD_base_offObject_clazz(a2, rOBJ)    #  a2 <- thisPtr->clazz
   8989     LOAD_base_offClassObject_vtable(a2, a2) #  a2 <- thisPtr->clazz->vtable
   8990     EXPORT_PC()                            #  invoke must export
   8991     LOAD_eas2(a0, a2, a1)                  #  a0 <- vtable[BBBB]
   8992     b         common_invokeMethodNoRange #  (a0=method, r9="this")
   8993 
   8994 /* ------------------------------ */
   8995     .balign 128
   8996 .L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
   8997 /* File: mips/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
   8998 /* File: mips/OP_INVOKE_VIRTUAL_QUICK.S */
   8999     /*
   9000      * Handle an optimized virtual method call.
   9001      *
   9002      * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
   9003      */
   9004     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   9005     # op vAA, {vCCCC..v(CCCC+AA-1)}, meth  /* BBBB */
   9006     FETCH(a3, 2)                           #  a3 <- FEDC or CCCC
   9007     FETCH(a1, 1)                           #  a1 <- BBBB
   9008     .if (!1)
   9009     and       a3, a3, 15                   #  a3 <- C (or stays CCCC)
   9010     .endif
   9011     GET_VREG(rOBJ, a3)                     #  rOBJ <- vC ("this" ptr)
   9012     # is "this" null?
   9013     beqz      rOBJ, common_errNullObject   #  null "this", throw exception
   9014     LOAD_base_offObject_clazz(a2, rOBJ)    #  a2 <- thisPtr->clazz
   9015     LOAD_base_offClassObject_vtable(a2, a2) #  a2 <- thisPtr->clazz->vtable
   9016     EXPORT_PC()                            #  invoke must export
   9017     LOAD_eas2(a0, a2, a1)                  #  a0 <- vtable[BBBB]
   9018     b         common_invokeMethodRange #  (a0=method, r9="this")
   9019 
   9020 
   9021 /* ------------------------------ */
   9022     .balign 128
   9023 .L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
   9024 /* File: mips/OP_INVOKE_SUPER_QUICK.S */
   9025     /*
   9026      * Handle an optimized "super" method call.
   9027      *
   9028      * for: [opt] invoke-super-quick, invoke-super-quick/range
   9029      */
   9030     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   9031     # op vAA, {vCCCC..v(CCCC+AA-1)}, meth  /* BBBB */
   9032     FETCH(t0, 2)                           #  t0 <- GFED or CCCC
   9033     LOAD_rSELF_method(a2)                  #  a2 <- current method
   9034     .if (!0)
   9035     and       t0, t0, 15                   #  t0 <- D (or stays CCCC)
   9036     .endif
   9037     FETCH(a1, 1)                           #  a1 <- BBBB
   9038     LOAD_base_offMethod_clazz(a2, a2)      #  a2 <- method->clazz
   9039     EXPORT_PC()                            #  must export for invoke
   9040     LOAD_base_offClassObject_super(a2, a2) #  a2 <- method->clazz->super
   9041     GET_VREG(rOBJ, t0)                     #  rOBJ <- "this"
   9042     LOAD_base_offClassObject_vtable(a2, a2) #  a2 <- ...clazz->super->vtable
   9043     # is "this" null ?
   9044     LOAD_eas2(a0, a2, a1)                  #  a0 <- super->vtable[BBBB]
   9045     beqz      rOBJ, common_errNullObject   #  "this" is null, throw exception
   9046     b         common_invokeMethodNoRange #  (a0=method, rOBJ="this")
   9047 
   9048 
   9049 /* ------------------------------ */
   9050     .balign 128
   9051 .L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
   9052 /* File: mips/OP_INVOKE_SUPER_QUICK_RANGE.S */
   9053 /* File: mips/OP_INVOKE_SUPER_QUICK.S */
   9054     /*
   9055      * Handle an optimized "super" method call.
   9056      *
   9057      * for: [opt] invoke-super-quick, invoke-super-quick/range
   9058      */
   9059     # op vB, {vD, vE, vF, vG, vA}, class   /* CCCC */
   9060     # op vAA, {vCCCC..v(CCCC+AA-1)}, meth  /* BBBB */
   9061     FETCH(t0, 2)                           #  t0 <- GFED or CCCC
   9062     LOAD_rSELF_method(a2)                  #  a2 <- current method
   9063     .if (!1)
   9064     and       t0, t0, 15                   #  t0 <- D (or stays CCCC)
   9065     .endif
   9066     FETCH(a1, 1)                           #  a1 <- BBBB
   9067     LOAD_base_offMethod_clazz(a2, a2)      #  a2 <- method->clazz
   9068     EXPORT_PC()                            #  must export for invoke
   9069     LOAD_base_offClassObject_super(a2, a2) #  a2 <- method->clazz->super
   9070     GET_VREG(rOBJ, t0)                     #  rOBJ <- "this"
   9071     LOAD_base_offClassObject_vtable(a2, a2) #  a2 <- ...clazz->super->vtable
   9072     # is "this" null ?
   9073     LOAD_eas2(a0, a2, a1)                  #  a0 <- super->vtable[BBBB]
   9074     beqz      rOBJ, common_errNullObject   #  "this" is null, throw exception
   9075     b         common_invokeMethodRange #  (a0=method, rOBJ="this")
   9076 
   9077 
   9078 
   9079 /* ------------------------------ */
   9080     .balign 128
   9081 .L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
   9082 /* File: mips/OP_IPUT_OBJECT_VOLATILE.S */
   9083 /* File: mips/OP_IPUT_OBJECT.S */
   9084     /*
   9085      * 32-bit instance field put.
   9086      *
   9087      * for: iput-object, iput-object-volatile
   9088      */
   9089     # op vA, vB, field                     /* CCCC */
   9090     GET_OPB(a0)                            #  a0 <- B
   9091     LOAD_rSELF_methodClassDex(a3)          #  a3 <- DvmDex
   9092     FETCH(a1, 1)                           #  a1 <- field ref CCCC
   9093     LOAD_base_offDvmDex_pResFields(a2, a3) #  a2 <- pDvmDex->pResFields
   9094     GET_VREG(rOBJ, a0)                     #  rOBJ <- fp[B], the object pointer
   9095     LOAD_eas2(a0, a2, a1)                  #  a0 <- resolved InstField ptr
   9096     # is resolved entry null?
   9097     bnez      a0, .LOP_IPUT_OBJECT_VOLATILE_finish       #  no, already resolved
   9098     LOAD_rSELF_method(a2)                  #  a2 <- current method
   9099     EXPORT_PC()                            #  resolve() could throw
   9100     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   9101     JAL(dvmResolveInstField)               #  v0 <- resolved InstField ptr
   9102     # success?
   9103     move      a0, v0
   9104     bnez      v0, .LOP_IPUT_OBJECT_VOLATILE_finish       #  yes, finish up
   9105     b         common_exceptionThrown
   9106 
   9107 
   9108 /* ------------------------------ */
   9109     .balign 128
   9110 .L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
   9111 /* File: mips/OP_SGET_OBJECT_VOLATILE.S */
   9112 /* File: mips/OP_SGET.S */
   9113     /*
   9114      * General 32-bit SGET handler.
   9115      *
   9116      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
   9117      */
   9118     # op vAA, field                        /* BBBB */
   9119     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   9120     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   9121     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   9122     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   9123     # is resolved entry !null?
   9124     bnez      a0, .LOP_SGET_OBJECT_VOLATILE_finish
   9125 
   9126     /*
   9127      * Continuation if the field has not yet been resolved.
   9128      *  a1:  BBBB field ref
   9129      *  rBIX: dvmDex->pResFields
   9130      */
   9131     LOAD_rSELF_method(a2)                  #  a2 <- current method
   9132 #if defined(WITH_JIT)
   9133     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   9134 #endif
   9135     EXPORT_PC()                            #  resolve() could throw, so export now
   9136     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   9137     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   9138     move      a0, v0
   9139     # success?
   9140     beqz      v0, common_exceptionThrown   #  no, handle exception
   9141 #if defined(WITH_JIT)
   9142     /*
   9143      * If the JIT is actively building a trace we need to make sure
   9144      * that the field is fully resolved before including this instruction.
   9145      */
   9146     JAL(common_verifyField)
   9147 #endif
   9148     b        .LOP_SGET_OBJECT_VOLATILE_finish            # resume
   9149 
   9150 
   9151 /* ------------------------------ */
   9152     .balign 128
   9153 .L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
   9154 /* File: mips/OP_SPUT_OBJECT_VOLATILE.S */
   9155 /* File: mips/OP_SPUT_OBJECT.S */
   9156     /*
   9157      * General 32-bit SPUT handler.
   9158      *
   9159      * for: sput-object, sput-object-volatile
   9160      */
   9161     /* op vAA, field@BBBB */
   9162     LOAD_rSELF_methodClassDex(a2)          #  a2 <- DvmDex
   9163     FETCH(a1, 1)                           #  a1 <- field ref BBBB
   9164     LOAD_base_offDvmDex_pResFields(rBIX, a2) #  rBIX <- dvmDex->pResFields
   9165     LOAD_eas2(a0, rBIX, a1)                #  a0 <- resolved StaticField ptr
   9166     bnez      a0, .LOP_SPUT_OBJECT_VOLATILE_finish       #  is resolved entry null?
   9167 
   9168     /* Continuation if the field has not yet been resolved.
   9169      * a1:  BBBB field ref
   9170      * rBIX: dvmDex->pResFields
   9171      */
   9172     LOAD_rSELF_method(a2)                  #  a2 <- current method
   9173 #if defined(WITH_JIT)
   9174     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   9175 #endif
   9176     EXPORT_PC()                            #  resolve() may throw, so export now
   9177     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   9178     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   9179     move      a0, v0
   9180     beqz      v0, common_exceptionThrown   #  success? no, handle exception
   9181 #if defined(WITH_JIT)
   9182     /*
   9183      * If the JIT is actively building a trace we need to make sure
   9184      * that the field is fully resolved before including this instruction.
   9185      */
   9186     JAL(common_verifyField)
   9187 #endif
   9188     b       .LOP_SPUT_OBJECT_VOLATILE_finish             # resume
   9189 
   9190 
   9191 
   9192 /* ------------------------------ */
   9193     .balign 128
   9194 .L_OP_UNUSED_FF: /* 0xff */
   9195 /* File: mips/OP_UNUSED_FF.S */
   9196 /* File: mips/unused.S */
   9197     BAL(common_abort)
   9198 
   9199 
   9200 
   9201     .balign 128
   9202     .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
   9203     .global dvmAsmInstructionEnd
   9204 dvmAsmInstructionEnd:
   9205 
   9206 /*
   9207  * ===========================================================================
   9208  *  Sister implementations
   9209  * ===========================================================================
   9210  */
   9211     .global dvmAsmSisterStart
   9212     .type   dvmAsmSisterStart, %function
   9213     .text
   9214     .balign 4
   9215 dvmAsmSisterStart:
   9216 
   9217 /* continuation for OP_CHECK_CAST */
   9218 
   9219 .LOP_CHECK_CAST_castfailure:
   9220     # A cast has failed. We need to throw a ClassCastException with the
   9221     # class of the object that failed to be cast.
   9222     EXPORT_PC()                            #  about to throw
   9223     LOAD_base_offObject_clazz(a0, rOBJ)    #  a0 <- obj->clazz
   9224     move      a1,rBIX                      #  r1<- desired class
   9225     JAL(dvmThrowClassCastException)
   9226     b         common_exceptionThrown
   9227 
   9228     /*
   9229      * Resolution required.  This is the least-likely path.
   9230      *
   9231      *  a2   holds BBBB
   9232      *  rOBJ holds object
   9233      */
   9234 .LOP_CHECK_CAST_resolve:
   9235     EXPORT_PC()                            #  resolve() could throw
   9236     LOAD_rSELF_method(a3)                  #  a3 <- self->method
   9237     move      a1, a2                       #  a1 <- BBBB
   9238     li        a2, 0                        #  a2 <- false
   9239     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   9240     JAL(dvmResolveClass)                   #  v0 <- resolved ClassObject ptr
   9241     # got null?
   9242     beqz      v0, common_exceptionThrown   #  yes, handle exception
   9243     move      a1, v0                       #  a1 <- class resolved from BBB
   9244     LOAD_base_offObject_clazz(a0, rOBJ)    #  a0 <- obj->clazz
   9245     b         .LOP_CHECK_CAST_resolved         #  pick up where we left off
   9246 
   9247 /* continuation for OP_INSTANCE_OF */
   9248 
   9249     /*
   9250      * Trivial test failed, need to perform full check.  This is common.
   9251      *  a0   holds obj->clazz
   9252      *  a1   holds class resolved from BBBB
   9253      *  rOBJ holds A
   9254      */
   9255 .LOP_INSTANCE_OF_fullcheck:
   9256     JAL(dvmInstanceofNonTrivial)           #  v0 <- boolean result
   9257     move      a0, v0                       #  fall through to OP_INSTANCE_OF_store
   9258     b         .LOP_INSTANCE_OF_store
   9259 
   9260     /*
   9261      * Resolution required.  This is the least-likely path.
   9262      *
   9263      *  a3   holds BBBB
   9264      *  rOBJ holds A
   9265      */
   9266 .LOP_INSTANCE_OF_resolve:
   9267     EXPORT_PC()                            #  resolve() could throw
   9268     LOAD_rSELF_method(a0)                  #  a0 <- self->method
   9269     move      a1, a3                       #  a1 <- BBBB
   9270     li        a2, 1                        #  a2 <- true
   9271     LOAD_base_offMethod_clazz(a0, a0)      #  a0 <- method->clazz
   9272     JAL(dvmResolveClass)                   #  v0 <- resolved ClassObject ptr
   9273     # got null?
   9274     move      a1, v0                       #  a1 <- class resolved from BBB
   9275     beqz      v0, common_exceptionThrown   #  yes, handle exception
   9276     GET_OPB(a3)                            #  a3 <- B
   9277     GET_VREG(a0, a3)                       #  a0 <- vB (object)
   9278     LOAD_base_offObject_clazz(a0, a0)      #  a0 <- obj->clazz
   9279     b         .LOP_INSTANCE_OF_resolved         #  pick up where we left off
   9280 
   9281 
   9282 /* continuation for OP_NEW_INSTANCE */
   9283 
   9284 .LOP_NEW_INSTANCE_continue:
   9285     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9286     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9287     SET_VREG(v0, a3)                       #  vAA <- v0
   9288     GOTO_OPCODE(t0)                        #  jump to next instruction
   9289 
   9290 #if defined(WITH_JIT)
   9291     /*
   9292      * Check to see if we need to stop the trace building early.
   9293      * v0: new object
   9294      * a3: vAA
   9295      */
   9296 .LOP_NEW_INSTANCE_jitCheck:
   9297     lw        a1, 0(rBIX)                  #  reload resolved class
   9298     # okay?
   9299     bnez      a1, .LOP_NEW_INSTANCE_continue     #  yes, finish
   9300     move      rOBJ, v0                     #  preserve new object
   9301     move      rBIX, a3                     #  preserve vAA
   9302     move      a0, rSELF
   9303     move      a1, rPC
   9304     JAL(dvmJitEndTraceSelect)              #  (self, pc)
   9305     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9306     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9307     SET_VREG(rOBJ, rBIX)                   #  vAA <- new object
   9308     GOTO_OPCODE(t0)                        #  jump to next instruction
   9309 #endif
   9310 
   9311     /*
   9312      * Class initialization required.
   9313      *
   9314      *  a0 holds class object
   9315      */
   9316 .LOP_NEW_INSTANCE_needinit:
   9317     JAL(dvmInitClass)                      #  initialize class
   9318     move      a0, rOBJ                     #  restore a0
   9319     # check boolean result
   9320     bnez      v0, .LOP_NEW_INSTANCE_initialized  #  success, continue
   9321     b         common_exceptionThrown       #  failed, deal with init exception
   9322 
   9323 
   9324     /*
   9325      * Resolution required.  This is the least-likely path.
   9326      *
   9327      *  a1 holds BBBB
   9328      */
   9329 .LOP_NEW_INSTANCE_resolve:
   9330     LOAD_rSELF_method(a3)                  #  a3 <- self->method
   9331     li        a2, 0                        #  a2 <- false
   9332     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   9333     JAL(dvmResolveClass)                   #  v0 <- resolved ClassObject ptr
   9334     move      a0, v0
   9335     # got null?
   9336     bnez      v0, .LOP_NEW_INSTANCE_resolved     #  no, continue
   9337     b         common_exceptionThrown       #  yes, handle exception
   9338 
   9339 /* continuation for OP_NEW_ARRAY */
   9340 
   9341     /*
   9342      * Resolve class.  (This is an uncommon case.)
   9343      *
   9344      *  a1 holds array length
   9345      *  a2 holds class ref CCCC
   9346      */
   9347 .LOP_NEW_ARRAY_resolve:
   9348     LOAD_rSELF_method(a3)                  #  a3 <- self->method
   9349     move      rOBJ, a1                     #  rOBJ <- length (save)
   9350     move      a1, a2                       #  a1 <- CCCC
   9351     li        a2, 0                        #  a2 <- false
   9352     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   9353     JAL(dvmResolveClass)                   #  v0 <- call(clazz, ref)
   9354     move      a1, rOBJ                     #  a1 <- length (restore)
   9355     # got null?
   9356     beqz      v0, common_exceptionThrown   #  yes, handle exception
   9357     move      a0, v0
   9358     b         .LOP_NEW_ARRAY_finish           #  continue with OP_NEW_ARRAY_finish
   9359 
   9360 
   9361 
   9362 /* continuation for OP_FILLED_NEW_ARRAY */
   9363 
   9364     /*
   9365      * On entry:
   9366      *  a0 holds array class
   9367      *  rOBJ holds AA or BA
   9368      */
   9369 .LOP_FILLED_NEW_ARRAY_continue:
   9370     LOAD_base_offClassObject_descriptor(a3, a0) #  a3 <- arrayClass->descriptor
   9371     li        a2, ALLOC_DONT_TRACK         #  a2 <- alloc flags
   9372     lbu       rINST, 1(a3)                 #  rINST <- descriptor[1]
   9373     .if 0
   9374     move      a1, rOBJ                     #  a1 <- AA (length)
   9375     .else
   9376     srl       a1, rOBJ, 4                  #  rOBJ <- B (length)
   9377     .endif
   9378     seq       t0, rINST, 'I'               #  array of ints?
   9379     seq       t1, rINST, 'L'               #  array of objects?
   9380     or        t0, t1
   9381     seq       t1, rINST, '['               #  array of arrays?
   9382     or        t0, t1
   9383     move      rBIX, a1                     #  save length in rBIX
   9384     beqz      t0, .LOP_FILLED_NEW_ARRAY_notimpl      #  no, not handled yet
   9385     JAL(dvmAllocArrayByClass)              #  v0 <- call(arClass, length, flags)
   9386     # null return?
   9387     beqz      v0, common_exceptionThrown   #  alloc failed, handle exception
   9388 
   9389     FETCH(a1, 2)                           #  a1 <- FEDC or CCCC
   9390     sw        v0, offThread_retval(rSELF)  #  retval.l <- new array
   9391     sw        rINST, (offThread_retval+4)(rSELF) #  retval.h <- type
   9392     addu      a0, v0, offArrayObject_contents #  a0 <- newArray->contents
   9393     subu      rBIX, rBIX, 1                #  length--, check for neg
   9394     FETCH_ADVANCE_INST(3)                  #  advance to next instr, load rINST
   9395     bltz      rBIX, 2f                     #  was zero, bail
   9396 
   9397     # copy values from registers into the array
   9398     # a0=array, a1=CCCC/FEDC, t0=length (from AA or B), rOBJ=AA/BA
   9399     move      t0, rBIX
   9400     .if 0
   9401     EAS2(a2, rFP, a1)                      #  a2 <- &fp[CCCC]
   9402 1:
   9403     lw        a3, 0(a2)                    #  a3 <- *a2++
   9404     addu      a2, 4
   9405     subu      t0, t0, 1                    #  count--
   9406     sw        a3, (a0)                     #  *contents++ = vX
   9407     addu      a0, 4
   9408     bgez      t0, 1b
   9409 
   9410     # continue at 2
   9411     .else
   9412     slt       t1, t0, 4                    #  length was initially 5?
   9413     and       a2, rOBJ, 15                 #  a2 <- A
   9414     bnez      t1, 1f                       #  <= 4 args, branch
   9415     GET_VREG(a3, a2)                       #  a3 <- vA
   9416     subu      t0, t0, 1                    #  count--
   9417     sw        a3, 16(a0)                   #  contents[4] = vA
   9418 1:
   9419     and       a2, a1, 15                   #  a2 <- F/E/D/C
   9420     GET_VREG(a3, a2)                       #  a3 <- vF/vE/vD/vC
   9421     srl       a1, a1, 4                    #  a1 <- next reg in low 4
   9422     subu      t0, t0, 1                    #  count--
   9423     sw        a3, 0(a0)                    #  *contents++ = vX
   9424     addu      a0, a0, 4
   9425     bgez      t0, 1b
   9426     # continue at 2
   9427     .endif
   9428 
   9429 2:
   9430     lw        a0, offThread_retval(rSELF)  #  a0 <- object
   9431     lw        a1, (offThread_retval+4)(rSELF) #  a1 <- type
   9432     seq       t1, a1, 'I'                  #  Is int array?
   9433     bnez      t1, 3f
   9434     lw        a2, offThread_cardTable(rSELF) #  a2 <- card table base
   9435     srl       t3, a0, GC_CARD_SHIFT
   9436     addu      t2, a2, t3
   9437     sb        a2, (t2)
   9438 3:
   9439     GET_INST_OPCODE(t0)                    #  ip <- opcode from rINST
   9440     GOTO_OPCODE(t0)                        #  execute it
   9441 
   9442 
   9443     /*
   9444      * Throw an exception indicating that we have not implemented this
   9445      * mode of filled-new-array.
   9446      */
   9447 .LOP_FILLED_NEW_ARRAY_notimpl:
   9448     la        a0, .LstrFilledNewArrayNotImpl
   9449     JAL(dvmThrowInternalError)
   9450     b         common_exceptionThrown
   9451 
   9452     /*
   9453      * Ideally we'd only define this once, but depending on layout we can
   9454      * exceed the range of the load above.
   9455      */
   9456 
   9457 /* continuation for OP_FILLED_NEW_ARRAY_RANGE */
   9458 
   9459     /*
   9460      * On entry:
   9461      *  a0 holds array class
   9462      *  rOBJ holds AA or BA
   9463      */
   9464 .LOP_FILLED_NEW_ARRAY_RANGE_continue:
   9465     LOAD_base_offClassObject_descriptor(a3, a0) #  a3 <- arrayClass->descriptor
   9466     li        a2, ALLOC_DONT_TRACK         #  a2 <- alloc flags
   9467     lbu       rINST, 1(a3)                 #  rINST <- descriptor[1]
   9468     .if 1
   9469     move      a1, rOBJ                     #  a1 <- AA (length)
   9470     .else
   9471     srl       a1, rOBJ, 4                  #  rOBJ <- B (length)
   9472     .endif
   9473     seq       t0, rINST, 'I'               #  array of ints?
   9474     seq       t1, rINST, 'L'               #  array of objects?
   9475     or        t0, t1
   9476     seq       t1, rINST, '['               #  array of arrays?
   9477     or        t0, t1
   9478     move      rBIX, a1                     #  save length in rBIX
   9479     beqz      t0, .LOP_FILLED_NEW_ARRAY_RANGE_notimpl      #  no, not handled yet
   9480     JAL(dvmAllocArrayByClass)              #  v0 <- call(arClass, length, flags)
   9481     # null return?
   9482     beqz      v0, common_exceptionThrown   #  alloc failed, handle exception
   9483 
   9484     FETCH(a1, 2)                           #  a1 <- FEDC or CCCC
   9485     sw        v0, offThread_retval(rSELF)  #  retval.l <- new array
   9486     sw        rINST, (offThread_retval+4)(rSELF) #  retval.h <- type
   9487     addu      a0, v0, offArrayObject_contents #  a0 <- newArray->contents
   9488     subu      rBIX, rBIX, 1                #  length--, check for neg
   9489     FETCH_ADVANCE_INST(3)                  #  advance to next instr, load rINST
   9490     bltz      rBIX, 2f                     #  was zero, bail
   9491 
   9492     # copy values from registers into the array
   9493     # a0=array, a1=CCCC/FEDC, t0=length (from AA or B), rOBJ=AA/BA
   9494     move      t0, rBIX
   9495     .if 1
   9496     EAS2(a2, rFP, a1)                      #  a2 <- &fp[CCCC]
   9497 1:
   9498     lw        a3, 0(a2)                    #  a3 <- *a2++
   9499     addu      a2, 4
   9500     subu      t0, t0, 1                    #  count--
   9501     sw        a3, (a0)                     #  *contents++ = vX
   9502     addu      a0, 4
   9503     bgez      t0, 1b
   9504 
   9505     # continue at 2
   9506     .else
   9507     slt       t1, t0, 4                    #  length was initially 5?
   9508     and       a2, rOBJ, 15                 #  a2 <- A
   9509     bnez      t1, 1f                       #  <= 4 args, branch
   9510     GET_VREG(a3, a2)                       #  a3 <- vA
   9511     subu      t0, t0, 1                    #  count--
   9512     sw        a3, 16(a0)                   #  contents[4] = vA
   9513 1:
   9514     and       a2, a1, 15                   #  a2 <- F/E/D/C
   9515     GET_VREG(a3, a2)                       #  a3 <- vF/vE/vD/vC
   9516     srl       a1, a1, 4                    #  a1 <- next reg in low 4
   9517     subu      t0, t0, 1                    #  count--
   9518     sw        a3, 0(a0)                    #  *contents++ = vX
   9519     addu      a0, a0, 4
   9520     bgez      t0, 1b
   9521     # continue at 2
   9522     .endif
   9523 
   9524 2:
   9525     lw        a0, offThread_retval(rSELF)  #  a0 <- object
   9526     lw        a1, (offThread_retval+4)(rSELF) #  a1 <- type
   9527     seq       t1, a1, 'I'                  #  Is int array?
   9528     bnez      t1, 3f
   9529     lw        a2, offThread_cardTable(rSELF) #  a2 <- card table base
   9530     srl       t3, a0, GC_CARD_SHIFT
   9531     addu      t2, a2, t3
   9532     sb        a2, (t2)
   9533 3:
   9534     GET_INST_OPCODE(t0)                    #  ip <- opcode from rINST
   9535     GOTO_OPCODE(t0)                        #  execute it
   9536 
   9537 
   9538     /*
   9539      * Throw an exception indicating that we have not implemented this
   9540      * mode of filled-new-array.
   9541      */
   9542 .LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
   9543     la        a0, .LstrFilledNewArrayNotImpl
   9544     JAL(dvmThrowInternalError)
   9545     b         common_exceptionThrown
   9546 
   9547     /*
   9548      * Ideally we'd only define this once, but depending on layout we can
   9549      * exceed the range of the load above.
   9550      */
   9551 
   9552 /* continuation for OP_CMPL_FLOAT */
   9553 
   9554 OP_CMPL_FLOAT_nan:
   9555     li rTEMP, -1
   9556     b         OP_CMPL_FLOAT_finish
   9557 
   9558 #ifdef SOFT_FLOAT
   9559 OP_CMPL_FLOAT_continue:
   9560     JAL(__gtsf2)                           #  v0 <- (vBB > vCC)
   9561     li        rTEMP, 1                     #  rTEMP = 1 if v0 != 0
   9562     bgtz      v0, OP_CMPL_FLOAT_finish
   9563     b         OP_CMPL_FLOAT_nan
   9564 #endif
   9565 
   9566 OP_CMPL_FLOAT_finish:
   9567     GET_OPA(t0)
   9568     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9569     SET_VREG(rTEMP, t0)                    #  vAA <- rTEMP
   9570     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9571     GOTO_OPCODE(t0)
   9572 
   9573 /* continuation for OP_CMPG_FLOAT */
   9574 
   9575 OP_CMPG_FLOAT_nan:
   9576     li rTEMP, 1
   9577     b         OP_CMPG_FLOAT_finish
   9578 
   9579 #ifdef SOFT_FLOAT
   9580 OP_CMPG_FLOAT_continue:
   9581     JAL(__gtsf2)                           #  v0 <- (vBB > vCC)
   9582     li        rTEMP, 1                     #  rTEMP = 1 if v0 != 0
   9583     bgtz      v0, OP_CMPG_FLOAT_finish
   9584     b         OP_CMPG_FLOAT_nan
   9585 #endif
   9586 
   9587 OP_CMPG_FLOAT_finish:
   9588     GET_OPA(t0)
   9589     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9590     SET_VREG(rTEMP, t0)                    #  vAA <- rTEMP
   9591     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9592     GOTO_OPCODE(t0)
   9593 
   9594 /* continuation for OP_CMPL_DOUBLE */
   9595 
   9596 OP_CMPL_DOUBLE_nan:
   9597     li rTEMP, -1
   9598     b         OP_CMPL_DOUBLE_finish
   9599 
   9600 #ifdef SOFT_FLOAT
   9601 OP_CMPL_DOUBLE_continue:
   9602     LOAD64(rARG2, rARG3, rBIX)             #  a2/a3 <- vCC/vCC+1
   9603     JAL(__gtdf2)                           #  fallthru
   9604     li        rTEMP, 1                     #  rTEMP = 1 if v0 != 0
   9605     blez      v0, OP_CMPL_DOUBLE_nan            #  fall thru for finish
   9606 #endif
   9607 
   9608 OP_CMPL_DOUBLE_finish:
   9609     GET_OPA(rOBJ)
   9610     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9611     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9612     SET_VREG_GOTO(rTEMP, rOBJ, t0)         #  vAA <- rTEMP
   9613 
   9614 /* continuation for OP_CMPG_DOUBLE */
   9615 
   9616 OP_CMPG_DOUBLE_nan:
   9617     li rTEMP, 1
   9618     b         OP_CMPG_DOUBLE_finish
   9619 
   9620 #ifdef SOFT_FLOAT
   9621 OP_CMPG_DOUBLE_continue:
   9622     LOAD64(rARG2, rARG3, rBIX)             #  a2/a3 <- vCC/vCC+1
   9623     JAL(__gtdf2)                           #  fallthru
   9624     li        rTEMP, 1                     #  rTEMP = 1 if v0 != 0
   9625     blez      v0, OP_CMPG_DOUBLE_nan            #  fall thru for finish
   9626 #endif
   9627 
   9628 OP_CMPG_DOUBLE_finish:
   9629     GET_OPA(rOBJ)
   9630     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9631     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9632     SET_VREG_GOTO(rTEMP, rOBJ, t0)         #  vAA <- rTEMP
   9633 
   9634 /* continuation for OP_APUT_OBJECT */
   9635 .LOP_APUT_OBJECT_checks:
   9636     LOAD_base_offObject_clazz(a0, rBIX)    #  a0 <- obj->clazz
   9637     LOAD_base_offObject_clazz(a1, rINST)   #  a1 <- arrayObj->clazz
   9638     JAL(dvmCanPutArrayElement)             #  test object type vs. array type
   9639     beqz      v0, .LOP_APUT_OBJECT_throw        #  okay ?
   9640     lw        a2, offThread_cardTable(rSELF)
   9641     srl       t1, rINST, GC_CARD_SHIFT
   9642     addu      t2, a2, t1
   9643     sb        a2, (t2)
   9644     b         .LOP_APUT_OBJECT_finish           #  yes, skip type checks
   9645 .LOP_APUT_OBJECT_throw:
   9646     LOAD_base_offObject_clazz(a0, rBIX)    #  a0 <- obj->clazz
   9647     LOAD_base_offObject_clazz(a1, rINST)   #  a1 <- arrayObj->clazz
   9648     EXPORT_PC()
   9649     JAL(dvmThrowArrayStoreExceptionIncompatibleElement)
   9650     b         common_exceptionThrown
   9651 
   9652 /* continuation for OP_IGET */
   9653 
   9654     /*
   9655      * Currently:
   9656      *  v0 holds resolved field
   9657      *  rOBJ holds object (caller saved)
   9658      */
   9659 .LOP_IGET_finish:
   9660     #BAL(common_squeak0)
   9661     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9662     # check object for null
   9663     beqz      rOBJ, common_errNullObject   #  object was null
   9664     addu      a3, a3, rOBJ                 #  form address
   9665     lw a0, (a3)                         #  a0 <- obj.field (8/16/32 bits)
   9666          # noop                               #  acquiring load
   9667     GET_OPA4(a2)                           #  a2 <- A+
   9668     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9669     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9670     SET_VREG(a0, a2)                       #  fp[A] <- a0
   9671     GOTO_OPCODE(t0)                        #  jump to next instruction
   9672 
   9673 
   9674 /* continuation for OP_IGET_WIDE */
   9675 
   9676     /*
   9677      * Currently:
   9678      *  a0   holds resolved field
   9679      *  rOBJ holds object
   9680      */
   9681 .LOP_IGET_WIDE_finish:
   9682     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9683     beqz      rOBJ, common_errNullObject   #  object was null
   9684     GET_OPA4(a2)                           #  a2 <- A+
   9685     addu      rOBJ, rOBJ, a3               #  form address
   9686     .if 0
   9687     vLOAD64(a0, a1, rOBJ)                  #  a0/a1 <- obj.field (64-bit align ok)
   9688     .else
   9689     LOAD64(a0, a1, rOBJ)                   #  a0/a1 <- obj.field (64-bit align ok)
   9690     .endif
   9691     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9692     EAS2(a3, rFP, a2)                      #  a3 <- &fp[A]
   9693     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9694     STORE64(a0, a1, a3)                    #  fp[A] <- a0/a1
   9695     GOTO_OPCODE(t0)                        #  jump to next instruction
   9696 
   9697 
   9698 /* continuation for OP_IGET_OBJECT */
   9699 
   9700     /*
   9701      * Currently:
   9702      *  v0 holds resolved field
   9703      *  rOBJ holds object (caller saved)
   9704      */
   9705 .LOP_IGET_OBJECT_finish:
   9706     #BAL(common_squeak0)
   9707     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9708     # check object for null
   9709     beqz      rOBJ, common_errNullObject   #  object was null
   9710     addu      a3, a3, rOBJ                 #  form address
   9711     lw a0, (a3)                         #  a0 <- obj.field (8/16/32 bits)
   9712          # noop                               #  acquiring load
   9713     GET_OPA4(a2)                           #  a2 <- A+
   9714     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9715     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9716     SET_VREG(a0, a2)                       #  fp[A] <- a0
   9717     GOTO_OPCODE(t0)                        #  jump to next instruction
   9718 
   9719 
   9720 /* continuation for OP_IGET_BOOLEAN */
   9721 
   9722     /*
   9723      * Currently:
   9724      *  v0 holds resolved field
   9725      *  rOBJ holds object (caller saved)
   9726      */
   9727 .LOP_IGET_BOOLEAN_finish:
   9728     #BAL(common_squeak0)
   9729     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9730     # check object for null
   9731     beqz      rOBJ, common_errNullObject   #  object was null
   9732     addu      a3, a3, rOBJ                 #  form address
   9733     lw a0, (a3)                         #  a0 <- obj.field (8/16/32 bits)
   9734          # noop                               #  acquiring load
   9735     GET_OPA4(a2)                           #  a2 <- A+
   9736     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9737     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9738     SET_VREG(a0, a2)                       #  fp[A] <- a0
   9739     GOTO_OPCODE(t0)                        #  jump to next instruction
   9740 
   9741 
   9742 /* continuation for OP_IGET_BYTE */
   9743 
   9744     /*
   9745      * Currently:
   9746      *  v0 holds resolved field
   9747      *  rOBJ holds object (caller saved)
   9748      */
   9749 .LOP_IGET_BYTE_finish:
   9750     #BAL(common_squeak0)
   9751     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9752     # check object for null
   9753     beqz      rOBJ, common_errNullObject   #  object was null
   9754     addu      a3, a3, rOBJ                 #  form address
   9755     lw a0, (a3)                         #  a0 <- obj.field (8/16/32 bits)
   9756          # noop                               #  acquiring load
   9757     GET_OPA4(a2)                           #  a2 <- A+
   9758     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9759     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9760     SET_VREG(a0, a2)                       #  fp[A] <- a0
   9761     GOTO_OPCODE(t0)                        #  jump to next instruction
   9762 
   9763 
   9764 /* continuation for OP_IGET_CHAR */
   9765 
   9766     /*
   9767      * Currently:
   9768      *  v0 holds resolved field
   9769      *  rOBJ holds object (caller saved)
   9770      */
   9771 .LOP_IGET_CHAR_finish:
   9772     #BAL(common_squeak0)
   9773     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9774     # check object for null
   9775     beqz      rOBJ, common_errNullObject   #  object was null
   9776     addu      a3, a3, rOBJ                 #  form address
   9777     lw a0, (a3)                         #  a0 <- obj.field (8/16/32 bits)
   9778          # noop                               #  acquiring load
   9779     GET_OPA4(a2)                           #  a2 <- A+
   9780     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9781     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9782     SET_VREG(a0, a2)                       #  fp[A] <- a0
   9783     GOTO_OPCODE(t0)                        #  jump to next instruction
   9784 
   9785 
   9786 /* continuation for OP_IGET_SHORT */
   9787 
   9788     /*
   9789      * Currently:
   9790      *  v0 holds resolved field
   9791      *  rOBJ holds object (caller saved)
   9792      */
   9793 .LOP_IGET_SHORT_finish:
   9794     #BAL(common_squeak0)
   9795     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9796     # check object for null
   9797     beqz      rOBJ, common_errNullObject   #  object was null
   9798     addu      a3, a3, rOBJ                 #  form address
   9799     lw a0, (a3)                         #  a0 <- obj.field (8/16/32 bits)
   9800          # noop                               #  acquiring load
   9801     GET_OPA4(a2)                           #  a2 <- A+
   9802     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9803     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9804     SET_VREG(a0, a2)                       #  fp[A] <- a0
   9805     GOTO_OPCODE(t0)                        #  jump to next instruction
   9806 
   9807 
   9808 /* continuation for OP_IPUT */
   9809 
   9810     /*
   9811      * Currently:
   9812      *  a0 holds resolved field
   9813      *  rOBJ holds object
   9814      */
   9815 .LOP_IPUT_finish:
   9816     #BAL(common_squeak0)
   9817     GET_OPA4(a1)                           #  a1 <- A+
   9818     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9819     GET_VREG(a0, a1)                       #  a0 <- fp[A]
   9820     # check object for null
   9821     beqz      rOBJ, common_errNullObject   #  object was null
   9822     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9823     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9824     addu      rOBJ, rOBJ, a3               #  form address
   9825         #  noop                            #  releasing store
   9826     sw a0, (rOBJ)                      #  obj.field (8/16/32 bits) <- a0
   9827         #  noop
   9828     GOTO_OPCODE(t0)                        #  jump to next instruction
   9829 
   9830 
   9831 /* continuation for OP_IPUT_WIDE */
   9832 
   9833     /*
   9834      * Currently:
   9835      *  a0   holds resolved field
   9836      *  rOBJ holds object
   9837      */
   9838 .LOP_IPUT_WIDE_finish:
   9839     GET_OPA4(a2)                           #  a2 <- A+
   9840     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9841     EAS2(a2, rFP, a2)                      #  a2 <- &fp[A]
   9842     # check object for null
   9843     beqz      rOBJ, common_errNullObject   #  object was null
   9844     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9845     LOAD64(a0, a1, a2)                     #  a0/a1 <- fp[A]
   9846     GET_INST_OPCODE(rBIX)                  #  extract opcode from rINST
   9847     addu      a2, rOBJ, a3                 #  form address
   9848     .if 0
   9849     JAL(dvmQuasiAtomicSwap64Sync)          # stores r0/r1 into addr r2
   9850 #    STORE64(a0, a1, a2)                    #  obj.field (64 bits, aligned) <- a0 a1
   9851     .else
   9852     STORE64(a0, a1, a2)                    #  obj.field (64 bits, aligned) <- a0 a1
   9853     .endif
   9854     GOTO_OPCODE(rBIX)                      #  jump to next instruction
   9855 
   9856 
   9857 /* continuation for OP_IPUT_OBJECT */
   9858 
   9859     /*
   9860      * Currently:
   9861      *  a0 holds resolved field
   9862      *  rOBJ holds object
   9863      */
   9864 .LOP_IPUT_OBJECT_finish:
   9865     #BAL(common_squeak0)
   9866     GET_OPA4(a1)                           #  a1 <- A+
   9867     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9868     GET_VREG(a0, a1)                       #  a0 <- fp[A]
   9869     lw        a2, offThread_cardTable(rSELF) #  a2 <- card table base
   9870     # check object for null
   9871     beqz      rOBJ, common_errNullObject   #  object was null
   9872     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9873     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9874     addu      t2, rOBJ, a3                 #  form address
   9875         #  noop                            #  releasing store
   9876     sw a0, (t2)                        #  obj.field (32 bits) <- a0
   9877         #  noop
   9878     beqz      a0, 1f                       #  stored a null reference?
   9879     srl       t1, rOBJ, GC_CARD_SHIFT
   9880     addu      t2, a2, t1
   9881     sb        a2, (t2)                     #  mark card if not
   9882 1:
   9883     GOTO_OPCODE(t0)                        #  jump to next instruction
   9884 
   9885 
   9886 /* continuation for OP_IPUT_BOOLEAN */
   9887 
   9888     /*
   9889      * Currently:
   9890      *  a0 holds resolved field
   9891      *  rOBJ holds object
   9892      */
   9893 .LOP_IPUT_BOOLEAN_finish:
   9894     #BAL(common_squeak0)
   9895     GET_OPA4(a1)                           #  a1 <- A+
   9896     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9897     GET_VREG(a0, a1)                       #  a0 <- fp[A]
   9898     # check object for null
   9899     beqz      rOBJ, common_errNullObject   #  object was null
   9900     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9901     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9902     addu      rOBJ, rOBJ, a3               #  form address
   9903         #  noop                            #  releasing store
   9904     sw a0, (rOBJ)                      #  obj.field (8/16/32 bits) <- a0
   9905         #  noop
   9906     GOTO_OPCODE(t0)                        #  jump to next instruction
   9907 
   9908 
   9909 /* continuation for OP_IPUT_BYTE */
   9910 
   9911     /*
   9912      * Currently:
   9913      *  a0 holds resolved field
   9914      *  rOBJ holds object
   9915      */
   9916 .LOP_IPUT_BYTE_finish:
   9917     #BAL(common_squeak0)
   9918     GET_OPA4(a1)                           #  a1 <- A+
   9919     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9920     GET_VREG(a0, a1)                       #  a0 <- fp[A]
   9921     # check object for null
   9922     beqz      rOBJ, common_errNullObject   #  object was null
   9923     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9924     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9925     addu      rOBJ, rOBJ, a3               #  form address
   9926         #  noop                            #  releasing store
   9927     sw a0, (rOBJ)                      #  obj.field (8/16/32 bits) <- a0
   9928         #  noop
   9929     GOTO_OPCODE(t0)                        #  jump to next instruction
   9930 
   9931 
   9932 /* continuation for OP_IPUT_CHAR */
   9933 
   9934     /*
   9935      * Currently:
   9936      *  a0 holds resolved field
   9937      *  rOBJ holds object
   9938      */
   9939 .LOP_IPUT_CHAR_finish:
   9940     #BAL(common_squeak0)
   9941     GET_OPA4(a1)                           #  a1 <- A+
   9942     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9943     GET_VREG(a0, a1)                       #  a0 <- fp[A]
   9944     # check object for null
   9945     beqz      rOBJ, common_errNullObject   #  object was null
   9946     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9947     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9948     addu      rOBJ, rOBJ, a3               #  form address
   9949         #  noop                            #  releasing store
   9950     sw a0, (rOBJ)                      #  obj.field (8/16/32 bits) <- a0
   9951         #  noop
   9952     GOTO_OPCODE(t0)                        #  jump to next instruction
   9953 
   9954 
   9955 /* continuation for OP_IPUT_SHORT */
   9956 
   9957     /*
   9958      * Currently:
   9959      *  a0 holds resolved field
   9960      *  rOBJ holds object
   9961      */
   9962 .LOP_IPUT_SHORT_finish:
   9963     #BAL(common_squeak0)
   9964     GET_OPA4(a1)                           #  a1 <- A+
   9965     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   9966     GET_VREG(a0, a1)                       #  a0 <- fp[A]
   9967     # check object for null
   9968     beqz      rOBJ, common_errNullObject   #  object was null
   9969     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9970     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9971     addu      rOBJ, rOBJ, a3               #  form address
   9972         #  noop                            #  releasing store
   9973     sw a0, (rOBJ)                      #  obj.field (8/16/32 bits) <- a0
   9974         #  noop
   9975     GOTO_OPCODE(t0)                        #  jump to next instruction
   9976 
   9977 
   9978 /* continuation for OP_SGET */
   9979 
   9980 .LOP_SGET_finish:
   9981     LOAD_base_offStaticField_value(a1, a0) #  a1 <- field value
   9982                       #  no-op                                #  acquiring load
   9983     GET_OPA(a2)                            #  a2 <- AA
   9984     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9985     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   9986     SET_VREG_GOTO(a1, a2, t0)              #  fp[AA] <- a1
   9987 
   9988 /* continuation for OP_SGET_WIDE */
   9989 
   9990 .LOP_SGET_WIDE_finish:
   9991     GET_OPA(a1)                            #  a1 <- AA
   9992     .if 0
   9993     vLOAD64_off(a2, a3, a0, offStaticField_value) #  a2/a3 <- field value (aligned)
   9994     .else
   9995     LOAD64_off(a2, a3, a0, offStaticField_value) #  a2/a3 <- field value (aligned)
   9996     .endif
   9997     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   9998     EAS2(a1, rFP, a1)                      #  a1 <- &fp[AA]
   9999     STORE64(a2, a3, a1)                    #  vAA/vAA+1 <- a2/a3
   10000     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10001     GOTO_OPCODE(t0)                        #  jump to next instruction
   10002 
   10003 
   10004 
   10005 /* continuation for OP_SGET_OBJECT */
   10006 
   10007 .LOP_SGET_OBJECT_finish:
   10008     LOAD_base_offStaticField_value(a1, a0) #  a1 <- field value
   10009                       #  no-op                                #  acquiring load
   10010     GET_OPA(a2)                            #  a2 <- AA
   10011     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10012     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10013     SET_VREG_GOTO(a1, a2, t0)              #  fp[AA] <- a1
   10014 
   10015 /* continuation for OP_SGET_BOOLEAN */
   10016 
   10017 .LOP_SGET_BOOLEAN_finish:
   10018     LOAD_base_offStaticField_value(a1, a0) #  a1 <- field value
   10019                       #  no-op                                #  acquiring load
   10020     GET_OPA(a2)                            #  a2 <- AA
   10021     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10022     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10023     SET_VREG_GOTO(a1, a2, t0)              #  fp[AA] <- a1
   10024 
   10025 /* continuation for OP_SGET_BYTE */
   10026 
   10027 .LOP_SGET_BYTE_finish:
   10028     LOAD_base_offStaticField_value(a1, a0) #  a1 <- field value
   10029                       #  no-op                                #  acquiring load
   10030     GET_OPA(a2)                            #  a2 <- AA
   10031     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10032     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10033     SET_VREG_GOTO(a1, a2, t0)              #  fp[AA] <- a1
   10034 
   10035 /* continuation for OP_SGET_CHAR */
   10036 
   10037 .LOP_SGET_CHAR_finish:
   10038     LOAD_base_offStaticField_value(a1, a0) #  a1 <- field value
   10039                       #  no-op                                #  acquiring load
   10040     GET_OPA(a2)                            #  a2 <- AA
   10041     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10042     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10043     SET_VREG_GOTO(a1, a2, t0)              #  fp[AA] <- a1
   10044 
   10045 /* continuation for OP_SGET_SHORT */
   10046 
   10047 .LOP_SGET_SHORT_finish:
   10048     LOAD_base_offStaticField_value(a1, a0) #  a1 <- field value
   10049                       #  no-op                                #  acquiring load
   10050     GET_OPA(a2)                            #  a2 <- AA
   10051     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10052     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10053     SET_VREG_GOTO(a1, a2, t0)              #  fp[AA] <- a1
   10054 
   10055 /* continuation for OP_SPUT */
   10056 
   10057 .LOP_SPUT_finish:
   10058     # field ptr in a0
   10059     GET_OPA(a2)                            #  a2 <- AA
   10060     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10061     GET_VREG(a1, a2)                       #  a1 <- fp[AA]
   10062     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10063     #  no-op                            #  releasing store
   10064     sw        a1, offStaticField_value(a0) #  field <- vAA
   10065     #  no-op
   10066     GOTO_OPCODE(t0)                        #  jump to next instruction
   10067 
   10068 /* continuation for OP_SPUT_WIDE */
   10069 
   10070     /*
   10071      * Continuation if the field has not yet been resolved.
   10072      *  a1:  BBBB field ref
   10073      *  rOBJ:  &fp[AA]
   10074      *  rBIX: dvmDex->pResFields
   10075      *
   10076      * Returns StaticField pointer in a2.
   10077      */
   10078 .LOP_SPUT_WIDE_resolve:
   10079     LOAD_rSELF_method(a2)                  #  a2 <- current method
   10080 #if defined(WITH_JIT)
   10081     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   10082 #endif
   10083     EXPORT_PC()                            #  resolve() could throw, so export now
   10084     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   10085     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   10086     # success ?
   10087     move      a0, v0
   10088     beqz      v0, common_exceptionThrown   #  no, handle exception
   10089 #if defined(WITH_JIT)
   10090     /*
   10091      * If the JIT is actively building a trace we need to make sure
   10092      * that the field is fully resolved before including this instruction.
   10093      */
   10094     JAL(common_verifyField)
   10095 #endif
   10096     move      a2, v0
   10097     b         .LOP_SPUT_WIDE_finish           # resume
   10098 
   10099 /* continuation for OP_SPUT_OBJECT */
   10100 .LOP_SPUT_OBJECT_finish:                        #  field ptr in a0
   10101     GET_OPA(a2)                            #  a2 <- AA
   10102     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10103     GET_VREG(a1, a2)                       #  a1 <- fp[AA]
   10104     lw        a2, offThread_cardTable(rSELF) #  a2 <- card table base
   10105     lw        t1, offField_clazz(a0)       #  t1 <- field->clazz
   10106     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10107     #  no-op                            #  releasing store
   10108     sw        a1, offStaticField_value(a0) #  field <- vAA
   10109     #  no-op
   10110     beqz      a1, 1f
   10111     srl       t2, t1, GC_CARD_SHIFT
   10112     addu      t3, a2, t2
   10113     sb        a2, (t3)
   10114 1:
   10115     GOTO_OPCODE(t0)                        #  jump to next instruction
   10116 
   10117 /* continuation for OP_SPUT_BOOLEAN */
   10118 
   10119 .LOP_SPUT_BOOLEAN_finish:
   10120     # field ptr in a0
   10121     GET_OPA(a2)                            #  a2 <- AA
   10122     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10123     GET_VREG(a1, a2)                       #  a1 <- fp[AA]
   10124     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10125     #  no-op                            #  releasing store
   10126     sw        a1, offStaticField_value(a0) #  field <- vAA
   10127     #  no-op
   10128     GOTO_OPCODE(t0)                        #  jump to next instruction
   10129 
   10130 /* continuation for OP_SPUT_BYTE */
   10131 
   10132 .LOP_SPUT_BYTE_finish:
   10133     # field ptr in a0
   10134     GET_OPA(a2)                            #  a2 <- AA
   10135     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10136     GET_VREG(a1, a2)                       #  a1 <- fp[AA]
   10137     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10138     #  no-op                            #  releasing store
   10139     sw        a1, offStaticField_value(a0) #  field <- vAA
   10140     #  no-op
   10141     GOTO_OPCODE(t0)                        #  jump to next instruction
   10142 
   10143 /* continuation for OP_SPUT_CHAR */
   10144 
   10145 .LOP_SPUT_CHAR_finish:
   10146     # field ptr in a0
   10147     GET_OPA(a2)                            #  a2 <- AA
   10148     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10149     GET_VREG(a1, a2)                       #  a1 <- fp[AA]
   10150     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10151     #  no-op                            #  releasing store
   10152     sw        a1, offStaticField_value(a0) #  field <- vAA
   10153     #  no-op
   10154     GOTO_OPCODE(t0)                        #  jump to next instruction
   10155 
   10156 /* continuation for OP_SPUT_SHORT */
   10157 
   10158 .LOP_SPUT_SHORT_finish:
   10159     # field ptr in a0
   10160     GET_OPA(a2)                            #  a2 <- AA
   10161     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10162     GET_VREG(a1, a2)                       #  a1 <- fp[AA]
   10163     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10164     #  no-op                            #  releasing store
   10165     sw        a1, offStaticField_value(a0) #  field <- vAA
   10166     #  no-op
   10167     GOTO_OPCODE(t0)                        #  jump to next instruction
   10168 
   10169 /* continuation for OP_INVOKE_VIRTUAL */
   10170 
   10171     /*
   10172      * At this point:
   10173      *  a0 = resolved base method
   10174      *  rBIX= C or CCCC (index of first arg, which is the "this" ptr)
   10175      */
   10176 .LOP_INVOKE_VIRTUAL_continue:
   10177     GET_VREG(rOBJ, rBIX)                   #  rOBJ <- "this" ptr
   10178     LOADu2_offMethod_methodIndex(a2, a0)   #  a2 <- baseMethod->methodIndex
   10179     # is "this" null?
   10180     beqz      rOBJ, common_errNullObject   #  null "this", throw exception
   10181     LOAD_base_offObject_clazz(a3, rOBJ)    #  a3 <- thisPtr->clazz
   10182     LOAD_base_offClassObject_vtable(a3, a3) #  a3 <- thisPtr->clazz->vtable
   10183     LOAD_eas2(a0, a3, a2)                  #  a0 <- vtable[methodIndex]
   10184     b         common_invokeMethodNoRange #  (a0=method, rOBJ="this")
   10185 
   10186 
   10187 /* continuation for OP_INVOKE_SUPER */
   10188 
   10189     /*
   10190      * At this point:
   10191      *  a0 = resolved base method
   10192      *  rBIX = method->clazz
   10193      */
   10194 .LOP_INVOKE_SUPER_continue:
   10195     LOAD_base_offClassObject_super(a1, rBIX) #  a1 <- method->clazz->super
   10196     LOADu2_offMethod_methodIndex(a2, a0)   #  a2 <- baseMethod->methodIndex
   10197     LOAD_base_offClassObject_vtableCount(a3, a1) #  a3 <- super->vtableCount
   10198     EXPORT_PC()                            #  must export for invoke
   10199     # compare (methodIndex, vtableCount)
   10200     bgeu      a2, a3, .LOP_INVOKE_SUPER_nsm      #  method not present in superclass
   10201     LOAD_base_offClassObject_vtable(a1, a1) #  a1 <- ...clazz->super->vtable
   10202     LOAD_eas2(a0, a1, a2)                  #  a0 <- vtable[methodIndex]
   10203     b         common_invokeMethodNoRange #  continue on
   10204 
   10205     /*
   10206      * Throw a NoSuchMethodError with the method name as the message.
   10207      *  a0 = resolved base method
   10208      */
   10209 .LOP_INVOKE_SUPER_nsm:
   10210     LOAD_base_offMethod_name(a1, a0)       #  a1 <- method name
   10211     b         common_errNoSuchMethod
   10212 
   10213 
   10214 /* continuation for OP_INVOKE_STATIC */
   10215 
   10216 .LOP_INVOKE_STATIC_resolve:
   10217     LOAD_rSELF_method(a3)                  #  a3 <- self->method
   10218     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   10219     li        a2, METHOD_STATIC            #  resolver method type
   10220     JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
   10221     move      a0, v0
   10222 #if defined(WITH_JIT)
   10223     /*
   10224      * Check to see if we're actively building a trace.  If so,
   10225      * we need to keep this instruction out of it.
   10226      * rBIX: &resolved_methodToCall
   10227      */
   10228     lhu       a2, offThread_subMode(rSELF)
   10229     beqz      v0, common_exceptionThrown   #  null, handle exception
   10230     and       a2, kSubModeJitTraceBuild    #  trace under construction?
   10231     beqz      a2, common_invokeMethodNoRange #  no, (a0=method, rOBJ="this")
   10232     lw        a1, 0(rBIX)                  #  reload resolved method
   10233     # finished resloving?
   10234     bnez      a1, common_invokeMethodNoRange #  yes, (a0=method, rOBJ="this")
   10235     move      rBIX, a0                     #  preserve method
   10236     move      a0, rSELF
   10237     move      a1, rPC
   10238     JAL(dvmJitEndTraceSelect)              #  (self, pc)
   10239     move      a0, rBIX
   10240     b         common_invokeMethodNoRange #  whew, finally!
   10241 #else
   10242     # got null?
   10243     bnez      v0, common_invokeMethodNoRange #  (a0=method, rOBJ="this")
   10244     b         common_exceptionThrown       #  yes, handle exception
   10245 #endif
   10246 
   10247 /* continuation for OP_INVOKE_VIRTUAL_RANGE */
   10248 
   10249     /*
   10250      * At this point:
   10251      *  a0 = resolved base method
   10252      *  rBIX= C or CCCC (index of first arg, which is the "this" ptr)
   10253      */
   10254 .LOP_INVOKE_VIRTUAL_RANGE_continue:
   10255     GET_VREG(rOBJ, rBIX)                   #  rOBJ <- "this" ptr
   10256     LOADu2_offMethod_methodIndex(a2, a0)   #  a2 <- baseMethod->methodIndex
   10257     # is "this" null?
   10258     beqz      rOBJ, common_errNullObject   #  null "this", throw exception
   10259     LOAD_base_offObject_clazz(a3, rOBJ)    #  a3 <- thisPtr->clazz
   10260     LOAD_base_offClassObject_vtable(a3, a3) #  a3 <- thisPtr->clazz->vtable
   10261     LOAD_eas2(a0, a3, a2)                  #  a0 <- vtable[methodIndex]
   10262     b         common_invokeMethodRange #  (a0=method, rOBJ="this")
   10263 
   10264 
   10265 /* continuation for OP_INVOKE_SUPER_RANGE */
   10266 
   10267     /*
   10268      * At this point:
   10269      *  a0 = resolved base method
   10270      *  rBIX = method->clazz
   10271      */
   10272 .LOP_INVOKE_SUPER_RANGE_continue:
   10273     LOAD_base_offClassObject_super(a1, rBIX) #  a1 <- method->clazz->super
   10274     LOADu2_offMethod_methodIndex(a2, a0)   #  a2 <- baseMethod->methodIndex
   10275     LOAD_base_offClassObject_vtableCount(a3, a1) #  a3 <- super->vtableCount
   10276     EXPORT_PC()                            #  must export for invoke
   10277     # compare (methodIndex, vtableCount)
   10278     bgeu      a2, a3, .LOP_INVOKE_SUPER_RANGE_nsm      #  method not present in superclass
   10279     LOAD_base_offClassObject_vtable(a1, a1) #  a1 <- ...clazz->super->vtable
   10280     LOAD_eas2(a0, a1, a2)                  #  a0 <- vtable[methodIndex]
   10281     b         common_invokeMethodRange #  continue on
   10282 
   10283     /*
   10284      * Throw a NoSuchMethodError with the method name as the message.
   10285      *  a0 = resolved base method
   10286      */
   10287 .LOP_INVOKE_SUPER_RANGE_nsm:
   10288     LOAD_base_offMethod_name(a1, a0)       #  a1 <- method name
   10289     b         common_errNoSuchMethod
   10290 
   10291 
   10292 /* continuation for OP_INVOKE_STATIC_RANGE */
   10293 
   10294 .LOP_INVOKE_STATIC_RANGE_resolve:
   10295     LOAD_rSELF_method(a3)                  #  a3 <- self->method
   10296     LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
   10297     li        a2, METHOD_STATIC            #  resolver method type
   10298     JAL(dvmResolveMethod)                  #  v0 <- call(clazz, ref, flags)
   10299     move      a0, v0
   10300 #if defined(WITH_JIT)
   10301     /*
   10302      * Check to see if we're actively building a trace.  If so,
   10303      * we need to keep this instruction out of it.
   10304      * rBIX: &resolved_methodToCall
   10305      */
   10306     lhu       a2, offThread_subMode(rSELF)
   10307     beqz      v0, common_exceptionThrown   #  null, handle exception
   10308     and       a2, kSubModeJitTraceBuild    #  trace under construction?
   10309     beqz      a2, common_invokeMethodRange #  no, (a0=method, rOBJ="this")
   10310     lw        a1, 0(rBIX)                  #  reload resolved method
   10311     # finished resloving?
   10312     bnez      a1, common_invokeMethodRange #  yes, (a0=method, rOBJ="this")
   10313     move      rBIX, a0                     #  preserve method
   10314     move      a0, rSELF
   10315     move      a1, rPC
   10316     JAL(dvmJitEndTraceSelect)              #  (self, pc)
   10317     move      a0, rBIX
   10318     b         common_invokeMethodRange #  whew, finally!
   10319 #else
   10320     # got null?
   10321     bnez      v0, common_invokeMethodRange #  (a0=method, rOBJ="this")
   10322     b         common_exceptionThrown       #  yes, handle exception
   10323 #endif
   10324 
   10325 /* continuation for OP_FLOAT_TO_INT */
   10326 
   10327 /*
   10328  * Not an entry point as it is used only once !!
   10329  */
   10330 f2i_doconv:
   10331 #ifdef SOFT_FLOAT
   10332     li        a1, 0x4f000000               #  (float)maxint
   10333     move      rBIX, a0
   10334     JAL(__gesf2)                           #  is arg >= maxint?
   10335     move      t0, v0
   10336     li        v0, ~0x80000000              #  return maxint (7fffffff)
   10337     bgez      t0, .LOP_FLOAT_TO_INT_set_vreg
   10338 
   10339     move      a0, rBIX                     #  recover arg
   10340     li        a1, 0xcf000000               #  (float)minint
   10341     JAL(__lesf2)
   10342 
   10343     move      t0, v0
   10344     li        v0, 0x80000000               #  return minint (80000000)
   10345     blez      t0, .LOP_FLOAT_TO_INT_set_vreg
   10346     move      a0, rBIX
   10347     move      a1, rBIX
   10348     JAL(__nesf2)
   10349 
   10350     move      t0, v0
   10351     li        v0, 0                        #  return zero for NaN
   10352     bnez      t0, .LOP_FLOAT_TO_INT_set_vreg
   10353 
   10354     move      a0, rBIX
   10355     JAL(__fixsfsi)
   10356     b         .LOP_FLOAT_TO_INT_set_vreg
   10357 #else
   10358     l.s       fa1, .LFLOAT_TO_INT_max
   10359     c.ole.s   fcc0, fa1, fa0
   10360     l.s       fv0, .LFLOAT_TO_INT_ret_max
   10361     bc1t      .LOP_FLOAT_TO_INT_set_vreg_f
   10362 
   10363     l.s       fa1, .LFLOAT_TO_INT_min
   10364     c.ole.s   fcc0, fa0, fa1
   10365     l.s       fv0, .LFLOAT_TO_INT_ret_min
   10366     bc1t      .LOP_FLOAT_TO_INT_set_vreg_f
   10367 
   10368     mov.s     fa1, fa0
   10369     c.un.s    fcc0, fa0, fa1
   10370     li.s      fv0, 0
   10371     bc1t      .LOP_FLOAT_TO_INT_set_vreg_f
   10372 
   10373     trunc.w.s  fv0, fa0
   10374     b         .LOP_FLOAT_TO_INT_set_vreg_f
   10375 #endif
   10376 
   10377 .LFLOAT_TO_INT_max:
   10378     .word 0x4f000000
   10379 .LFLOAT_TO_INT_min:
   10380     .word 0xcf000000
   10381 .LFLOAT_TO_INT_ret_max:
   10382     .word 0x7fffffff
   10383 .LFLOAT_TO_INT_ret_min:
   10384     .word 0x80000000
   10385 
   10386 
   10387 /* continuation for OP_FLOAT_TO_LONG */
   10388 
   10389 f2l_doconv:
   10390 #ifdef SOFT_FLOAT
   10391     li        a1, 0x5f000000
   10392     move      rBIX, a0
   10393     JAL(__gesf2)
   10394 
   10395     move      t0, v0
   10396     li        rRESULT0, ~0
   10397     li        rRESULT1, ~0x80000000
   10398     bgez      t0, .LOP_FLOAT_TO_LONG_set_vreg
   10399 
   10400     move      a0, rBIX
   10401     li        a1, 0xdf000000
   10402     JAL(__lesf2)
   10403 
   10404     move      t0, v0
   10405     li        rRESULT0, 0
   10406     li        rRESULT1, 0x80000000
   10407     blez      t0, .LOP_FLOAT_TO_LONG_set_vreg
   10408 
   10409     move      a0, rBIX
   10410     move      a1, rBIX
   10411     JAL(__nesf2)
   10412 
   10413     move      t0, v0
   10414     li        rRESULT0, 0
   10415     li        rRESULT1, 0
   10416     bnez      t0, .LOP_FLOAT_TO_LONG_set_vreg
   10417 
   10418     move      a0, rBIX
   10419     JAL(__fixsfdi)
   10420 
   10421 #else
   10422     l.s       fa1, .LLONG_TO_max
   10423     c.ole.s   fcc0, fa1, fa0
   10424     li        rRESULT0, ~0
   10425     li        rRESULT1, ~0x80000000
   10426     bc1t      .LOP_FLOAT_TO_LONG_set_vreg
   10427 
   10428     l.s       fa1, .LLONG_TO_min
   10429     c.ole.s   fcc0, fa0, fa1
   10430     li        rRESULT0, 0
   10431     li        rRESULT1, 0x80000000
   10432     bc1t      .LOP_FLOAT_TO_LONG_set_vreg
   10433 
   10434     mov.s     fa1, fa0
   10435     c.un.s    fcc0, fa0, fa1
   10436     li        rRESULT0, 0
   10437     li        rRESULT1, 0
   10438     bc1t      .LOP_FLOAT_TO_LONG_set_vreg
   10439 
   10440     JAL(__fixsfdi)
   10441 #endif
   10442 
   10443     b         .LOP_FLOAT_TO_LONG_set_vreg
   10444 
   10445 .LLONG_TO_max:
   10446     .word 0x5f000000
   10447 
   10448 .LLONG_TO_min:
   10449     .word 0xdf000000
   10450 
   10451 /* continuation for OP_DOUBLE_TO_INT */
   10452 
   10453 
   10454 d2i_doconv:
   10455 #ifdef SOFT_FLOAT
   10456     la        t0, .LDOUBLE_TO_INT_max
   10457     LOAD64(rARG2, rARG3, t0)
   10458     move      rBIX, rARG0                  #  save a0
   10459     move      rTEMP, rARG1                 #  and a1
   10460     JAL(__gedf2)                           #  is arg >= maxint?
   10461 
   10462     move      t0, v0
   10463     li        v0, ~0x80000000              #  return maxint (7fffffff)
   10464     bgez      t0, .LOP_DOUBLE_TO_INT_set_vreg     #  nonzero == yes
   10465 
   10466     move      rARG0, rBIX                  #  recover arg
   10467     move      rARG1, rTEMP
   10468     la        t0, .LDOUBLE_TO_INT_min
   10469     LOAD64(rARG2, rARG3, t0)
   10470     JAL(__ledf2)                           #  is arg <= minint?
   10471 
   10472     move      t0, v0
   10473     li        v0, 0x80000000               #  return minint (80000000)
   10474     blez      t0, .LOP_DOUBLE_TO_INT_set_vreg     #  nonzero == yes
   10475 
   10476     move      rARG0, rBIX                  #  recover arg
   10477     move      rARG1, rTEMP
   10478     move      rARG2, rBIX                  #  compare against self
   10479     move      rARG3, rTEMP
   10480     JAL(__nedf2)                           #  is arg == self?
   10481 
   10482     move      t0, v0                       #  zero == no
   10483     li        v0, 0
   10484     bnez      t0, .LOP_DOUBLE_TO_INT_set_vreg     #  return zero for NaN
   10485 
   10486     move      rARG0, rBIX                  #  recover arg
   10487     move      rARG1, rTEMP
   10488     JAL(__fixdfsi)                         #  convert double to int
   10489     b         .LOP_DOUBLE_TO_INT_set_vreg
   10490 #else
   10491     la        t0, .LDOUBLE_TO_INT_max
   10492     LOAD64_F(fa1, fa1f, t0)
   10493     c.ole.d   fcc0, fa1, fa0
   10494     l.s       fv0, .LDOUBLE_TO_INT_maxret
   10495     bc1t      .LOP_DOUBLE_TO_INT_set_vreg_f
   10496 
   10497     la        t0, .LDOUBLE_TO_INT_min
   10498     LOAD64_F(fa1, fa1f, t0)
   10499     c.ole.d   fcc0, fa0, fa1
   10500     l.s       fv0, .LDOUBLE_TO_INT_minret
   10501     bc1t      .LOP_DOUBLE_TO_INT_set_vreg_f
   10502 
   10503     mov.d     fa1, fa0
   10504     c.un.d    fcc0, fa0, fa1
   10505     li.s      fv0, 0
   10506     bc1t      .LOP_DOUBLE_TO_INT_set_vreg_f
   10507 
   10508     trunc.w.d  fv0, fa0
   10509     b         .LOP_DOUBLE_TO_INT_set_vreg_f
   10510 #endif
   10511 
   10512 
   10513 .LDOUBLE_TO_INT_max:
   10514     .dword 0x41dfffffffc00000
   10515 .LDOUBLE_TO_INT_min:
   10516     .dword 0xc1e0000000000000              #  minint, as a double (high word)
   10517 .LDOUBLE_TO_INT_maxret:
   10518     .word 0x7fffffff
   10519 .LDOUBLE_TO_INT_minret:
   10520     .word 0x80000000
   10521 
   10522 /* continuation for OP_DOUBLE_TO_LONG */
   10523 
   10524 d2l_doconv:
   10525 #ifdef SOFT_FLOAT
   10526     la        t0, .LDOUBLE_TO_LONG_max
   10527     LOAD64(rARG2, rARG3, t0)
   10528     move      rBIX, rARG0                  #  save a0
   10529     move      rTEMP, rARG1                 #  and a1
   10530     JAL(__gedf2)
   10531 
   10532     move      t1, v0
   10533     la        t0, .LDOUBLE_TO_LONG_ret_max
   10534     LOAD64(rRESULT0, rRESULT1, t0)
   10535     bgez      t1, .LOP_DOUBLE_TO_LONG_set_vreg
   10536 
   10537     move      rARG0, rBIX
   10538     move      rARG1, rTEMP
   10539     la        t0, .LDOUBLE_TO_LONG_min
   10540     LOAD64(rARG2, rARG3, t0)
   10541     JAL(__ledf2)
   10542 
   10543     move      t1, v0
   10544     la        t0, .LDOUBLE_TO_LONG_ret_min
   10545     LOAD64(rRESULT0, rRESULT1, t0)
   10546     blez      t1, .LOP_DOUBLE_TO_LONG_set_vreg
   10547 
   10548     move      rARG0, rBIX
   10549     move      rARG1, rTEMP
   10550     move      rARG2, rBIX
   10551     move      rARG3, rTEMP
   10552     JAL(__nedf2)
   10553 
   10554     move      t0, v0
   10555     li        rRESULT0, 0
   10556     li        rRESULT1, 0
   10557     bnez      t0, .LOP_DOUBLE_TO_LONG_set_vreg
   10558 
   10559     move      rARG0, rBIX
   10560     move      rARG1, rTEMP
   10561     JAL(__fixdfdi)
   10562 
   10563 #else
   10564     la        t0, .LDOUBLE_TO_LONG_max
   10565     LOAD64_F(fa1, fa1f, t0)
   10566     c.ole.d   fcc0, fa1, fa0
   10567     la        t0, .LDOUBLE_TO_LONG_ret_max
   10568     LOAD64(rRESULT0, rRESULT1, t0)
   10569     bc1t      .LOP_DOUBLE_TO_LONG_set_vreg
   10570 
   10571     la        t0, .LDOUBLE_TO_LONG_min
   10572     LOAD64_F(fa1, fa1f, t0)
   10573     c.ole.d   fcc0, fa0, fa1
   10574     la        t0, .LDOUBLE_TO_LONG_ret_min
   10575     LOAD64(rRESULT0, rRESULT1, t0)
   10576     bc1t      .LOP_DOUBLE_TO_LONG_set_vreg
   10577 
   10578     mov.d     fa1, fa0
   10579     c.un.d    fcc0, fa0, fa1
   10580     li        rRESULT0, 0
   10581     li        rRESULT1, 0
   10582     bc1t      .LOP_DOUBLE_TO_LONG_set_vreg
   10583     JAL(__fixdfdi)
   10584 #endif
   10585     b         .LOP_DOUBLE_TO_LONG_set_vreg
   10586 
   10587 
   10588 .LDOUBLE_TO_LONG_max:
   10589     .dword 0x43e0000000000000              #  maxlong, as a double (high word)
   10590 .LDOUBLE_TO_LONG_min:
   10591     .dword 0xc3e0000000000000              #  minlong, as a double (high word)
   10592 .LDOUBLE_TO_LONG_ret_max:
   10593     .dword 0x7fffffffffffffff
   10594 .LDOUBLE_TO_LONG_ret_min:
   10595     .dword 0x8000000000000000
   10596 
   10597 /* continuation for OP_MUL_LONG */
   10598 
   10599 .LOP_MUL_LONG_finish:
   10600     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10601     STORE64(v0, v1, a0)                    #  vAA::vAA+1 <- v0(low) :: v1(high)
   10602     GOTO_OPCODE(t0)                        #  jump to next instruction
   10603 
   10604 
   10605 /* continuation for OP_IGET_VOLATILE */
   10606 
   10607     /*
   10608      * Currently:
   10609      *  v0 holds resolved field
   10610      *  rOBJ holds object (caller saved)
   10611      */
   10612 .LOP_IGET_VOLATILE_finish:
   10613     #BAL(common_squeak0)
   10614     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   10615     # check object for null
   10616     beqz      rOBJ, common_errNullObject   #  object was null
   10617     addu      a3, a3, rOBJ                 #  form address
   10618     lw a0, (a3)                         #  a0 <- obj.field (8/16/32 bits)
   10619     SMP_DMB                               #  acquiring load
   10620     GET_OPA4(a2)                           #  a2 <- A+
   10621     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10622     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10623     SET_VREG(a0, a2)                       #  fp[A] <- a0
   10624     GOTO_OPCODE(t0)                        #  jump to next instruction
   10625 
   10626 
   10627 /* continuation for OP_IPUT_VOLATILE */
   10628 
   10629     /*
   10630      * Currently:
   10631      *  a0 holds resolved field
   10632      *  rOBJ holds object
   10633      */
   10634 .LOP_IPUT_VOLATILE_finish:
   10635     #BAL(common_squeak0)
   10636     GET_OPA4(a1)                           #  a1 <- A+
   10637     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   10638     GET_VREG(a0, a1)                       #  a0 <- fp[A]
   10639     # check object for null
   10640     beqz      rOBJ, common_errNullObject   #  object was null
   10641     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10642     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10643     addu      rOBJ, rOBJ, a3               #  form address
   10644     SMP_DMB_ST                            #  releasing store
   10645     sw a0, (rOBJ)                      #  obj.field (8/16/32 bits) <- a0
   10646     SMP_DMB
   10647     GOTO_OPCODE(t0)                        #  jump to next instruction
   10648 
   10649 
   10650 /* continuation for OP_SGET_VOLATILE */
   10651 
   10652 .LOP_SGET_VOLATILE_finish:
   10653     LOAD_base_offStaticField_value(a1, a0) #  a1 <- field value
   10654     SMP_DMB                               #  acquiring load
   10655     GET_OPA(a2)                            #  a2 <- AA
   10656     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10657     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10658     SET_VREG_GOTO(a1, a2, t0)              #  fp[AA] <- a1
   10659 
   10660 /* continuation for OP_SPUT_VOLATILE */
   10661 
   10662 .LOP_SPUT_VOLATILE_finish:
   10663     # field ptr in a0
   10664     GET_OPA(a2)                            #  a2 <- AA
   10665     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10666     GET_VREG(a1, a2)                       #  a1 <- fp[AA]
   10667     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10668     SMP_DMB_ST                            #  releasing store
   10669     sw        a1, offStaticField_value(a0) #  field <- vAA
   10670     SMP_DMB
   10671     GOTO_OPCODE(t0)                        #  jump to next instruction
   10672 
   10673 /* continuation for OP_IGET_OBJECT_VOLATILE */
   10674 
   10675     /*
   10676      * Currently:
   10677      *  v0 holds resolved field
   10678      *  rOBJ holds object (caller saved)
   10679      */
   10680 .LOP_IGET_OBJECT_VOLATILE_finish:
   10681     #BAL(common_squeak0)
   10682     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   10683     # check object for null
   10684     beqz      rOBJ, common_errNullObject   #  object was null
   10685     addu      a3, a3, rOBJ                 #  form address
   10686     lw a0, (a3)                         #  a0 <- obj.field (8/16/32 bits)
   10687     SMP_DMB                               #  acquiring load
   10688     GET_OPA4(a2)                           #  a2 <- A+
   10689     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10690     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10691     SET_VREG(a0, a2)                       #  fp[A] <- a0
   10692     GOTO_OPCODE(t0)                        #  jump to next instruction
   10693 
   10694 
   10695 /* continuation for OP_IGET_WIDE_VOLATILE */
   10696 
   10697     /*
   10698      * Currently:
   10699      *  a0   holds resolved field
   10700      *  rOBJ holds object
   10701      */
   10702 .LOP_IGET_WIDE_VOLATILE_finish:
   10703     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   10704     beqz      rOBJ, common_errNullObject   #  object was null
   10705     GET_OPA4(a2)                           #  a2 <- A+
   10706     addu      rOBJ, rOBJ, a3               #  form address
   10707     .if 1
   10708     vLOAD64(a0, a1, rOBJ)                  #  a0/a1 <- obj.field (64-bit align ok)
   10709     .else
   10710     LOAD64(a0, a1, rOBJ)                   #  a0/a1 <- obj.field (64-bit align ok)
   10711     .endif
   10712     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10713     EAS2(a3, rFP, a2)                      #  a3 <- &fp[A]
   10714     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10715     STORE64(a0, a1, a3)                    #  fp[A] <- a0/a1
   10716     GOTO_OPCODE(t0)                        #  jump to next instruction
   10717 
   10718 
   10719 /* continuation for OP_IPUT_WIDE_VOLATILE */
   10720 
   10721     /*
   10722      * Currently:
   10723      *  a0   holds resolved field
   10724      *  rOBJ holds object
   10725      */
   10726 .LOP_IPUT_WIDE_VOLATILE_finish:
   10727     GET_OPA4(a2)                           #  a2 <- A+
   10728     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   10729     EAS2(a2, rFP, a2)                      #  a2 <- &fp[A]
   10730     # check object for null
   10731     beqz      rOBJ, common_errNullObject   #  object was null
   10732     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10733     LOAD64(a0, a1, a2)                     #  a0/a1 <- fp[A]
   10734     GET_INST_OPCODE(rBIX)                  #  extract opcode from rINST
   10735     addu      a2, rOBJ, a3                 #  form address
   10736     .if 1
   10737     JAL(dvmQuasiAtomicSwap64Sync)          # stores r0/r1 into addr r2
   10738 #    STORE64(a0, a1, a2)                    #  obj.field (64 bits, aligned) <- a0 a1
   10739     .else
   10740     STORE64(a0, a1, a2)                    #  obj.field (64 bits, aligned) <- a0 a1
   10741     .endif
   10742     GOTO_OPCODE(rBIX)                      #  jump to next instruction
   10743 
   10744 
   10745 /* continuation for OP_SGET_WIDE_VOLATILE */
   10746 
   10747 .LOP_SGET_WIDE_VOLATILE_finish:
   10748     GET_OPA(a1)                            #  a1 <- AA
   10749     .if 1
   10750     vLOAD64_off(a2, a3, a0, offStaticField_value) #  a2/a3 <- field value (aligned)
   10751     .else
   10752     LOAD64_off(a2, a3, a0, offStaticField_value) #  a2/a3 <- field value (aligned)
   10753     .endif
   10754     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10755     EAS2(a1, rFP, a1)                      #  a1 <- &fp[AA]
   10756     STORE64(a2, a3, a1)                    #  vAA/vAA+1 <- a2/a3
   10757     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10758     GOTO_OPCODE(t0)                        #  jump to next instruction
   10759 
   10760 
   10761 
   10762 /* continuation for OP_SPUT_WIDE_VOLATILE */
   10763 
   10764     /*
   10765      * Continuation if the field has not yet been resolved.
   10766      *  a1:  BBBB field ref
   10767      *  rOBJ:  &fp[AA]
   10768      *  rBIX: dvmDex->pResFields
   10769      *
   10770      * Returns StaticField pointer in a2.
   10771      */
   10772 .LOP_SPUT_WIDE_VOLATILE_resolve:
   10773     LOAD_rSELF_method(a2)                  #  a2 <- current method
   10774 #if defined(WITH_JIT)
   10775     EAS2(rBIX, rBIX, a1)                   #  rBIX<- &dvmDex->pResFields[field]
   10776 #endif
   10777     EXPORT_PC()                            #  resolve() could throw, so export now
   10778     LOAD_base_offMethod_clazz(a0, a2)      #  a0 <- method->clazz
   10779     JAL(dvmResolveStaticField)             #  v0 <- resolved StaticField ptr
   10780     # success ?
   10781     move      a0, v0
   10782     beqz      v0, common_exceptionThrown   #  no, handle exception
   10783 #if defined(WITH_JIT)
   10784     /*
   10785      * If the JIT is actively building a trace we need to make sure
   10786      * that the field is fully resolved before including this instruction.
   10787      */
   10788     JAL(common_verifyField)
   10789 #endif
   10790     move      a2, v0
   10791     b         .LOP_SPUT_WIDE_VOLATILE_finish           # resume
   10792 
   10793 /* continuation for OP_EXECUTE_INLINE */
   10794 
   10795     /*
   10796      * Extract args, call function.
   10797      *  a0 = #of args (0-4)
   10798      *  rBIX = call index
   10799      *
   10800      * Other ideas:
   10801      * - Use a jump table from the main piece to jump directly into the
   10802      *   AND/LW pairs.  Costs a data load, saves a branch.
   10803      * - Have five separate pieces that do the loading, so we can work the
   10804      *   interleave a little better.  Increases code size.
   10805      */
   10806 .LOP_EXECUTE_INLINE_continue:
   10807     FETCH(rINST, 2)                        #  rINST <- FEDC
   10808     beq       a0, 0, 0f
   10809     beq       a0, 1, 1f
   10810     beq       a0, 2, 2f
   10811     beq       a0, 3, 3f
   10812     beq       a0, 4, 4f
   10813     JAL(common_abort)                      #  too many arguments
   10814 
   10815 4:
   10816     and       t0, rINST, 0xf000            #  isolate F
   10817     ESRN(t1, rFP, t0, 10)
   10818     lw        a3, 0(t1)                    #  a3 <- vF (shift right 12, left 2)
   10819 3:
   10820     and       t0, rINST, 0x0f00            #  isolate E
   10821     ESRN(t1, rFP, t0, 6)
   10822     lw        a2, 0(t1)                    #  a2 <- vE
   10823 2:
   10824     and       t0, rINST, 0x00f0            #  isolate D
   10825     ESRN(t1, rFP, t0, 2)
   10826     lw        a1, 0(t1)                    #  a1 <- vD
   10827 1:
   10828     and       t0, rINST, 0x000f            #  isolate C
   10829     EASN(t1, rFP, t0, 2)
   10830     lw        a0, 0(t1)                    #  a0 <- vC
   10831 0:
   10832     la        rINST, gDvmInlineOpsTable    #  table of InlineOperation
   10833     EAS4(t1, rINST, rBIX)                  #  t1 <- rINST + rBIX<<4
   10834     lw        t9, 0(t1)
   10835     jr        t9                           #  sizeof=16, "func" is first entry
   10836     # (not reached)
   10837 
   10838     /*
   10839      * We're debugging or profiling.
   10840      * rBIX: opIndex
   10841      */
   10842 .LOP_EXECUTE_INLINE_debugmode:
   10843     move      a0, rBIX
   10844     JAL(dvmResolveInlineNative)
   10845     beqz      v0, .LOP_EXECUTE_INLINE_resume       #  did it resolve? no, just move on
   10846     move      rOBJ, v0                     #  remember method
   10847     move      a0, v0
   10848     move      a1, rSELF
   10849     JAL(dvmFastMethodTraceEnter)           #  (method, self)
   10850     addu      a1, rSELF, offThread_retval  #  a1<- &self->retval
   10851     GET_OPB(a0)                            #  a0 <- B
   10852     # Stack should have 16/20 available
   10853     sw        a1, STACK_OFFSET_ARG04(sp)   #  push &self->retval
   10854     BAL(.LOP_EXECUTE_INLINE_continue)              #  make call; will return after
   10855     lw        gp, STACK_OFFSET_GP(sp)      #  restore gp
   10856     move      rINST, v0                    #  save result of inline
   10857     move      a0, rOBJ                     #  a0<- method
   10858     move      a1, rSELF                    #  a1<- self
   10859     JAL(dvmFastNativeMethodTraceExit)      #  (method, self)
   10860     beqz      rINST, common_exceptionThrown   #  returned false, handle exception
   10861     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
   10862     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10863     GOTO_OPCODE(t0)                        #  jump to next instruction
   10864 
   10865 /* continuation for OP_EXECUTE_INLINE_RANGE */
   10866 
   10867     /*
   10868      * Extract args, call function.
   10869      *  a0 = #of args (0-4)
   10870      *  rBIX = call index
   10871      *  ra = return addr, above  [DO NOT JAL out of here w/o preserving ra]
   10872      */
   10873 .LOP_EXECUTE_INLINE_RANGE_continue:
   10874     FETCH(rOBJ, 2)                       # rOBJ <- CCCC
   10875     beq       a0, 0, 0f
   10876     beq       a0, 1, 1f
   10877     beq       a0, 2, 2f
   10878     beq       a0, 3, 3f
   10879     beq       a0, 4, 4f
   10880     JAL(common_abort)                      #  too many arguments
   10881 
   10882 4:
   10883     add       t0, rOBJ, 3
   10884     GET_VREG(a3, t0)
   10885 3:
   10886     add       t0, rOBJ, 2
   10887     GET_VREG(a2, t0)
   10888 2:
   10889     add       t0, rOBJ, 1
   10890     GET_VREG(a1, t0)
   10891 1:
   10892     GET_VREG(a0, rOBJ)
   10893 0:
   10894     la        rOBJ, gDvmInlineOpsTable      # table of InlineOperation
   10895     EAS4(t1, rOBJ, rBIX)                    # t1 <- rINST + rBIX<<4
   10896     lw        t9, 0(t1)
   10897     jr        t9                            # sizeof=16, "func" is first entry
   10898     # not reached
   10899 
   10900     /*
   10901      * We're debugging or profiling.
   10902      * rBIX: opIndex
   10903      */
   10904 .LOP_EXECUTE_INLINE_RANGE_debugmode:
   10905     move      a0, rBIX
   10906     JAL(dvmResolveInlineNative)
   10907     beqz      v0, .LOP_EXECUTE_INLINE_RANGE_resume       #  did it resolve? no, just move on
   10908     move      rOBJ, v0                     #  remember method
   10909     move      a0, v0
   10910     move      a1, rSELF
   10911     JAL(dvmFastMethodTraceEnter)           #  (method, self)
   10912     addu      a1, rSELF, offThread_retval  #  a1<- &self->retval
   10913     GET_OPA(a0)                            #  a0 <- A
   10914     # Stack should have 16/20 available
   10915     sw        a1, STACK_OFFSET_ARG04(sp)   #  push &self->retval
   10916     move      rINST, rOBJ                  #  rINST<- method
   10917     BAL(.LOP_EXECUTE_INLINE_RANGE_continue)              #  make call; will return after
   10918     lw        gp, STACK_OFFSET_GP(sp)      #  restore gp
   10919     move      rOBJ, v0                     #  save result of inline
   10920     move      a0, rINST                    #  a0<- method
   10921     move      a1, rSELF                    #  a1<- self
   10922     JAL(dvmFastNativeMethodTraceExit)      #  (method, self)
   10923     beqz      rOBJ, common_exceptionThrown #  returned false, handle exception
   10924     FETCH_ADVANCE_INST(3)                  #  advance rPC, load rINST
   10925     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10926     GOTO_OPCODE(t0)                        #  jump to next instruction
   10927 
   10928 /* continuation for OP_INVOKE_OBJECT_INIT_RANGE */
   10929     /*
   10930      * A debugger is attached, so we need to go ahead and do
   10931      * this.  For simplicity, we'll just jump directly to the
   10932      * corresponding handler.  Note that we can't use
   10933      * rIBASE here because it may be in single-step mode.
   10934      * Load the primary table base directly.
   10935      */
   10936 .LOP_INVOKE_OBJECT_INIT_RANGE_debugger:
   10937     lw      a1, offThread_mainHandlerTable(rSELF)
   10938     li      t0, OP_INVOKE_DIRECT_RANGE
   10939     GOTO_OPCODE_BASE(a1, t0)            # execute it
   10940 
   10941 /* continuation for OP_IPUT_OBJECT_VOLATILE */
   10942 
   10943     /*
   10944      * Currently:
   10945      *  a0 holds resolved field
   10946      *  rOBJ holds object
   10947      */
   10948 .LOP_IPUT_OBJECT_VOLATILE_finish:
   10949     #BAL(common_squeak0)
   10950     GET_OPA4(a1)                           #  a1 <- A+
   10951     LOAD_base_offInstField_byteOffset(a3, a0) #  a3 <- byte offset of field
   10952     GET_VREG(a0, a1)                       #  a0 <- fp[A]
   10953     lw        a2, offThread_cardTable(rSELF) #  a2 <- card table base
   10954     # check object for null
   10955     beqz      rOBJ, common_errNullObject   #  object was null
   10956     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10957     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10958     addu      t2, rOBJ, a3                 #  form address
   10959     SMP_DMB_ST                            #  releasing store
   10960     sw a0, (t2)                        #  obj.field (32 bits) <- a0
   10961     SMP_DMB
   10962     beqz      a0, 1f                       #  stored a null reference?
   10963     srl       t1, rOBJ, GC_CARD_SHIFT
   10964     addu      t2, a2, t1
   10965     sb        a2, (t2)                     #  mark card if not
   10966 1:
   10967     GOTO_OPCODE(t0)                        #  jump to next instruction
   10968 
   10969 
   10970 /* continuation for OP_SGET_OBJECT_VOLATILE */
   10971 
   10972 .LOP_SGET_OBJECT_VOLATILE_finish:
   10973     LOAD_base_offStaticField_value(a1, a0) #  a1 <- field value
   10974     SMP_DMB                               #  acquiring load
   10975     GET_OPA(a2)                            #  a2 <- AA
   10976     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10977     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10978     SET_VREG_GOTO(a1, a2, t0)              #  fp[AA] <- a1
   10979 
   10980 /* continuation for OP_SPUT_OBJECT_VOLATILE */
   10981 .LOP_SPUT_OBJECT_VOLATILE_finish:                        #  field ptr in a0
   10982     GET_OPA(a2)                            #  a2 <- AA
   10983     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
   10984     GET_VREG(a1, a2)                       #  a1 <- fp[AA]
   10985     lw        a2, offThread_cardTable(rSELF) #  a2 <- card table base
   10986     lw        t1, offField_clazz(a0)       #  t1 <- field->clazz
   10987     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   10988     SMP_DMB_ST                            #  releasing store
   10989     sw        a1, offStaticField_value(a0) #  field <- vAA
   10990     SMP_DMB
   10991     beqz      a1, 1f
   10992     srl       t2, t1, GC_CARD_SHIFT
   10993     addu      t3, a2, t2
   10994     sb        a2, (t3)
   10995 1:
   10996     GOTO_OPCODE(t0)                        #  jump to next instruction
   10997 
   10998     .size   dvmAsmSisterStart, .-dvmAsmSisterStart
   10999     .global dvmAsmSisterEnd
   11000 dvmAsmSisterEnd:
   11001 
   11002 /* File: mips/footer.S */
   11003 /*
   11004  * ===========================================================================
   11005  *  Common subroutines and data
   11006  * ===========================================================================
   11007  */
   11008 
   11009     .text
   11010     .align 2
   11011 
   11012 #if defined(WITH_JIT)
   11013 #if defined(WITH_SELF_VERIFICATION)
   11014 
   11015 /*
   11016  * "longjmp" to a translation after single-stepping.  Before returning
   11017  * to translation, must save state for self-verification.
   11018  */
   11019     .global dvmJitResumeTranslation             # (Thread* self, u4* dFP)
   11020 dvmJitResumeTranslation:
   11021     move    rSELF, a0                           # restore self
   11022     move    rPC, a1                             # restore Dalvik pc
   11023     move    rFP, a2                             # restore Dalvik fp
   11024     lw      rBIX, offThread_jitResumeNPC(rSELF)
   11025     sw      zero, offThread_jitResumeNPC(rSELF) # reset resume address
   11026     lw      sp, offThread_jitResumeNSP(rSELF)   # cut back native stack
   11027     b       jitSVShadowRunStart                 # resume as if cache hit
   11028                                                 # expects resume addr in rBIX
   11029 
   11030     .global dvmJitToInterpPunt
   11031 dvmJitToInterpPunt:
   11032     li        a2, kSVSPunt                 #  a2 <- interpreter entry point
   11033     sw        zero, offThread_inJitCodeCache(rSELF) #  Back to the interp land
   11034     b         jitSVShadowRunEnd            #  doesn't return
   11035 
   11036     .global dvmJitToInterpSingleStep
   11037 dvmJitToInterpSingleStep:
   11038     move      rPC, a0                      # set up dalvik pc
   11039     EXPORT_PC()
   11040     sw        ra, offThread_jitResumeNPC(rSELF)
   11041     sw        a1, offThread_jitResumeDPC(rSELF)
   11042     li        a2, kSVSSingleStep           #  a2 <- interpreter entry point
   11043     b         jitSVShadowRunEnd            #  doesn't return
   11044 
   11045     .global dvmJitToInterpNoChainNoProfile
   11046 dvmJitToInterpNoChainNoProfile:
   11047     move      a0, rPC                      #  pass our target PC
   11048     li        a2, kSVSNoProfile            #  a2 <- interpreter entry point
   11049     sw        zero, offThread_inJitCodeCache(rSELF) #  Back to the interp land
   11050     b         jitSVShadowRunEnd            #  doesn't return
   11051 
   11052     .global dvmJitToInterpTraceSelectNoChain
   11053 dvmJitToInterpTraceSelectNoChain:
   11054     move      a0, rPC                      #  pass our target PC
   11055     li        a2, kSVSTraceSelect          #  a2 <- interpreter entry point
   11056     sw        zero, offThread_inJitCodeCache(rSELF) #  Back to the interp land
   11057     b         jitSVShadowRunEnd            #  doesn't return
   11058 
   11059     .global dvmJitToInterpTraceSelect
   11060 dvmJitToInterpTraceSelect:
   11061     lw        a0, 0(ra)                   #  pass our target PC
   11062     li        a2, kSVSTraceSelect          #  a2 <- interpreter entry point
   11063     sw        zero, offThread_inJitCodeCache(rSELF) #  Back to the interp land
   11064     b         jitSVShadowRunEnd            #  doesn't return
   11065 
   11066     .global dvmJitToInterpBackwardBranch
   11067 dvmJitToInterpBackwardBranch:
   11068     lw        a0, 0(ra)                   #  pass our target PC
   11069     li        a2, kSVSBackwardBranch       #  a2 <- interpreter entry point
   11070     sw        zero, offThread_inJitCodeCache(rSELF) #  Back to the interp land
   11071     b         jitSVShadowRunEnd            #  doesn't return
   11072 
   11073     .global dvmJitToInterpNormal
   11074 dvmJitToInterpNormal:
   11075     lw        a0, 0(ra)                   #  pass our target PC
   11076     li        a2, kSVSNormal               #  a2 <- interpreter entry point
   11077     sw        zero, offThread_inJitCodeCache(rSELF) #  Back to the interp land
   11078     b         jitSVShadowRunEnd            #  doesn't return
   11079 
   11080     .global dvmJitToInterpNoChain
   11081 dvmJitToInterpNoChain:
   11082     move      a0, rPC                      #  pass our target PC
   11083     li        a2, kSVSNoChain              #  a2 <- interpreter entry point
   11084     sw        zero, offThread_inJitCodeCache(rSELF) #  Back to the interp land
   11085     b         jitSVShadowRunEnd            #  doesn't return
   11086 #else                                   /*  WITH_SELF_VERIFICATION */
   11087 
   11088 
   11089 /*
   11090  * "longjmp" to a translation after single-stepping.
   11091  */
   11092     .global dvmJitResumeTranslation             # (Thread* self, u4* dFP)
   11093 dvmJitResumeTranslation:
   11094     move    rSELF, a0                           # restore self
   11095     move    rPC, a1                             # restore Dalvik pc
   11096     move    rFP, a2                             # restore Dalvik fp
   11097     lw      a0, offThread_jitResumeNPC(rSELF)
   11098     sw      zero, offThread_jitResumeNPC(rSELF) # reset resume address
   11099     lw      sp, offThread_jitResumeNSP(rSELF)   # cut back native stack
   11100     jr      a0                                  # resume translation
   11101 
   11102 
   11103 /*
   11104  * Return from the translation cache to the interpreter when the compiler is
   11105  * having issues translating/executing a Dalvik instruction. We have to skip
   11106  * the code cache lookup otherwise it is possible to indefinitely bouce
   11107  * between the interpreter and the code cache if the instruction that fails
   11108  * to be compiled happens to be at a trace start.
   11109  */
   11110     .global dvmJitToInterpPunt
   11111 dvmJitToInterpPunt:
   11112     lw        gp, STACK_OFFSET_GP(sp)
   11113     move      rPC, a0
   11114 #if defined(WITH_JIT_TUNING)
   11115     move      a0, ra
   11116     JAL(dvmBumpPunt)
   11117 #endif
   11118     EXPORT_PC()
   11119     sw        zero, offThread_inJitCodeCache(rSELF) # Back to the interp land
   11120     lw        rIBASE, offThread_curHandlerTable(rSELF)
   11121     FETCH_INST()
   11122     GET_INST_OPCODE(t0)
   11123     GOTO_OPCODE(t0)
   11124 
   11125 /*
   11126  * Return to the interpreter to handle a single instruction.
   11127  * On entry:
   11128  *    rPC <= Dalvik PC of instrucion to interpret
   11129  *    a1 <= Dalvik PC of resume instruction
   11130  *    ra <= resume point in translation
   11131  */
   11132 
   11133     .global dvmJitToInterpSingleStep
   11134 dvmJitToInterpSingleStep:
   11135     lw        gp, STACK_OFFSET_GP(sp)
   11136     move      rPC, a0                       # set up dalvik pc
   11137     EXPORT_PC()
   11138     sw        ra, offThread_jitResumeNPC(rSELF)
   11139     sw        sp, offThread_jitResumeNSP(rSELF)
   11140     sw        a1, offThread_jitResumeDPC(rSELF)
   11141     li        a1, 1
   11142     sw        a1, offThread_singleStepCount(rSELF) # just step once
   11143     move      a0, rSELF
   11144     li        a1, kSubModeCountedStep
   11145     JAL(dvmEnableSubMode)                   # (self, subMode)
   11146     lw        rIBASE, offThread_curHandlerTable(rSELF)
   11147     FETCH_INST()
   11148     GET_INST_OPCODE(t0)
   11149     GOTO_OPCODE(t0)
   11150 /*
   11151  * Return from the translation cache and immediately request
   11152  * a translation for the exit target.  Commonly used for callees.
   11153  */
   11154     .global dvmJitToInterpTraceSelectNoChain
   11155 dvmJitToInterpTraceSelectNoChain:
   11156     lw        gp, STACK_OFFSET_GP(sp)
   11157 #if defined(WITH_JIT_TUNING)
   11158     JAL(dvmBumpNoChain)
   11159 #endif
   11160     move      a0, rPC
   11161     move      a1, rSELF
   11162     JAL(dvmJitGetTraceAddrThread)          # (pc, self)
   11163     move      a0, v0
   11164     sw        a0, offThread_inJitCodeCache(rSELF) # set the inJitCodeCache flag
   11165     move      a1, rPC                      # arg1 of translation may need this
   11166     move      ra, zero                     #  in case target is HANDLER_INTERPRET
   11167     beqz      a0, 2f                       # 0 means translation does not exist
   11168     jr        a0
   11169 
   11170 /*
   11171  * Return from the translation cache and immediately request
   11172  * a translation for the exit target.  Commonly used following
   11173  * invokes.
   11174  */
   11175     .global dvmJitToInterpTraceSelect
   11176 dvmJitToInterpTraceSelect:
   11177     lw        gp, STACK_OFFSET_GP(sp)
   11178     lw        rPC, (ra)                    #  get our target PC
   11179     subu      rINST, ra, 8                 #  save start of chain branch
   11180     move      a0, rPC
   11181     move      a1, rSELF
   11182     JAL(dvmJitGetTraceAddrThread)          # @ (pc, self)
   11183     sw        v0, offThread_inJitCodeCache(rSELF) # set the inJitCodeCache flag
   11184     beqz      v0, 2f
   11185     move      a0, v0
   11186     move      a1, rINST
   11187     JAL(dvmJitChain)                       #  v0 <- dvmJitChain(codeAddr, chainAddr)
   11188     move      a1, rPC                      #  arg1 of translation may need this
   11189     move      ra, zero                     #  in case target is HANDLER_INTERPRET
   11190     move      a0, v0
   11191     beqz      a0, toInterpreter            #  didn't chain - resume with interpreter
   11192 
   11193     jr        a0                           #  continue native execution
   11194 
   11195 /* No translation, so request one if profiling isn't disabled */
   11196 2:
   11197     lw        rIBASE, offThread_curHandlerTable(rSELF)
   11198     lw        a0, offThread_pJitProfTable(rSELF)
   11199     FETCH_INST()
   11200     li        t0, kJitTSelectRequestHot
   11201     movn      a2, t0, a0                   #  ask for trace selection
   11202     bnez      a0, common_selectTrace
   11203     GET_INST_OPCODE(t0)
   11204     GOTO_OPCODE(t0)
   11205 
   11206 /*
   11207  * Return from the translation cache to the interpreter.
   11208  * The return was done with a BLX from thumb mode, and
   11209  * the following 32-bit word contains the target rPC value.
   11210  * Note that lr (r14) will have its low-order bit set to denote
   11211  * its thumb-mode origin.
   11212  *
   11213  * We'll need to stash our lr origin away, recover the new
   11214  * target and then check to see if there is a translation available
   11215  * for our new target.  If so, we do a translation chain and
   11216  * go back to native execution.  Otherwise, it's back to the
   11217  * interpreter (after treating this entry as a potential
   11218  * trace start).
   11219  */
   11220     .global dvmJitToInterpNormal
   11221 dvmJitToInterpNormal:
   11222     lw        gp, STACK_OFFSET_GP(sp)
   11223     lw        rPC, (ra)                    #  get our target PC
   11224     subu      rINST, ra, 8                 #  save start of chain branch
   11225 #if defined(WITH_JIT_TUNING)
   11226     JAL(dvmBumpNormal)
   11227 #endif
   11228     move      a0, rPC
   11229     move      a1, rSELF
   11230     JAL(dvmJitGetTraceAddrThread)           # @ (pc, self)
   11231     move      a0, v0
   11232     sw        a0, offThread_inJitCodeCache(rSELF) #  set the inJitCodeCache flag
   11233     beqz      a0, toInterpreter            #  go if not, otherwise do chain
   11234     move      a1, rINST
   11235     JAL(dvmJitChain)                       #  v0 <- dvmJitChain(codeAddr, chainAddr)
   11236     move      a1, rPC                      #  arg1 of translation may need this
   11237     move      ra, zero                     #  in case target is HANDLER_INTERPRET
   11238     move      a0, v0
   11239     beqz      a0, toInterpreter            #  didn't chain - resume with interpreter
   11240 
   11241     jr        a0                           #  continue native execution
   11242 
   11243 /*
   11244  * Return from the translation cache to the interpreter to do method invocation.
   11245  * Check if translation exists for the callee, but don't chain to it.
   11246  */
   11247     .global dvmJitToInterpNoChainNoProfile
   11248 dvmJitToInterpNoChainNoProfile:
   11249 #if defined(WITH_JIT_TUNING)
   11250     JAL(dvmBumpNoChain)
   11251 #endif
   11252     move      a0, rPC
   11253     move      a1, rSELF
   11254     JAL(dvmJitGetTraceAddrThread)          # (pc, self)
   11255     move      a0, v0
   11256     sw        a0, offThread_inJitCodeCache(rSELF) #  set the inJitCodeCache flag
   11257     move      a1, rPC                      #  arg1 of translation may need this
   11258     move      ra, zero                     #  in case target is HANDLER_INTERPRET
   11259     beqz      a0, footer235
   11260 
   11261     jr        a0                           #  continue native execution if so
   11262 footer235:
   11263     EXPORT_PC()
   11264     lw        rIBASE, offThread_curHandlerTable(rSELF)
   11265     FETCH_INST()
   11266     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
   11267     GOTO_OPCODE(t0)                        #  jump to next instruction
   11268 
   11269 /*
   11270  * Return from the translation cache to the interpreter to do method invocation.
   11271  * Check if translation exists for the callee, but don't chain to it.
   11272  */
   11273 
   11274     .global dvmJitToInterpNoChain
   11275 dvmJitToInterpNoChain:
   11276     lw        gp, STACK_OFFSET_GP(sp)
   11277 #if defined(WITH_JIT_TUNING)
   11278     JAL(dvmBumpNoChain)
   11279 #endif
   11280     move      a0, rPC
   11281     move      a1, rSELF
   11282     JAL(dvmJitGetTraceAddrThread)          # (pc, self)
   11283     move      a0, v0
   11284     sw        a0, offThread_inJitCodeCache(rSELF) #  set the inJitCodeCache flag
   11285     move      a1, rPC                      #  arg1 of translation may need this
   11286     move      ra, zero                     #  in case target is HANDLER_INTERPRET
   11287     beqz      a0, 1f
   11288     jr        a0                           #  continue native execution if so
   11289 1:
   11290 #endif                                  /*  WITH_SELF_VERIFICATION */
   11291 
   11292 /*
   11293  * No translation, restore interpreter regs and start interpreting.
   11294  * rSELF & rFP were preserved in the translated code, and rPC has
   11295  * already been restored by the time we get here.  We'll need to set
   11296  * up rIBASE & rINST, and load the address of the JitTable into r0.
   11297  */
   11298 
   11299 toInterpreter:
   11300     EXPORT_PC()
   11301     lw        rIBASE, offThread_curHandlerTable(rSELF)
   11302     FETCH_INST()
   11303     lw        a0, offThread_pJitProfTable(rSELF)
   11304     lw        rIBASE, offThread_curHandlerTable(rSELF)
   11305     # NOTE: intended fallthrough
   11306 
   11307 /*
   11308  * Similar to common_updateProfile, but tests for null pJitProfTable
   11309  * r0 holds pJifProfTAble, rINST is loaded, rPC is current and
   11310  * rIBASE has been recently refreshed.
   11311  */
   11312 
   11313 common_testUpdateProfile:
   11314 
   11315     beqz      a0, 4f
   11316 
   11317 /*
   11318  * Common code to update potential trace start counter, and initiate
   11319  * a trace-build if appropriate.
   11320  * On entry here:
   11321  *    r0    <= pJitProfTable (verified non-NULL)
   11322  *    rPC   <= Dalvik PC
   11323  *    rINST <= next instruction
   11324  */
   11325 common_updateProfile:
   11326     srl       a3, rPC, 12                  #  cheap, but fast hash function
   11327     xor       a3, a3, rPC
   11328     andi      a3, a3, JIT_PROF_SIZE-1      #  eliminate excess bits
   11329     addu      t1, a0, a3
   11330     lbu       a1, (t1)                     #  get counter
   11331     GET_INST_OPCODE(t0)
   11332     subu      a1, a1, 1                    #  decrement counter
   11333     sb        a1, (t1)                     #  and store it
   11334     beqz      a1, 1f
   11335     GOTO_OPCODE(t0)                        #  if not threshold, fallthrough otherwise
   11336 1:
   11337     /* Looks good, reset the counter */
   11338     lw        a1, offThread_jitThreshold(rSELF)
   11339     sb        a1, (t1)
   11340     EXPORT_PC()
   11341     move      a0, rPC
   11342     move      a1, rSELF
   11343     JAL(dvmJitGetTraceAddrThread)          # (pc, self)
   11344     move      a0, v0
   11345     sw        v0, offThread_inJitCodeCache(rSELF) #  set the inJitCodeCache flag
   11346     move      a1, rPC                      #  arg1 of translation may need this
   11347     move      ra, zero                     #  in case target is HANDLER_INTERPRET
   11348 
   11349 #if !defined(WITH_SELF_VERIFICATION)
   11350     li        t0, kJitTSelectRequest       #  ask for trace selection
   11351     movz      a2, t0, a0
   11352     beqz      a0, common_selectTrace
   11353     jr        a0                           #  jump to the translation
   11354 #else
   11355 
   11356     bne       a0, zero, skip_ask_for_trace_selection
   11357     li        a2, kJitTSelectRequest       #  ask for trace selection
   11358     j         common_selectTrace
   11359 
   11360 skip_ask_for_trace_selection:
   11361     /*
   11362      * At this point, we have a target translation.  However, if
   11363      * that translation is actually the interpret-only pseudo-translation
   11364      * we want to treat it the same as no translation.
   11365      */
   11366     move      rBIX, a0                     #  save target
   11367     jal       dvmCompilerGetInterpretTemplate
   11368     # special case?
   11369     bne       v0, rBIX, jitSVShadowRunStart  #  set up self verification shadow space
   11370     # Need to clear the inJitCodeCache flag
   11371     sw        zero, offThread_inJitCodeCache(rSELF) #  back to the interp land
   11372     GET_INST_OPCODE(t0)
   11373     GOTO_OPCODE(t0)
   11374     /* no return */
   11375 #endif
   11376 
   11377 /*
   11378  * On entry:
   11379  *  r2 is jit state.
   11380  */
   11381 
   11382 common_selectTrace:
   11383     lhu        a0, offThread_subMode(rSELF)
   11384     andi       a0, (kSubModeJitTraceBuild | kSubModeJitSV)
   11385     bnez       a0, 3f                      # already doing JIT work, continue
   11386     sw         a2, offThread_jitState(rSELF)
   11387     move       a0, rSELF
   11388 
   11389 /*
   11390  * Call out to validate trace-building request.  If successful,
   11391  * rIBASE will be swapped to to send us into single-stepping trace
   11392  * building mode, so we need to refresh before we continue.
   11393  */
   11394 
   11395     EXPORT_PC()
   11396     SAVE_PC_TO_SELF()
   11397     SAVE_FP_TO_SELF()
   11398     JAL(dvmJitCheckTraceRequest)
   11399 3:
   11400     FETCH_INST()
   11401     lw        rIBASE, offThread_curHandlerTable(rSELF)
   11402 4:
   11403     GET_INST_OPCODE(t0)                    # extract opcode from rINST
   11404     GOTO_OPCODE(t0)
   11405     /* no return */
   11406 #endif
   11407 
   11408 #if defined(WITH_SELF_VERIFICATION)
   11409 
   11410 /*
   11411  * Save PC and registers to shadow memory for self verification mode
   11412  * before jumping to native translation.
   11413  * On entry:
   11414  *    rPC, rFP, rSELF: the values that they should contain
   11415  *    r10: the address of the target translation.
   11416  */
   11417 jitSVShadowRunStart:
   11418     move      a0, rPC                      #  r0 <- program counter
   11419     move      a1, rFP                      #  r1 <- frame pointer
   11420     move      a2, rSELF                    #  r2 <- InterpState pointer
   11421     move      a3, rBIX                     #  r3 <- target translation
   11422     jal       dvmSelfVerificationSaveState #  save registers to shadow space
   11423     lw        rFP, offShadowSpace_shadowFP(v0) #  rFP <- fp in shadow space
   11424     jr        rBIX                         #  jump to the translation
   11425 
   11426 /*
   11427  * Restore PC, registers, and interpState to original values
   11428  * before jumping back to the interpreter.
   11429  */
   11430 jitSVShadowRunEnd:
   11431     move      a1, rFP                      #  pass ending fp
   11432     move      a3, rSELF                    #  pass self ptr for convenience
   11433     jal       dvmSelfVerificationRestoreState #  restore pc and fp values
   11434     LOAD_PC_FP_FROM_SELF()                 #  restore pc, fp
   11435     lw        a1, offShadowSpace_svState(a0) #  get self verification state
   11436     beq       a1, zero, 1f                 #  check for punt condition
   11437 
   11438     # Setup SV single-stepping
   11439     move      a0, rSELF
   11440     li        a1, kSubModeJitSV
   11441     JAL(dvmEnableSubMode)                  # (self, subMode)
   11442     li        a2, kJitSelfVerification     #  ask for self verification
   11443     sw        a2, offThread_jitState(rSELF)
   11444     # Intentional fallthrough
   11445 
   11446 1:
   11447     # exit to interpreter without check
   11448     EXPORT_PC()
   11449     lw        rIBASE, offThread_curHandlerTable(rSELF)
   11450     FETCH_INST()
   11451     GET_INST_OPCODE(t0)
   11452     GOTO_OPCODE(t0)
   11453 #endif
   11454 
   11455 /*
   11456  * The equivalent of "goto bail", this calls through the "bail handler".
   11457  * It will end this interpreter activation, and return to the caller
   11458  * of dvmMterpStdRun.
   11459  *
   11460  * State registers will be saved to the "thread" area before bailing
   11461  * debugging purposes
   11462  */
   11463     .ent common_gotoBail
   11464 common_gotoBail:
   11465     SAVE_PC_FP_TO_SELF()                   # export state to "thread"
   11466     move      a0, rSELF                    # a0 <- self ptr
   11467     b         dvmMterpStdBail              # call(self, changeInterp)
   11468     .end common_gotoBail
   11469 
   11470 /*
   11471  * The JIT's invoke method needs to remember the callsite class and
   11472  * target pair.  Save them here so that they are available to
   11473  * dvmCheckJit following the interpretation of this invoke.
   11474  */
   11475 #if defined(WITH_JIT)
   11476 save_callsiteinfo:
   11477     beqz    rOBJ, 1f
   11478     lw      rOBJ, offObject_clazz(rOBJ)
   11479 1:
   11480     sw      a0, offThread_methodToCall(rSELF)
   11481     sw      rOBJ, offThread_callsiteClass(rSELF)
   11482     jr      ra
   11483 #endif
   11484 
   11485 /*
   11486  * Common code for method invocation with range.
   11487  *
   11488  * On entry:
   11489  *  a0 is "Method* methodToCall", the method we're trying to call
   11490  */
   11491 common_invokeMethodRange:
   11492 .LinvokeNewRange:
   11493 #if defined(WITH_JIT)
   11494     lhu      a1, offThread_subMode(rSELF)
   11495     andi     a1, kSubModeJitTraceBuild
   11496     beqz     a1, 1f
   11497     JAL(save_callsiteinfo)
   11498 #endif
   11499     # prepare to copy args to "outs" area of current frame
   11500 1:
   11501     GET_OPA(a2)
   11502     SAVEAREA_FROM_FP(rBIX, rFP)              #  rBIX <- stack save area
   11503     beqz      a2, .LinvokeArgsDone
   11504     FETCH(a1, 2)                           #  a1 <- CCCC
   11505 .LinvokeRangeArgs:
   11506     # a0=methodToCall, a1=CCCC, a2=count, rBIX=outs
   11507     # (very few methods have > 10 args; could unroll for common cases)
   11508     EAS2(a3, rFP, a1)
   11509     sll       t0, a2, 2
   11510     subu      rBIX, rBIX, t0
   11511 
   11512 1:
   11513     lw        a1, 0(a3)
   11514     addu      a3, a3, 4
   11515     subu      a2, a2, 1
   11516     sw        a1, 0(rBIX)
   11517     addu      rBIX, 4
   11518     bnez      a2, 1b
   11519     b         .LinvokeArgsDone
   11520 
   11521 /*
   11522  * Common code for method invocation without range.
   11523  *
   11524  * On entry:
   11525  *  a0 is "Method* methodToCall", "rOBJ is this"
   11526  */
   11527 common_invokeMethodNoRange:
   11528 .LinvokeNewNoRange:
   11529 #if defined(WITH_JIT)
   11530     lhu      a1, offThread_subMode(rSELF)
   11531     andi     a1, kSubModeJitTraceBuild
   11532     beqz     a1, 1f
   11533     JAL(save_callsiteinfo)
   11534 #endif
   11535 
   11536     # prepare to copy args to "outs" area of current frame
   11537 1:
   11538     GET_OPB(a2)
   11539     SAVEAREA_FROM_FP(rBIX, rFP)
   11540     beqz      a2, .LinvokeArgsDone
   11541     FETCH(a1, 2)
   11542 
   11543     # a0=methodToCall, a1=GFED, a2=count,
   11544 .LinvokeNonRange:
   11545     beq       a2, 0, 0f
   11546     beq       a2, 1, 1f
   11547     beq       a2, 2, 2f
   11548     beq       a2, 3, 3f
   11549     beq       a2, 4, 4f
   11550     beq       a2, 5, 5f
   11551 
   11552 5:
   11553     and       t0, rINST, 0x0f00
   11554     ESRN(t2, rFP, t0, 6)
   11555     lw        a3, (t2)
   11556     subu      rBIX, 4
   11557     sw        a3, 0(rBIX)
   11558 
   11559 4:
   11560     and       t0, a1, 0xf000
   11561     ESRN(t2, rFP, t0, 10)
   11562     lw        a3, (t2)
   11563     subu      rBIX, 4
   11564     sw        a3, 0(rBIX)
   11565 
   11566 3:
   11567     and       t0, a1, 0x0f00
   11568     ESRN(t2, rFP, t0, 6)
   11569     lw        a3, (t2)
   11570     subu      rBIX, 4
   11571     sw        a3, 0(rBIX)
   11572 
   11573 2:
   11574     and       t0, a1, 0x00f0
   11575     ESRN(t2, rFP, t0, 2)
   11576     lw        a3, (t2)
   11577     subu      rBIX, 4
   11578     sw        a3, 0(rBIX)
   11579 
   11580 1:
   11581     and       t0, a1, 0x000f
   11582     EASN(t2, rFP, t0, 2)
   11583     lw        a3, (t2)
   11584     subu      rBIX, 4
   11585     sw        a3, 0(rBIX)
   11586 
   11587 0:
   11588     #fall through .LinvokeArgsDone
   11589 
   11590 
   11591 .LinvokeArgsDone:                          #  a0=methodToCall
   11592     lhu       rOBJ, offMethod_registersSize(a0)
   11593     lhu       a3, offMethod_outsSize(a0)
   11594     lw        a2, offMethod_insns(a0)
   11595     lw        rINST, offMethod_clazz(a0)
   11596     # find space for the new stack frame, check for overflow
   11597     SAVEAREA_FROM_FP(a1, rFP)              # a1 <- stack save area
   11598     sll       t0, rOBJ, 2                    #  a1 <- newFp (old savearea - regsSize)
   11599     subu      a1, a1, t0
   11600     SAVEAREA_FROM_FP(rBIX, a1)
   11601     lw        rOBJ, offThread_interpStackEnd(rSELF) #  t3 <- interpStackEnd
   11602     sll       t2, a3, 2
   11603     subu      t0, rBIX, t2
   11604     lhu       ra, offThread_subMode(rSELF)
   11605     lw        a3, offMethod_accessFlags(a0) #  a3 <- methodToCall->accessFlags
   11606     bltu      t0, rOBJ, .LstackOverflow      #  yes, this frame will overflow stack
   11607 
   11608 
   11609     # set up newSaveArea
   11610 #ifdef EASY_GDB
   11611     SAVEAREA_FROM_FP(t0, rFP)
   11612     sw        t0, offStackSaveArea_prevSave(rBIX)
   11613 #endif
   11614     sw        rFP, (offStackSaveArea_prevFrame)(rBIX)
   11615     sw        rPC, (offStackSaveArea_savedPc)(rBIX)
   11616 #if defined(WITH_JIT)
   11617     sw        zero, (offStackSaveArea_returnAddr)(rBIX)
   11618 #endif
   11619     sw        a0, (offStackSaveArea_method)(rBIX)
   11620     # Profiling?
   11621     bnez       ra, 2f
   11622 1:
   11623     and       t2, a3, ACC_NATIVE
   11624     bnez      t2, .LinvokeNative
   11625     lhu       rOBJ, (a2)           # rOBJ -< load Inst from New PC
   11626     lw        a3, offClassObject_pDvmDex(rINST)
   11627     move      rPC, a2              # Publish new rPC
   11628     # Update state values for the new method
   11629     # a0=methodToCall, a1=newFp, a3=newMethodClass, rOBJ=newINST
   11630     sw        a0, offThread_method(rSELF)
   11631     sw        a3, offThread_methodClassDex(rSELF)
   11632     li        a2, 1
   11633     sw        a2, offThread_debugIsMethodEntry(rSELF)
   11634 
   11635 #if defined(WITH_JIT)
   11636     lw        a0, offThread_pJitProfTable(rSELF)
   11637     move      rFP, a1                    # fp = newFp
   11638     GET_PREFETCHED_OPCODE(t0, rOBJ)      # extract prefetched opcode from rOBJ
   11639     move      rINST, rOBJ                # publish new rINST
   11640     sw        a1, offThread_curFrame(rSELF)
   11641     bnez      a0, common_updateProfile
   11642     GOTO_OPCODE(t0)
   11643 #else
   11644     move      rFP, a1
   11645     GET_PREFETCHED_OPCODE(t0, rOBJ)
   11646     move      rINST, rOBJ
   11647     sw        a1, offThread_curFrame(rSELF)
   11648     GOTO_OPCODE(t0)
   11649 #endif
   11650 
   11651 2:
   11652     # Profiling - record method entry.  a0: methodToCall
   11653     STACK_STORE(a0, 0)
   11654     STACK_STORE(a1, 4)
   11655     STACK_STORE(a2, 8)
   11656     STACK_STORE(a3, 12)
   11657     sw       rPC, offThread_pc(rSELF)          # update interpSave.pc
   11658     move     a1, a0
   11659     move     a0, rSELF
   11660     JAL(dvmReportInvoke)
   11661     STACK_LOAD(a3, 12)                         # restore a0-a3
   11662     STACK_LOAD(a2, 8)
   11663     STACK_LOAD(a1, 4)
   11664     STACK_LOAD(a0, 0)
   11665     b        1b
   11666 .LinvokeNative:
   11667     # Prep for the native call
   11668     # a0=methodToCall, a1=newFp, rBIX=newSaveArea
   11669     lhu       ra, offThread_subMode(rSELF)
   11670     lw        t3, offThread_jniLocal_topCookie(rSELF)
   11671     sw        a1, offThread_curFrame(rSELF)
   11672     sw        t3, offStackSaveArea_localRefCookie(rBIX) # newFp->localRefCookie=top
   11673     move      a2, a0
   11674     move      a0, a1
   11675     addu      a1, rSELF, offThread_retval
   11676     move      a3, rSELF
   11677 #ifdef ASSIST_DEBUGGER
   11678     /* insert fake function header to help gdb find the stack frame */
   11679     b         .Lskip
   11680     .ent dalvik_mterp
   11681 dalvik_mterp:
   11682     STACK_STORE_FULL()
   11683 .Lskip:
   11684 #endif
   11685     bnez      ra, 11f                          # Any special SubModes active?
   11686     lw        t9, offMethod_nativeFunc(a2)
   11687     jalr      t9
   11688     lw        gp, STACK_OFFSET_GP(sp)
   11689 7:
   11690     # native return; rBIX=newSaveArea
   11691     # equivalent to dvmPopJniLocals
   11692     lw        a0, offStackSaveArea_localRefCookie(rBIX)
   11693     lw        a1, offThread_exception(rSELF)
   11694     sw        rFP, offThread_curFrame(rSELF)
   11695     sw        a0, offThread_jniLocal_topCookie(rSELF)    # new top <- old top
   11696     bnez      a1, common_exceptionThrown
   11697 
   11698     FETCH_ADVANCE_INST(3)
   11699     GET_INST_OPCODE(t0)
   11700     GOTO_OPCODE(t0)
   11701 11:
   11702     # a0=newFp, a1=&retval, a2=methodToCall, a3=self, ra=subModes
   11703     SCRATCH_STORE(a0, 0)
   11704     SCRATCH_STORE(a1, 4)
   11705     SCRATCH_STORE(a2, 8)
   11706     SCRATCH_STORE(a3, 12)
   11707     move      a0, a2                    # a0 <- methodToCall
   11708     move      a1, rSELF
   11709     move      a2, rFP
   11710     JAL(dvmReportPreNativeInvoke)       # (methodToCall, self, fp)
   11711     SCRATCH_LOAD(a3, 12)                         # restore a0-a3
   11712     SCRATCH_LOAD(a2, 8)
   11713     SCRATCH_LOAD(a1, 4)
   11714     SCRATCH_LOAD(a0, 0)
   11715 
   11716     # Call the native method
   11717     lw       t9, offMethod_nativeFunc(a2)      # t9<-methodToCall->nativeFunc
   11718     jalr     t9
   11719     lw       gp, STACK_OFFSET_GP(sp)
   11720 
   11721     # Restore the pre-call arguments
   11722     SCRATCH_LOAD(a3, 12)                         # restore a0-a3
   11723     SCRATCH_LOAD(a2, 8)
   11724     SCRATCH_LOAD(a1, 4)
   11725     SCRATCH_LOAD(a0, 0)
   11726 
   11727     # Finish up any post-invoke subMode requirements
   11728     move      a0, a2
   11729     move      a1, rSELF
   11730     move      a2, rFP
   11731     JAL(dvmReportPostNativeInvoke)      # (methodToCall, self, fp)
   11732     b         7b
   11733 
   11734 
   11735 .LstackOverflow:       # a0=methodToCall
   11736     move      a1, a0                    #  a1 <- methodToCall
   11737     move      a0, rSELF                 # a0 <- self
   11738     JAL(dvmHandleStackOverflow)         #  dvmHandleStackOverflow(self, methodToCall)
   11739     b         common_exceptionThrown
   11740 #ifdef ASSIST_DEBUGGER
   11741     .end dalvik_mterp
   11742 #endif
   11743 
   11744     /*
   11745      * Common code for method invocation, calling through "glue code".
   11746      *
   11747      * TODO: now that we have range and non-range invoke handlers, this
   11748      *       needs to be split into two.  Maybe just create entry points
   11749      *       that set r9 and jump here?
   11750      *
   11751      * On entry:
   11752      *  r0 is "Method* methodToCall", the method we're trying to call
   11753      *  r9 is "bool methodCallRange", indicating if this is a /range variant
   11754      */
   11755 
   11756 /*
   11757  * Common code for handling a return instruction.
   11758  *
   11759  * This does not return.
   11760  */
   11761 common_returnFromMethod:
   11762 .LreturnNew:
   11763     lhu       t0, offThread_subMode(rSELF)
   11764     SAVEAREA_FROM_FP(a0, rFP)
   11765     lw        rOBJ, offStackSaveArea_savedPc(a0) # rOBJ = saveArea->savedPc
   11766     bnez      t0, 19f
   11767 14:
   11768     lw        rFP, offStackSaveArea_prevFrame(a0) # fp = saveArea->prevFrame
   11769     lw        a2, (offStackSaveArea_method - sizeofStackSaveArea)(rFP)
   11770                                                # a2<- method we're returning to
   11771     # is this a break frame?
   11772     beqz      a2, common_gotoBail              # break frame, bail out completely
   11773 
   11774     lw        rBIX, offMethod_clazz(a2)        # rBIX<- method->clazz
   11775     lw        rIBASE, offThread_curHandlerTable(rSELF) # refresh rIBASE
   11776     PREFETCH_ADVANCE_INST(rINST, rOBJ, 3)      # advance rOBJ, update new rINST
   11777     sw        a2, offThread_method(rSELF)      # self->method = newSave->method
   11778     lw        a1, offClassObject_pDvmDex(rBIX) # r1<- method->clazz->pDvmDex
   11779     sw        rFP, offThread_curFrame(rSELF)   # curFrame = fp
   11780 #if defined(WITH_JIT)
   11781     lw         rBIX, offStackSaveArea_returnAddr(a0)
   11782     move       rPC, rOBJ                       # publish new rPC
   11783     sw         a1, offThread_methodClassDex(rSELF)
   11784     sw         rBIX, offThread_inJitCodeCache(rSELF) # may return to JIT'ed land
   11785     beqz       rBIX, 15f                       # caller is compiled code
   11786     move       t9, rBIX
   11787     jalr       t9
   11788     lw         gp, STACK_OFFSET_GP(sp)
   11789 15:
   11790     GET_INST_OPCODE(t0)                        # extract opcode from rINST
   11791     GOTO_OPCODE(t0)                            # jump to next instruction
   11792 #else
   11793     GET_INST_OPCODE(t0)                        # extract opcode from rINST
   11794     move       rPC, rOBJ                       # publish new rPC
   11795     sw         a1, offThread_methodClassDex(rSELF)
   11796     GOTO_OPCODE(t0)
   11797 #endif
   11798 
   11799 19:
   11800     # Handle special actions
   11801     # On entry, a0: StackSaveArea
   11802     lw         a1, offStackSaveArea_prevFrame(a0) # a1<- prevFP
   11803     sw         rPC, offThread_pc(rSELF)        # update interpSave.pc
   11804     sw         a1, offThread_curFrame(rSELF)   # update interpSave.curFrame
   11805     move       a0, rSELF
   11806     JAL(dvmReportReturn)
   11807     SAVEAREA_FROM_FP(a0, rFP)                  # restore StackSaveArea
   11808     b          14b
   11809 
   11810     .if 0
   11811     /*
   11812      * Return handling, calls through "glue code".
   11813      */
   11814 .LreturnOld:
   11815     SAVE_PC_FP_TO_SELF()                       # export state
   11816     move       a0, rSELF                       # arg to function
   11817     JAL(dvmMterp_returnFromMethod)
   11818     b          common_resumeAfterGlueCall
   11819     .endif
   11820 
   11821 /*
   11822  * Somebody has thrown an exception.  Handle it.
   11823  *
   11824  * If the exception processing code returns to us (instead of falling
   11825  * out of the interpreter), continue with whatever the next instruction
   11826  * now happens to be.
   11827  *
   11828  * This does not return.
   11829  */
   11830     .global dvmMterpCommonExceptionThrown
   11831 dvmMterpCommonExceptionThrown:
   11832 common_exceptionThrown:
   11833 .LexceptionNew:
   11834 
   11835     EXPORT_PC()
   11836     move     a0, rSELF
   11837     JAL(dvmCheckSuspendPending)
   11838     lw       rOBJ, offThread_exception(rSELF)
   11839     move     a1, rSELF
   11840     move     a0, rOBJ
   11841     JAL(dvmAddTrackedAlloc)
   11842     lhu      a2, offThread_subMode(rSELF)
   11843     sw       zero, offThread_exception(rSELF)
   11844 
   11845     # Special subMode?
   11846     bnez     a2, 7f                     # any special subMode handling needed?
   11847 8:
   11848     /* set up args and a local for "&fp" */
   11849     sw       rFP, 20(sp)                 #  store rFP => tmp
   11850     addu     t0, sp, 20                  #  compute &tmp
   11851     sw       t0, STACK_OFFSET_ARG04(sp)  #  save it in arg4 as per ABI
   11852     li       a3, 0                       #  a3 <- false
   11853     lw       a1, offThread_method(rSELF)
   11854     move     a0, rSELF
   11855     lw       a1, offMethod_insns(a1)
   11856     move     a2, rOBJ
   11857     subu     a1, rPC, a1
   11858     sra      a1, a1, 1
   11859 
   11860     /* call, r0 gets catchRelPc (a code-unit offset) */
   11861     JAL(dvmFindCatchBlock)           # call(self, relPc, exc, scan?, &fp)
   11862     lw        rFP, 20(sp)            # retrieve the updated rFP
   11863 
   11864     /* update frame pointer and check result from dvmFindCatchBlock */
   11865     move      a0, v0
   11866     bltz      v0, .LnotCaughtLocally
   11867 
   11868     /* fix earlier stack overflow if necessary; Preserve a0 */
   11869     lbu       a1, offThread_stackOverflowed(rSELF)
   11870     beqz      a1, 1f
   11871     move      rBIX, a0
   11872     move      a0, rSELF
   11873     move      a1, rOBJ
   11874     JAL(dvmCleanupStackOverflow)
   11875     move      a0, rBIX
   11876 
   11877 1:
   11878 
   11879 /* adjust locals to match self->interpSave.curFrame and updated PC */
   11880     SAVEAREA_FROM_FP(a1, rFP)           # a1<- new save area
   11881     lw        a1, offStackSaveArea_method(a1)
   11882     sw        a1, offThread_method(rSELF)
   11883     lw        a2, offMethod_clazz(a1)
   11884     lw        a3, offMethod_insns(a1)
   11885     lw        a2, offClassObject_pDvmDex(a2)
   11886     EAS1(rPC, a3, a0)
   11887     sw        a2, offThread_methodClassDex(rSELF)
   11888 
   11889     /* release the tracked alloc on the exception */
   11890     move      a0, rOBJ
   11891     move      a1, rSELF
   11892     JAL(dvmReleaseTrackedAlloc)
   11893 
   11894     /* restore the exception if the handler wants it */
   11895     lw        rIBASE, offThread_curHandlerTable(rSELF)
   11896     FETCH_INST()
   11897     GET_INST_OPCODE(t0)
   11898     bne       t0, OP_MOVE_EXCEPTION, 2f
   11899     sw        rOBJ, offThread_exception(rSELF)
   11900 2:
   11901     GOTO_OPCODE(t0)
   11902 
   11903     # Manage debugger bookkeeping
   11904 7:
   11905     sw        rPC, offThread_pc(rSELF)
   11906     sw        rFP, offThread_curFrame(rSELF)
   11907     move      a0, rSELF
   11908     move      a1, rOBJ
   11909     JAL(dvmReportExceptionThrow)
   11910     b         8b
   11911 
   11912 .LnotCaughtLocally:                     #  rOBJ = exception
   11913     /* fix stack overflow if necessary */
   11914     lbu       a1, offThread_stackOverflowed(rSELF)
   11915     beqz      a1, 3f
   11916     move      a0, rSELF
   11917     move      a1, rOBJ
   11918     JAL(dvmCleanupStackOverflow)           #  dvmCleanupStackOverflow(self, exception)
   11919 
   11920 3:
   11921     # may want to show "not caught locally" debug messages here
   11922 #if DVM_SHOW_EXCEPTION >= 2
   11923     /* call __android_log_print(prio, tag, format, ...) */
   11924     /* "Exception %s from %s:%d not caught locally" */
   11925     lw        a0, offThread_method(rSELF)
   11926     lw        a1, offMethod_insns(a0)
   11927     subu      a1, rPC, a1
   11928     sra       a1, a1, 1
   11929     JAL(dvmLineNumFromPC)
   11930     sw        v0, 20(sp)
   11931     # dvmGetMethodSourceFile(method)
   11932     lw        a0, offThread_method(rSELF)
   11933     JAL(dvmGetMethodSourceFile)
   11934     sw        v0, 16(sp)
   11935     # exception->clazz->descriptor
   11936     lw        a3, offObject_clazz(rOBJ)
   11937     lw        a3, offClassObject_descriptor(a3)
   11938     la        a2, .LstrExceptionNotCaughtLocally
   11939     la        a1, .LstrLogTag
   11940     li        a0, 3
   11941     JAL(__android_log_print)
   11942 #endif
   11943     sw        rOBJ, offThread_exception(rSELF)
   11944     move      a0, rOBJ
   11945     move      a1, rSELF
   11946     JAL(dvmReleaseTrackedAlloc)
   11947     b         common_gotoBail
   11948 
   11949     /*
   11950      * Exception handling, calls through "glue code".
   11951      */
   11952     .if     0
   11953 .LexceptionOld:
   11954     SAVE_PC_TO_SELF()                # export state
   11955     SAVE_FP_TO_SELF()
   11956     move     a0, rSELF               # arg to function
   11957     JAL(dvmMterp_exceptionThrown)
   11958     b       common_resumeAfterGlueCall
   11959     .endif
   11960 
   11961 #if defined(WITH_JIT)
   11962     /*
   11963      * If the JIT is actively building a trace we need to make sure
   11964      * that the field is fully resolved before including the current
   11965      * instruction.
   11966      *
   11967      * On entry:
   11968      *     rBIX: &dvmDex->pResFields[field]
   11969      *     a0:  field pointer (must preserve)
   11970      */
   11971 common_verifyField:
   11972      lhu     a3, offThread_subMode(rSELF)
   11973      andi    a3, kSubModeJitTraceBuild
   11974      bnez    a3, 1f                 # Not building trace, continue
   11975      jr      ra
   11976 1:
   11977      lw      a1, (rBIX)
   11978      beqz    a1, 2f                 # resolution complete ?
   11979      jr      ra
   11980 2:
   11981     SCRATCH_STORE(a0, 0)
   11982     SCRATCH_STORE(a1, 4)
   11983     SCRATCH_STORE(a2, 8)
   11984     SCRATCH_STORE(a3, 12)
   11985     SCRATCH_STORE(ra, 16)
   11986     move    a0, rSELF
   11987     move    a1, rPC
   11988     JAL(dvmJitEndTraceSelect)        #(self,pc) end trace before this inst)
   11989     SCRATCH_LOAD(a0, 0)
   11990     SCRATCH_LOAD(a1, 4)
   11991     SCRATCH_LOAD(a2, 8)
   11992     SCRATCH_LOAD(a3, 12)
   11993     SCRATCH_LOAD(ra, 16)
   11994     jr      ra                       # return
   11995 #endif
   11996 
   11997 /*
   11998  * After returning from a "glued" function, pull out the updated
   11999  * values and start executing at the next instruction.
   12000  */
   12001 common_resumeAfterGlueCall:
   12002     LOAD_PC_FP_FROM_SELF()           #  pull rPC and rFP out of thread
   12003     lw      rIBASE, offThread_curHandlerTable(rSELF) # refresh
   12004     FETCH_INST()                     #  load rINST from rPC
   12005     GET_INST_OPCODE(t0)              #  extract opcode from rINST
   12006     GOTO_OPCODE(t0)                  #  jump to next instruction
   12007 
   12008 /*
   12009  * Invalid array index. Note that our calling convention is strange; we use a1
   12010  * and a3 because those just happen to be the registers all our callers are
   12011  * using. We move a3 before calling the C function, but a1 happens to match.
   12012  * a1: index
   12013  * a3: size
   12014  */
   12015 common_errArrayIndex:
   12016     EXPORT_PC()
   12017     move      a0, a3
   12018     JAL(dvmThrowArrayIndexOutOfBoundsException)
   12019     b         common_exceptionThrown
   12020 
   12021 /*
   12022  * Integer divide or mod by zero.
   12023  */
   12024 common_errDivideByZero:
   12025     EXPORT_PC()
   12026     la     a0, .LstrDivideByZero
   12027     JAL(dvmThrowArithmeticException)
   12028     b       common_exceptionThrown
   12029 
   12030 /*
   12031  * Attempt to allocate an array with a negative size.
   12032  * On entry: length in a1
   12033  */
   12034 common_errNegativeArraySize:
   12035     EXPORT_PC()
   12036     move    a0, a1                                # arg0 <- len
   12037     JAL(dvmThrowNegativeArraySizeException)    # (len)
   12038     b       common_exceptionThrown
   12039 
   12040 /*
   12041  * Invocation of a non-existent method.
   12042  * On entry: method name in a1
   12043  */
   12044 common_errNoSuchMethod:
   12045     EXPORT_PC()
   12046     move     a0, a1
   12047     JAL(dvmThrowNoSuchMethodError)
   12048     b       common_exceptionThrown
   12049 
   12050 /*
   12051  * We encountered a null object when we weren't expecting one.  We
   12052  * export the PC, throw a NullPointerException, and goto the exception
   12053  * processing code.
   12054  */
   12055 common_errNullObject:
   12056     EXPORT_PC()
   12057     li      a0, 0
   12058     JAL(dvmThrowNullPointerException)
   12059     b       common_exceptionThrown
   12060 
   12061 /*
   12062  * For debugging, cause an immediate fault. The source address will be in ra. Use a jal to jump here.
   12063  */
   12064 common_abort:
   12065     lw      zero,-4(zero)            #  generate SIGSEGV
   12066 
   12067 /*
   12068  * Spit out a "we were here", preserving all registers.
   12069  */
   12070     .macro SQUEAK num
   12071 common_squeak\num:
   12072     STACK_STORE_RA();
   12073     la        a0, .LstrSqueak
   12074     LOAD_IMM(a1, \num);
   12075     JAL(printf);
   12076     STACK_LOAD_RA();
   12077     RETURN;
   12078     .endm
   12079 
   12080     SQUEAK 0
   12081     SQUEAK 1
   12082     SQUEAK 2
   12083     SQUEAK 3
   12084     SQUEAK 4
   12085     SQUEAK 5
   12086 
   12087 /*
   12088  * Spit out the number in a0, preserving registers.
   12089  */
   12090 common_printNum:
   12091     STACK_STORE_RA()
   12092     MOVE_REG(a1, a0)
   12093     la        a0, .LstrSqueak
   12094     JAL(printf)
   12095     STACK_LOAD_RA()
   12096     RETURN
   12097 
   12098 /*
   12099  * Print a newline, preserving registers.
   12100  */
   12101 common_printNewline:
   12102     STACK_STORE_RA()
   12103     la        a0, .LstrNewline
   12104     JAL(printf)
   12105     STACK_LOAD_RA()
   12106     RETURN
   12107 
   12108     /*
   12109      * Print the 32-bit quantity in a0 as a hex value, preserving registers.
   12110      */
   12111 common_printHex:
   12112     STACK_STORE_RA()
   12113     MOVE_REG(a1, a0)
   12114     la        a0, .LstrPrintHex
   12115     JAL(printf)
   12116     STACK_LOAD_RA()
   12117 RETURN;
   12118 
   12119 /*
   12120  * Print the 64-bit quantity in a0-a1, preserving registers.
   12121  */
   12122 common_printLong:
   12123     STACK_STORE_RA()
   12124     MOVE_REG(a3, a1)
   12125     MOVE_REG(a2, a0)
   12126     la        a0, .LstrPrintLong
   12127     JAL(printf)
   12128     STACK_LOAD_RA()
   12129     RETURN;
   12130 
   12131 /*
   12132  * Print full method info.  Pass the Method* in a0.  Preserves regs.
   12133  */
   12134 common_printMethod:
   12135     STACK_STORE_RA()
   12136     JAL(dvmMterpPrintMethod)
   12137     STACK_LOAD_RA()
   12138     RETURN
   12139 
   12140 /*
   12141  * Call a C helper function that dumps regs and possibly some
   12142  * additional info.  Requires the C function to be compiled in.
   12143  */
   12144     .if 0
   12145 common_dumpRegs:
   12146     STACK_STORE_RA()
   12147     JAL(dvmMterpDumpMipsRegs)
   12148     STACK_LOAD_RA()
   12149     RETURN
   12150     .endif
   12151 
   12152 /*
   12153  * Zero-terminated ASCII string data.
   12154  */
   12155     .data
   12156 
   12157 .LstrBadEntryPoint:
   12158     .asciiz "Bad entry point %d\n"
   12159 .LstrDivideByZero:
   12160     .asciiz "divide by zero"
   12161 .LstrFilledNewArrayNotImpl:
   12162     .asciiz "filled-new-array only implemented for 'int'"
   12163 .LstrLogTag:
   12164     .asciiz  "mterp"
   12165 .LstrExceptionNotCaughtLocally:
   12166     .asciiz  "Exception %s from %s:%d not caught locally\n"
   12167 
   12168 .LstrNewline:
   12169     .asciiz "\n"
   12170 .LstrSqueak:
   12171     .asciiz "<%d>"
   12172 .LstrPrintHex:
   12173     .asciiz "<0x%x>"
   12174 .LstrPrintLong:
   12175     .asciiz "<%lld>"
   12176 
   12177 
   12178     .global dvmAsmAltInstructionStart
   12179     .type   dvmAsmAltInstructionStart, %function
   12180     .text
   12181 
   12182 dvmAsmAltInstructionStart = .L_ALT_OP_NOP
   12183 /* ------------------------------ */
   12184     .balign 128
   12185 .L_ALT_OP_NOP: /* 0x00 */
   12186 /* File: mips/alt_stub.S */
   12187 /*
   12188  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12189  * any interesting requests and then jump to the real instruction
   12190  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12191  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12192  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12193  * bail to the real handler if breakFlags==0.
   12194  */
   12195     lbu    a3, offThread_breakFlags(rSELF)
   12196     la     rBIX, dvmAsmInstructionStart + (0 * 128)
   12197     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12198     bnez   a3, 1f
   12199     jr     rBIX            # nothing to do - jump to real handler
   12200 1:
   12201     EXPORT_PC()
   12202     move   a0, rPC         # arg0
   12203     move   a1, rFP         # arg1
   12204     move   a2, rSELF       # arg2
   12205     JAL(dvmCheckBefore)
   12206     jr     rBIX
   12207 
   12208 /* ------------------------------ */
   12209     .balign 128
   12210 .L_ALT_OP_MOVE: /* 0x01 */
   12211 /* File: mips/alt_stub.S */
   12212 /*
   12213  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12214  * any interesting requests and then jump to the real instruction
   12215  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12216  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12217  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12218  * bail to the real handler if breakFlags==0.
   12219  */
   12220     lbu    a3, offThread_breakFlags(rSELF)
   12221     la     rBIX, dvmAsmInstructionStart + (1 * 128)
   12222     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12223     bnez   a3, 1f
   12224     jr     rBIX            # nothing to do - jump to real handler
   12225 1:
   12226     EXPORT_PC()
   12227     move   a0, rPC         # arg0
   12228     move   a1, rFP         # arg1
   12229     move   a2, rSELF       # arg2
   12230     JAL(dvmCheckBefore)
   12231     jr     rBIX
   12232 
   12233 /* ------------------------------ */
   12234     .balign 128
   12235 .L_ALT_OP_MOVE_FROM16: /* 0x02 */
   12236 /* File: mips/alt_stub.S */
   12237 /*
   12238  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12239  * any interesting requests and then jump to the real instruction
   12240  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12241  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12242  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12243  * bail to the real handler if breakFlags==0.
   12244  */
   12245     lbu    a3, offThread_breakFlags(rSELF)
   12246     la     rBIX, dvmAsmInstructionStart + (2 * 128)
   12247     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12248     bnez   a3, 1f
   12249     jr     rBIX            # nothing to do - jump to real handler
   12250 1:
   12251     EXPORT_PC()
   12252     move   a0, rPC         # arg0
   12253     move   a1, rFP         # arg1
   12254     move   a2, rSELF       # arg2
   12255     JAL(dvmCheckBefore)
   12256     jr     rBIX
   12257 
   12258 /* ------------------------------ */
   12259     .balign 128
   12260 .L_ALT_OP_MOVE_16: /* 0x03 */
   12261 /* File: mips/alt_stub.S */
   12262 /*
   12263  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12264  * any interesting requests and then jump to the real instruction
   12265  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12266  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12267  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12268  * bail to the real handler if breakFlags==0.
   12269  */
   12270     lbu    a3, offThread_breakFlags(rSELF)
   12271     la     rBIX, dvmAsmInstructionStart + (3 * 128)
   12272     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12273     bnez   a3, 1f
   12274     jr     rBIX            # nothing to do - jump to real handler
   12275 1:
   12276     EXPORT_PC()
   12277     move   a0, rPC         # arg0
   12278     move   a1, rFP         # arg1
   12279     move   a2, rSELF       # arg2
   12280     JAL(dvmCheckBefore)
   12281     jr     rBIX
   12282 
   12283 /* ------------------------------ */
   12284     .balign 128
   12285 .L_ALT_OP_MOVE_WIDE: /* 0x04 */
   12286 /* File: mips/alt_stub.S */
   12287 /*
   12288  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12289  * any interesting requests and then jump to the real instruction
   12290  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12291  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12292  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12293  * bail to the real handler if breakFlags==0.
   12294  */
   12295     lbu    a3, offThread_breakFlags(rSELF)
   12296     la     rBIX, dvmAsmInstructionStart + (4 * 128)
   12297     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12298     bnez   a3, 1f
   12299     jr     rBIX            # nothing to do - jump to real handler
   12300 1:
   12301     EXPORT_PC()
   12302     move   a0, rPC         # arg0
   12303     move   a1, rFP         # arg1
   12304     move   a2, rSELF       # arg2
   12305     JAL(dvmCheckBefore)
   12306     jr     rBIX
   12307 
   12308 /* ------------------------------ */
   12309     .balign 128
   12310 .L_ALT_OP_MOVE_WIDE_FROM16: /* 0x05 */
   12311 /* File: mips/alt_stub.S */
   12312 /*
   12313  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12314  * any interesting requests and then jump to the real instruction
   12315  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12316  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12317  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12318  * bail to the real handler if breakFlags==0.
   12319  */
   12320     lbu    a3, offThread_breakFlags(rSELF)
   12321     la     rBIX, dvmAsmInstructionStart + (5 * 128)
   12322     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12323     bnez   a3, 1f
   12324     jr     rBIX            # nothing to do - jump to real handler
   12325 1:
   12326     EXPORT_PC()
   12327     move   a0, rPC         # arg0
   12328     move   a1, rFP         # arg1
   12329     move   a2, rSELF       # arg2
   12330     JAL(dvmCheckBefore)
   12331     jr     rBIX
   12332 
   12333 /* ------------------------------ */
   12334     .balign 128
   12335 .L_ALT_OP_MOVE_WIDE_16: /* 0x06 */
   12336 /* File: mips/alt_stub.S */
   12337 /*
   12338  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12339  * any interesting requests and then jump to the real instruction
   12340  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12341  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12342  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12343  * bail to the real handler if breakFlags==0.
   12344  */
   12345     lbu    a3, offThread_breakFlags(rSELF)
   12346     la     rBIX, dvmAsmInstructionStart + (6 * 128)
   12347     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12348     bnez   a3, 1f
   12349     jr     rBIX            # nothing to do - jump to real handler
   12350 1:
   12351     EXPORT_PC()
   12352     move   a0, rPC         # arg0
   12353     move   a1, rFP         # arg1
   12354     move   a2, rSELF       # arg2
   12355     JAL(dvmCheckBefore)
   12356     jr     rBIX
   12357 
   12358 /* ------------------------------ */
   12359     .balign 128
   12360 .L_ALT_OP_MOVE_OBJECT: /* 0x07 */
   12361 /* File: mips/alt_stub.S */
   12362 /*
   12363  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12364  * any interesting requests and then jump to the real instruction
   12365  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12366  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12367  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12368  * bail to the real handler if breakFlags==0.
   12369  */
   12370     lbu    a3, offThread_breakFlags(rSELF)
   12371     la     rBIX, dvmAsmInstructionStart + (7 * 128)
   12372     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12373     bnez   a3, 1f
   12374     jr     rBIX            # nothing to do - jump to real handler
   12375 1:
   12376     EXPORT_PC()
   12377     move   a0, rPC         # arg0
   12378     move   a1, rFP         # arg1
   12379     move   a2, rSELF       # arg2
   12380     JAL(dvmCheckBefore)
   12381     jr     rBIX
   12382 
   12383 /* ------------------------------ */
   12384     .balign 128
   12385 .L_ALT_OP_MOVE_OBJECT_FROM16: /* 0x08 */
   12386 /* File: mips/alt_stub.S */
   12387 /*
   12388  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12389  * any interesting requests and then jump to the real instruction
   12390  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12391  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12392  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12393  * bail to the real handler if breakFlags==0.
   12394  */
   12395     lbu    a3, offThread_breakFlags(rSELF)
   12396     la     rBIX, dvmAsmInstructionStart + (8 * 128)
   12397     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12398     bnez   a3, 1f
   12399     jr     rBIX            # nothing to do - jump to real handler
   12400 1:
   12401     EXPORT_PC()
   12402     move   a0, rPC         # arg0
   12403     move   a1, rFP         # arg1
   12404     move   a2, rSELF       # arg2
   12405     JAL(dvmCheckBefore)
   12406     jr     rBIX
   12407 
   12408 /* ------------------------------ */
   12409     .balign 128
   12410 .L_ALT_OP_MOVE_OBJECT_16: /* 0x09 */
   12411 /* File: mips/alt_stub.S */
   12412 /*
   12413  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12414  * any interesting requests and then jump to the real instruction
   12415  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12416  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12417  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12418  * bail to the real handler if breakFlags==0.
   12419  */
   12420     lbu    a3, offThread_breakFlags(rSELF)
   12421     la     rBIX, dvmAsmInstructionStart + (9 * 128)
   12422     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12423     bnez   a3, 1f
   12424     jr     rBIX            # nothing to do - jump to real handler
   12425 1:
   12426     EXPORT_PC()
   12427     move   a0, rPC         # arg0
   12428     move   a1, rFP         # arg1
   12429     move   a2, rSELF       # arg2
   12430     JAL(dvmCheckBefore)
   12431     jr     rBIX
   12432 
   12433 /* ------------------------------ */
   12434     .balign 128
   12435 .L_ALT_OP_MOVE_RESULT: /* 0x0a */
   12436 /* File: mips/alt_stub.S */
   12437 /*
   12438  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12439  * any interesting requests and then jump to the real instruction
   12440  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12441  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12442  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12443  * bail to the real handler if breakFlags==0.
   12444  */
   12445     lbu    a3, offThread_breakFlags(rSELF)
   12446     la     rBIX, dvmAsmInstructionStart + (10 * 128)
   12447     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12448     bnez   a3, 1f
   12449     jr     rBIX            # nothing to do - jump to real handler
   12450 1:
   12451     EXPORT_PC()
   12452     move   a0, rPC         # arg0
   12453     move   a1, rFP         # arg1
   12454     move   a2, rSELF       # arg2
   12455     JAL(dvmCheckBefore)
   12456     jr     rBIX
   12457 
   12458 /* ------------------------------ */
   12459     .balign 128
   12460 .L_ALT_OP_MOVE_RESULT_WIDE: /* 0x0b */
   12461 /* File: mips/alt_stub.S */
   12462 /*
   12463  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12464  * any interesting requests and then jump to the real instruction
   12465  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12466  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12467  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12468  * bail to the real handler if breakFlags==0.
   12469  */
   12470     lbu    a3, offThread_breakFlags(rSELF)
   12471     la     rBIX, dvmAsmInstructionStart + (11 * 128)
   12472     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12473     bnez   a3, 1f
   12474     jr     rBIX            # nothing to do - jump to real handler
   12475 1:
   12476     EXPORT_PC()
   12477     move   a0, rPC         # arg0
   12478     move   a1, rFP         # arg1
   12479     move   a2, rSELF       # arg2
   12480     JAL(dvmCheckBefore)
   12481     jr     rBIX
   12482 
   12483 /* ------------------------------ */
   12484     .balign 128
   12485 .L_ALT_OP_MOVE_RESULT_OBJECT: /* 0x0c */
   12486 /* File: mips/alt_stub.S */
   12487 /*
   12488  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12489  * any interesting requests and then jump to the real instruction
   12490  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12491  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12492  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12493  * bail to the real handler if breakFlags==0.
   12494  */
   12495     lbu    a3, offThread_breakFlags(rSELF)
   12496     la     rBIX, dvmAsmInstructionStart + (12 * 128)
   12497     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12498     bnez   a3, 1f
   12499     jr     rBIX            # nothing to do - jump to real handler
   12500 1:
   12501     EXPORT_PC()
   12502     move   a0, rPC         # arg0
   12503     move   a1, rFP         # arg1
   12504     move   a2, rSELF       # arg2
   12505     JAL(dvmCheckBefore)
   12506     jr     rBIX
   12507 
   12508 /* ------------------------------ */
   12509     .balign 128
   12510 .L_ALT_OP_MOVE_EXCEPTION: /* 0x0d */
   12511 /* File: mips/alt_stub.S */
   12512 /*
   12513  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12514  * any interesting requests and then jump to the real instruction
   12515  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12516  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12517  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12518  * bail to the real handler if breakFlags==0.
   12519  */
   12520     lbu    a3, offThread_breakFlags(rSELF)
   12521     la     rBIX, dvmAsmInstructionStart + (13 * 128)
   12522     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12523     bnez   a3, 1f
   12524     jr     rBIX            # nothing to do - jump to real handler
   12525 1:
   12526     EXPORT_PC()
   12527     move   a0, rPC         # arg0
   12528     move   a1, rFP         # arg1
   12529     move   a2, rSELF       # arg2
   12530     JAL(dvmCheckBefore)
   12531     jr     rBIX
   12532 
   12533 /* ------------------------------ */
   12534     .balign 128
   12535 .L_ALT_OP_RETURN_VOID: /* 0x0e */
   12536 /* File: mips/alt_stub.S */
   12537 /*
   12538  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12539  * any interesting requests and then jump to the real instruction
   12540  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12541  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12542  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12543  * bail to the real handler if breakFlags==0.
   12544  */
   12545     lbu    a3, offThread_breakFlags(rSELF)
   12546     la     rBIX, dvmAsmInstructionStart + (14 * 128)
   12547     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12548     bnez   a3, 1f
   12549     jr     rBIX            # nothing to do - jump to real handler
   12550 1:
   12551     EXPORT_PC()
   12552     move   a0, rPC         # arg0
   12553     move   a1, rFP         # arg1
   12554     move   a2, rSELF       # arg2
   12555     JAL(dvmCheckBefore)
   12556     jr     rBIX
   12557 
   12558 /* ------------------------------ */
   12559     .balign 128
   12560 .L_ALT_OP_RETURN: /* 0x0f */
   12561 /* File: mips/alt_stub.S */
   12562 /*
   12563  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12564  * any interesting requests and then jump to the real instruction
   12565  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12566  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12567  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12568  * bail to the real handler if breakFlags==0.
   12569  */
   12570     lbu    a3, offThread_breakFlags(rSELF)
   12571     la     rBIX, dvmAsmInstructionStart + (15 * 128)
   12572     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12573     bnez   a3, 1f
   12574     jr     rBIX            # nothing to do - jump to real handler
   12575 1:
   12576     EXPORT_PC()
   12577     move   a0, rPC         # arg0
   12578     move   a1, rFP         # arg1
   12579     move   a2, rSELF       # arg2
   12580     JAL(dvmCheckBefore)
   12581     jr     rBIX
   12582 
   12583 /* ------------------------------ */
   12584     .balign 128
   12585 .L_ALT_OP_RETURN_WIDE: /* 0x10 */
   12586 /* File: mips/alt_stub.S */
   12587 /*
   12588  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12589  * any interesting requests and then jump to the real instruction
   12590  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12591  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12592  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12593  * bail to the real handler if breakFlags==0.
   12594  */
   12595     lbu    a3, offThread_breakFlags(rSELF)
   12596     la     rBIX, dvmAsmInstructionStart + (16 * 128)
   12597     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12598     bnez   a3, 1f
   12599     jr     rBIX            # nothing to do - jump to real handler
   12600 1:
   12601     EXPORT_PC()
   12602     move   a0, rPC         # arg0
   12603     move   a1, rFP         # arg1
   12604     move   a2, rSELF       # arg2
   12605     JAL(dvmCheckBefore)
   12606     jr     rBIX
   12607 
   12608 /* ------------------------------ */
   12609     .balign 128
   12610 .L_ALT_OP_RETURN_OBJECT: /* 0x11 */
   12611 /* File: mips/alt_stub.S */
   12612 /*
   12613  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12614  * any interesting requests and then jump to the real instruction
   12615  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12616  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12617  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12618  * bail to the real handler if breakFlags==0.
   12619  */
   12620     lbu    a3, offThread_breakFlags(rSELF)
   12621     la     rBIX, dvmAsmInstructionStart + (17 * 128)
   12622     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12623     bnez   a3, 1f
   12624     jr     rBIX            # nothing to do - jump to real handler
   12625 1:
   12626     EXPORT_PC()
   12627     move   a0, rPC         # arg0
   12628     move   a1, rFP         # arg1
   12629     move   a2, rSELF       # arg2
   12630     JAL(dvmCheckBefore)
   12631     jr     rBIX
   12632 
   12633 /* ------------------------------ */
   12634     .balign 128
   12635 .L_ALT_OP_CONST_4: /* 0x12 */
   12636 /* File: mips/alt_stub.S */
   12637 /*
   12638  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12639  * any interesting requests and then jump to the real instruction
   12640  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12641  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12642  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12643  * bail to the real handler if breakFlags==0.
   12644  */
   12645     lbu    a3, offThread_breakFlags(rSELF)
   12646     la     rBIX, dvmAsmInstructionStart + (18 * 128)
   12647     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12648     bnez   a3, 1f
   12649     jr     rBIX            # nothing to do - jump to real handler
   12650 1:
   12651     EXPORT_PC()
   12652     move   a0, rPC         # arg0
   12653     move   a1, rFP         # arg1
   12654     move   a2, rSELF       # arg2
   12655     JAL(dvmCheckBefore)
   12656     jr     rBIX
   12657 
   12658 /* ------------------------------ */
   12659     .balign 128
   12660 .L_ALT_OP_CONST_16: /* 0x13 */
   12661 /* File: mips/alt_stub.S */
   12662 /*
   12663  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12664  * any interesting requests and then jump to the real instruction
   12665  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12666  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12667  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12668  * bail to the real handler if breakFlags==0.
   12669  */
   12670     lbu    a3, offThread_breakFlags(rSELF)
   12671     la     rBIX, dvmAsmInstructionStart + (19 * 128)
   12672     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12673     bnez   a3, 1f
   12674     jr     rBIX            # nothing to do - jump to real handler
   12675 1:
   12676     EXPORT_PC()
   12677     move   a0, rPC         # arg0
   12678     move   a1, rFP         # arg1
   12679     move   a2, rSELF       # arg2
   12680     JAL(dvmCheckBefore)
   12681     jr     rBIX
   12682 
   12683 /* ------------------------------ */
   12684     .balign 128
   12685 .L_ALT_OP_CONST: /* 0x14 */
   12686 /* File: mips/alt_stub.S */
   12687 /*
   12688  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12689  * any interesting requests and then jump to the real instruction
   12690  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12691  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12692  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12693  * bail to the real handler if breakFlags==0.
   12694  */
   12695     lbu    a3, offThread_breakFlags(rSELF)
   12696     la     rBIX, dvmAsmInstructionStart + (20 * 128)
   12697     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12698     bnez   a3, 1f
   12699     jr     rBIX            # nothing to do - jump to real handler
   12700 1:
   12701     EXPORT_PC()
   12702     move   a0, rPC         # arg0
   12703     move   a1, rFP         # arg1
   12704     move   a2, rSELF       # arg2
   12705     JAL(dvmCheckBefore)
   12706     jr     rBIX
   12707 
   12708 /* ------------------------------ */
   12709     .balign 128
   12710 .L_ALT_OP_CONST_HIGH16: /* 0x15 */
   12711 /* File: mips/alt_stub.S */
   12712 /*
   12713  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12714  * any interesting requests and then jump to the real instruction
   12715  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12716  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12717  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12718  * bail to the real handler if breakFlags==0.
   12719  */
   12720     lbu    a3, offThread_breakFlags(rSELF)
   12721     la     rBIX, dvmAsmInstructionStart + (21 * 128)
   12722     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12723     bnez   a3, 1f
   12724     jr     rBIX            # nothing to do - jump to real handler
   12725 1:
   12726     EXPORT_PC()
   12727     move   a0, rPC         # arg0
   12728     move   a1, rFP         # arg1
   12729     move   a2, rSELF       # arg2
   12730     JAL(dvmCheckBefore)
   12731     jr     rBIX
   12732 
   12733 /* ------------------------------ */
   12734     .balign 128
   12735 .L_ALT_OP_CONST_WIDE_16: /* 0x16 */
   12736 /* File: mips/alt_stub.S */
   12737 /*
   12738  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12739  * any interesting requests and then jump to the real instruction
   12740  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12741  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12742  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12743  * bail to the real handler if breakFlags==0.
   12744  */
   12745     lbu    a3, offThread_breakFlags(rSELF)
   12746     la     rBIX, dvmAsmInstructionStart + (22 * 128)
   12747     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12748     bnez   a3, 1f
   12749     jr     rBIX            # nothing to do - jump to real handler
   12750 1:
   12751     EXPORT_PC()
   12752     move   a0, rPC         # arg0
   12753     move   a1, rFP         # arg1
   12754     move   a2, rSELF       # arg2
   12755     JAL(dvmCheckBefore)
   12756     jr     rBIX
   12757 
   12758 /* ------------------------------ */
   12759     .balign 128
   12760 .L_ALT_OP_CONST_WIDE_32: /* 0x17 */
   12761 /* File: mips/alt_stub.S */
   12762 /*
   12763  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12764  * any interesting requests and then jump to the real instruction
   12765  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12766  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12767  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12768  * bail to the real handler if breakFlags==0.
   12769  */
   12770     lbu    a3, offThread_breakFlags(rSELF)
   12771     la     rBIX, dvmAsmInstructionStart + (23 * 128)
   12772     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12773     bnez   a3, 1f
   12774     jr     rBIX            # nothing to do - jump to real handler
   12775 1:
   12776     EXPORT_PC()
   12777     move   a0, rPC         # arg0
   12778     move   a1, rFP         # arg1
   12779     move   a2, rSELF       # arg2
   12780     JAL(dvmCheckBefore)
   12781     jr     rBIX
   12782 
   12783 /* ------------------------------ */
   12784     .balign 128
   12785 .L_ALT_OP_CONST_WIDE: /* 0x18 */
   12786 /* File: mips/alt_stub.S */
   12787 /*
   12788  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12789  * any interesting requests and then jump to the real instruction
   12790  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12791  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12792  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12793  * bail to the real handler if breakFlags==0.
   12794  */
   12795     lbu    a3, offThread_breakFlags(rSELF)
   12796     la     rBIX, dvmAsmInstructionStart + (24 * 128)
   12797     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12798     bnez   a3, 1f
   12799     jr     rBIX            # nothing to do - jump to real handler
   12800 1:
   12801     EXPORT_PC()
   12802     move   a0, rPC         # arg0
   12803     move   a1, rFP         # arg1
   12804     move   a2, rSELF       # arg2
   12805     JAL(dvmCheckBefore)
   12806     jr     rBIX
   12807 
   12808 /* ------------------------------ */
   12809     .balign 128
   12810 .L_ALT_OP_CONST_WIDE_HIGH16: /* 0x19 */
   12811 /* File: mips/alt_stub.S */
   12812 /*
   12813  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12814  * any interesting requests and then jump to the real instruction
   12815  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12816  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12817  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12818  * bail to the real handler if breakFlags==0.
   12819  */
   12820     lbu    a3, offThread_breakFlags(rSELF)
   12821     la     rBIX, dvmAsmInstructionStart + (25 * 128)
   12822     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12823     bnez   a3, 1f
   12824     jr     rBIX            # nothing to do - jump to real handler
   12825 1:
   12826     EXPORT_PC()
   12827     move   a0, rPC         # arg0
   12828     move   a1, rFP         # arg1
   12829     move   a2, rSELF       # arg2
   12830     JAL(dvmCheckBefore)
   12831     jr     rBIX
   12832 
   12833 /* ------------------------------ */
   12834     .balign 128
   12835 .L_ALT_OP_CONST_STRING: /* 0x1a */
   12836 /* File: mips/alt_stub.S */
   12837 /*
   12838  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12839  * any interesting requests and then jump to the real instruction
   12840  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12841  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12842  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12843  * bail to the real handler if breakFlags==0.
   12844  */
   12845     lbu    a3, offThread_breakFlags(rSELF)
   12846     la     rBIX, dvmAsmInstructionStart + (26 * 128)
   12847     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12848     bnez   a3, 1f
   12849     jr     rBIX            # nothing to do - jump to real handler
   12850 1:
   12851     EXPORT_PC()
   12852     move   a0, rPC         # arg0
   12853     move   a1, rFP         # arg1
   12854     move   a2, rSELF       # arg2
   12855     JAL(dvmCheckBefore)
   12856     jr     rBIX
   12857 
   12858 /* ------------------------------ */
   12859     .balign 128
   12860 .L_ALT_OP_CONST_STRING_JUMBO: /* 0x1b */
   12861 /* File: mips/alt_stub.S */
   12862 /*
   12863  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12864  * any interesting requests and then jump to the real instruction
   12865  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12866  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12867  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12868  * bail to the real handler if breakFlags==0.
   12869  */
   12870     lbu    a3, offThread_breakFlags(rSELF)
   12871     la     rBIX, dvmAsmInstructionStart + (27 * 128)
   12872     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12873     bnez   a3, 1f
   12874     jr     rBIX            # nothing to do - jump to real handler
   12875 1:
   12876     EXPORT_PC()
   12877     move   a0, rPC         # arg0
   12878     move   a1, rFP         # arg1
   12879     move   a2, rSELF       # arg2
   12880     JAL(dvmCheckBefore)
   12881     jr     rBIX
   12882 
   12883 /* ------------------------------ */
   12884     .balign 128
   12885 .L_ALT_OP_CONST_CLASS: /* 0x1c */
   12886 /* File: mips/alt_stub.S */
   12887 /*
   12888  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12889  * any interesting requests and then jump to the real instruction
   12890  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12891  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12892  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12893  * bail to the real handler if breakFlags==0.
   12894  */
   12895     lbu    a3, offThread_breakFlags(rSELF)
   12896     la     rBIX, dvmAsmInstructionStart + (28 * 128)
   12897     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12898     bnez   a3, 1f
   12899     jr     rBIX            # nothing to do - jump to real handler
   12900 1:
   12901     EXPORT_PC()
   12902     move   a0, rPC         # arg0
   12903     move   a1, rFP         # arg1
   12904     move   a2, rSELF       # arg2
   12905     JAL(dvmCheckBefore)
   12906     jr     rBIX
   12907 
   12908 /* ------------------------------ */
   12909     .balign 128
   12910 .L_ALT_OP_MONITOR_ENTER: /* 0x1d */
   12911 /* File: mips/alt_stub.S */
   12912 /*
   12913  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12914  * any interesting requests and then jump to the real instruction
   12915  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12916  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12917  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12918  * bail to the real handler if breakFlags==0.
   12919  */
   12920     lbu    a3, offThread_breakFlags(rSELF)
   12921     la     rBIX, dvmAsmInstructionStart + (29 * 128)
   12922     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12923     bnez   a3, 1f
   12924     jr     rBIX            # nothing to do - jump to real handler
   12925 1:
   12926     EXPORT_PC()
   12927     move   a0, rPC         # arg0
   12928     move   a1, rFP         # arg1
   12929     move   a2, rSELF       # arg2
   12930     JAL(dvmCheckBefore)
   12931     jr     rBIX
   12932 
   12933 /* ------------------------------ */
   12934     .balign 128
   12935 .L_ALT_OP_MONITOR_EXIT: /* 0x1e */
   12936 /* File: mips/alt_stub.S */
   12937 /*
   12938  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12939  * any interesting requests and then jump to the real instruction
   12940  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12941  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12942  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12943  * bail to the real handler if breakFlags==0.
   12944  */
   12945     lbu    a3, offThread_breakFlags(rSELF)
   12946     la     rBIX, dvmAsmInstructionStart + (30 * 128)
   12947     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12948     bnez   a3, 1f
   12949     jr     rBIX            # nothing to do - jump to real handler
   12950 1:
   12951     EXPORT_PC()
   12952     move   a0, rPC         # arg0
   12953     move   a1, rFP         # arg1
   12954     move   a2, rSELF       # arg2
   12955     JAL(dvmCheckBefore)
   12956     jr     rBIX
   12957 
   12958 /* ------------------------------ */
   12959     .balign 128
   12960 .L_ALT_OP_CHECK_CAST: /* 0x1f */
   12961 /* File: mips/alt_stub.S */
   12962 /*
   12963  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12964  * any interesting requests and then jump to the real instruction
   12965  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12966  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12967  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12968  * bail to the real handler if breakFlags==0.
   12969  */
   12970     lbu    a3, offThread_breakFlags(rSELF)
   12971     la     rBIX, dvmAsmInstructionStart + (31 * 128)
   12972     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12973     bnez   a3, 1f
   12974     jr     rBIX            # nothing to do - jump to real handler
   12975 1:
   12976     EXPORT_PC()
   12977     move   a0, rPC         # arg0
   12978     move   a1, rFP         # arg1
   12979     move   a2, rSELF       # arg2
   12980     JAL(dvmCheckBefore)
   12981     jr     rBIX
   12982 
   12983 /* ------------------------------ */
   12984     .balign 128
   12985 .L_ALT_OP_INSTANCE_OF: /* 0x20 */
   12986 /* File: mips/alt_stub.S */
   12987 /*
   12988  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   12989  * any interesting requests and then jump to the real instruction
   12990  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   12991  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   12992  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   12993  * bail to the real handler if breakFlags==0.
   12994  */
   12995     lbu    a3, offThread_breakFlags(rSELF)
   12996     la     rBIX, dvmAsmInstructionStart + (32 * 128)
   12997     lw     rIBASE, offThread_curHandlerTable(rSELF)
   12998     bnez   a3, 1f
   12999     jr     rBIX            # nothing to do - jump to real handler
   13000 1:
   13001     EXPORT_PC()
   13002     move   a0, rPC         # arg0
   13003     move   a1, rFP         # arg1
   13004     move   a2, rSELF       # arg2
   13005     JAL(dvmCheckBefore)
   13006     jr     rBIX
   13007 
   13008 /* ------------------------------ */
   13009     .balign 128
   13010 .L_ALT_OP_ARRAY_LENGTH: /* 0x21 */
   13011 /* File: mips/alt_stub.S */
   13012 /*
   13013  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13014  * any interesting requests and then jump to the real instruction
   13015  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13016  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13017  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13018  * bail to the real handler if breakFlags==0.
   13019  */
   13020     lbu    a3, offThread_breakFlags(rSELF)
   13021     la     rBIX, dvmAsmInstructionStart + (33 * 128)
   13022     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13023     bnez   a3, 1f
   13024     jr     rBIX            # nothing to do - jump to real handler
   13025 1:
   13026     EXPORT_PC()
   13027     move   a0, rPC         # arg0
   13028     move   a1, rFP         # arg1
   13029     move   a2, rSELF       # arg2
   13030     JAL(dvmCheckBefore)
   13031     jr     rBIX
   13032 
   13033 /* ------------------------------ */
   13034     .balign 128
   13035 .L_ALT_OP_NEW_INSTANCE: /* 0x22 */
   13036 /* File: mips/alt_stub.S */
   13037 /*
   13038  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13039  * any interesting requests and then jump to the real instruction
   13040  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13041  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13042  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13043  * bail to the real handler if breakFlags==0.
   13044  */
   13045     lbu    a3, offThread_breakFlags(rSELF)
   13046     la     rBIX, dvmAsmInstructionStart + (34 * 128)
   13047     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13048     bnez   a3, 1f
   13049     jr     rBIX            # nothing to do - jump to real handler
   13050 1:
   13051     EXPORT_PC()
   13052     move   a0, rPC         # arg0
   13053     move   a1, rFP         # arg1
   13054     move   a2, rSELF       # arg2
   13055     JAL(dvmCheckBefore)
   13056     jr     rBIX
   13057 
   13058 /* ------------------------------ */
   13059     .balign 128
   13060 .L_ALT_OP_NEW_ARRAY: /* 0x23 */
   13061 /* File: mips/alt_stub.S */
   13062 /*
   13063  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13064  * any interesting requests and then jump to the real instruction
   13065  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13066  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13067  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13068  * bail to the real handler if breakFlags==0.
   13069  */
   13070     lbu    a3, offThread_breakFlags(rSELF)
   13071     la     rBIX, dvmAsmInstructionStart + (35 * 128)
   13072     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13073     bnez   a3, 1f
   13074     jr     rBIX            # nothing to do - jump to real handler
   13075 1:
   13076     EXPORT_PC()
   13077     move   a0, rPC         # arg0
   13078     move   a1, rFP         # arg1
   13079     move   a2, rSELF       # arg2
   13080     JAL(dvmCheckBefore)
   13081     jr     rBIX
   13082 
   13083 /* ------------------------------ */
   13084     .balign 128
   13085 .L_ALT_OP_FILLED_NEW_ARRAY: /* 0x24 */
   13086 /* File: mips/alt_stub.S */
   13087 /*
   13088  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13089  * any interesting requests and then jump to the real instruction
   13090  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13091  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13092  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13093  * bail to the real handler if breakFlags==0.
   13094  */
   13095     lbu    a3, offThread_breakFlags(rSELF)
   13096     la     rBIX, dvmAsmInstructionStart + (36 * 128)
   13097     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13098     bnez   a3, 1f
   13099     jr     rBIX            # nothing to do - jump to real handler
   13100 1:
   13101     EXPORT_PC()
   13102     move   a0, rPC         # arg0
   13103     move   a1, rFP         # arg1
   13104     move   a2, rSELF       # arg2
   13105     JAL(dvmCheckBefore)
   13106     jr     rBIX
   13107 
   13108 /* ------------------------------ */
   13109     .balign 128
   13110 .L_ALT_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
   13111 /* File: mips/alt_stub.S */
   13112 /*
   13113  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13114  * any interesting requests and then jump to the real instruction
   13115  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13116  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13117  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13118  * bail to the real handler if breakFlags==0.
   13119  */
   13120     lbu    a3, offThread_breakFlags(rSELF)
   13121     la     rBIX, dvmAsmInstructionStart + (37 * 128)
   13122     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13123     bnez   a3, 1f
   13124     jr     rBIX            # nothing to do - jump to real handler
   13125 1:
   13126     EXPORT_PC()
   13127     move   a0, rPC         # arg0
   13128     move   a1, rFP         # arg1
   13129     move   a2, rSELF       # arg2
   13130     JAL(dvmCheckBefore)
   13131     jr     rBIX
   13132 
   13133 /* ------------------------------ */
   13134     .balign 128
   13135 .L_ALT_OP_FILL_ARRAY_DATA: /* 0x26 */
   13136 /* File: mips/alt_stub.S */
   13137 /*
   13138  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13139  * any interesting requests and then jump to the real instruction
   13140  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13141  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13142  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13143  * bail to the real handler if breakFlags==0.
   13144  */
   13145     lbu    a3, offThread_breakFlags(rSELF)
   13146     la     rBIX, dvmAsmInstructionStart + (38 * 128)
   13147     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13148     bnez   a3, 1f
   13149     jr     rBIX            # nothing to do - jump to real handler
   13150 1:
   13151     EXPORT_PC()
   13152     move   a0, rPC         # arg0
   13153     move   a1, rFP         # arg1
   13154     move   a2, rSELF       # arg2
   13155     JAL(dvmCheckBefore)
   13156     jr     rBIX
   13157 
   13158 /* ------------------------------ */
   13159     .balign 128
   13160 .L_ALT_OP_THROW: /* 0x27 */
   13161 /* File: mips/alt_stub.S */
   13162 /*
   13163  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13164  * any interesting requests and then jump to the real instruction
   13165  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13166  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13167  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13168  * bail to the real handler if breakFlags==0.
   13169  */
   13170     lbu    a3, offThread_breakFlags(rSELF)
   13171     la     rBIX, dvmAsmInstructionStart + (39 * 128)
   13172     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13173     bnez   a3, 1f
   13174     jr     rBIX            # nothing to do - jump to real handler
   13175 1:
   13176     EXPORT_PC()
   13177     move   a0, rPC         # arg0
   13178     move   a1, rFP         # arg1
   13179     move   a2, rSELF       # arg2
   13180     JAL(dvmCheckBefore)
   13181     jr     rBIX
   13182 
   13183 /* ------------------------------ */
   13184     .balign 128
   13185 .L_ALT_OP_GOTO: /* 0x28 */
   13186 /* File: mips/alt_stub.S */
   13187 /*
   13188  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13189  * any interesting requests and then jump to the real instruction
   13190  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13191  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13192  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13193  * bail to the real handler if breakFlags==0.
   13194  */
   13195     lbu    a3, offThread_breakFlags(rSELF)
   13196     la     rBIX, dvmAsmInstructionStart + (40 * 128)
   13197     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13198     bnez   a3, 1f
   13199     jr     rBIX            # nothing to do - jump to real handler
   13200 1:
   13201     EXPORT_PC()
   13202     move   a0, rPC         # arg0
   13203     move   a1, rFP         # arg1
   13204     move   a2, rSELF       # arg2
   13205     JAL(dvmCheckBefore)
   13206     jr     rBIX
   13207 
   13208 /* ------------------------------ */
   13209     .balign 128
   13210 .L_ALT_OP_GOTO_16: /* 0x29 */
   13211 /* File: mips/alt_stub.S */
   13212 /*
   13213  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13214  * any interesting requests and then jump to the real instruction
   13215  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13216  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13217  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13218  * bail to the real handler if breakFlags==0.
   13219  */
   13220     lbu    a3, offThread_breakFlags(rSELF)
   13221     la     rBIX, dvmAsmInstructionStart + (41 * 128)
   13222     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13223     bnez   a3, 1f
   13224     jr     rBIX            # nothing to do - jump to real handler
   13225 1:
   13226     EXPORT_PC()
   13227     move   a0, rPC         # arg0
   13228     move   a1, rFP         # arg1
   13229     move   a2, rSELF       # arg2
   13230     JAL(dvmCheckBefore)
   13231     jr     rBIX
   13232 
   13233 /* ------------------------------ */
   13234     .balign 128
   13235 .L_ALT_OP_GOTO_32: /* 0x2a */
   13236 /* File: mips/alt_stub.S */
   13237 /*
   13238  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13239  * any interesting requests and then jump to the real instruction
   13240  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13241  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13242  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13243  * bail to the real handler if breakFlags==0.
   13244  */
   13245     lbu    a3, offThread_breakFlags(rSELF)
   13246     la     rBIX, dvmAsmInstructionStart + (42 * 128)
   13247     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13248     bnez   a3, 1f
   13249     jr     rBIX            # nothing to do - jump to real handler
   13250 1:
   13251     EXPORT_PC()
   13252     move   a0, rPC         # arg0
   13253     move   a1, rFP         # arg1
   13254     move   a2, rSELF       # arg2
   13255     JAL(dvmCheckBefore)
   13256     jr     rBIX
   13257 
   13258 /* ------------------------------ */
   13259     .balign 128
   13260 .L_ALT_OP_PACKED_SWITCH: /* 0x2b */
   13261 /* File: mips/alt_stub.S */
   13262 /*
   13263  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13264  * any interesting requests and then jump to the real instruction
   13265  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13266  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13267  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13268  * bail to the real handler if breakFlags==0.
   13269  */
   13270     lbu    a3, offThread_breakFlags(rSELF)
   13271     la     rBIX, dvmAsmInstructionStart + (43 * 128)
   13272     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13273     bnez   a3, 1f
   13274     jr     rBIX            # nothing to do - jump to real handler
   13275 1:
   13276     EXPORT_PC()
   13277     move   a0, rPC         # arg0
   13278     move   a1, rFP         # arg1
   13279     move   a2, rSELF       # arg2
   13280     JAL(dvmCheckBefore)
   13281     jr     rBIX
   13282 
   13283 /* ------------------------------ */
   13284     .balign 128
   13285 .L_ALT_OP_SPARSE_SWITCH: /* 0x2c */
   13286 /* File: mips/alt_stub.S */
   13287 /*
   13288  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13289  * any interesting requests and then jump to the real instruction
   13290  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13291  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13292  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13293  * bail to the real handler if breakFlags==0.
   13294  */
   13295     lbu    a3, offThread_breakFlags(rSELF)
   13296     la     rBIX, dvmAsmInstructionStart + (44 * 128)
   13297     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13298     bnez   a3, 1f
   13299     jr     rBIX            # nothing to do - jump to real handler
   13300 1:
   13301     EXPORT_PC()
   13302     move   a0, rPC         # arg0
   13303     move   a1, rFP         # arg1
   13304     move   a2, rSELF       # arg2
   13305     JAL(dvmCheckBefore)
   13306     jr     rBIX
   13307 
   13308 /* ------------------------------ */
   13309     .balign 128
   13310 .L_ALT_OP_CMPL_FLOAT: /* 0x2d */
   13311 /* File: mips/alt_stub.S */
   13312 /*
   13313  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13314  * any interesting requests and then jump to the real instruction
   13315  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13316  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13317  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13318  * bail to the real handler if breakFlags==0.
   13319  */
   13320     lbu    a3, offThread_breakFlags(rSELF)
   13321     la     rBIX, dvmAsmInstructionStart + (45 * 128)
   13322     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13323     bnez   a3, 1f
   13324     jr     rBIX            # nothing to do - jump to real handler
   13325 1:
   13326     EXPORT_PC()
   13327     move   a0, rPC         # arg0
   13328     move   a1, rFP         # arg1
   13329     move   a2, rSELF       # arg2
   13330     JAL(dvmCheckBefore)
   13331     jr     rBIX
   13332 
   13333 /* ------------------------------ */
   13334     .balign 128
   13335 .L_ALT_OP_CMPG_FLOAT: /* 0x2e */
   13336 /* File: mips/alt_stub.S */
   13337 /*
   13338  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13339  * any interesting requests and then jump to the real instruction
   13340  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13341  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13342  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13343  * bail to the real handler if breakFlags==0.
   13344  */
   13345     lbu    a3, offThread_breakFlags(rSELF)
   13346     la     rBIX, dvmAsmInstructionStart + (46 * 128)
   13347     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13348     bnez   a3, 1f
   13349     jr     rBIX            # nothing to do - jump to real handler
   13350 1:
   13351     EXPORT_PC()
   13352     move   a0, rPC         # arg0
   13353     move   a1, rFP         # arg1
   13354     move   a2, rSELF       # arg2
   13355     JAL(dvmCheckBefore)
   13356     jr     rBIX
   13357 
   13358 /* ------------------------------ */
   13359     .balign 128
   13360 .L_ALT_OP_CMPL_DOUBLE: /* 0x2f */
   13361 /* File: mips/alt_stub.S */
   13362 /*
   13363  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13364  * any interesting requests and then jump to the real instruction
   13365  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13366  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13367  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13368  * bail to the real handler if breakFlags==0.
   13369  */
   13370     lbu    a3, offThread_breakFlags(rSELF)
   13371     la     rBIX, dvmAsmInstructionStart + (47 * 128)
   13372     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13373     bnez   a3, 1f
   13374     jr     rBIX            # nothing to do - jump to real handler
   13375 1:
   13376     EXPORT_PC()
   13377     move   a0, rPC         # arg0
   13378     move   a1, rFP         # arg1
   13379     move   a2, rSELF       # arg2
   13380     JAL(dvmCheckBefore)
   13381     jr     rBIX
   13382 
   13383 /* ------------------------------ */
   13384     .balign 128
   13385 .L_ALT_OP_CMPG_DOUBLE: /* 0x30 */
   13386 /* File: mips/alt_stub.S */
   13387 /*
   13388  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13389  * any interesting requests and then jump to the real instruction
   13390  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13391  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13392  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13393  * bail to the real handler if breakFlags==0.
   13394  */
   13395     lbu    a3, offThread_breakFlags(rSELF)
   13396     la     rBIX, dvmAsmInstructionStart + (48 * 128)
   13397     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13398     bnez   a3, 1f
   13399     jr     rBIX            # nothing to do - jump to real handler
   13400 1:
   13401     EXPORT_PC()
   13402     move   a0, rPC         # arg0
   13403     move   a1, rFP         # arg1
   13404     move   a2, rSELF       # arg2
   13405     JAL(dvmCheckBefore)
   13406     jr     rBIX
   13407 
   13408 /* ------------------------------ */
   13409     .balign 128
   13410 .L_ALT_OP_CMP_LONG: /* 0x31 */
   13411 /* File: mips/alt_stub.S */
   13412 /*
   13413  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13414  * any interesting requests and then jump to the real instruction
   13415  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13416  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13417  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13418  * bail to the real handler if breakFlags==0.
   13419  */
   13420     lbu    a3, offThread_breakFlags(rSELF)
   13421     la     rBIX, dvmAsmInstructionStart + (49 * 128)
   13422     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13423     bnez   a3, 1f
   13424     jr     rBIX            # nothing to do - jump to real handler
   13425 1:
   13426     EXPORT_PC()
   13427     move   a0, rPC         # arg0
   13428     move   a1, rFP         # arg1
   13429     move   a2, rSELF       # arg2
   13430     JAL(dvmCheckBefore)
   13431     jr     rBIX
   13432 
   13433 /* ------------------------------ */
   13434     .balign 128
   13435 .L_ALT_OP_IF_EQ: /* 0x32 */
   13436 /* File: mips/alt_stub.S */
   13437 /*
   13438  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13439  * any interesting requests and then jump to the real instruction
   13440  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13441  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13442  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13443  * bail to the real handler if breakFlags==0.
   13444  */
   13445     lbu    a3, offThread_breakFlags(rSELF)
   13446     la     rBIX, dvmAsmInstructionStart + (50 * 128)
   13447     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13448     bnez   a3, 1f
   13449     jr     rBIX            # nothing to do - jump to real handler
   13450 1:
   13451     EXPORT_PC()
   13452     move   a0, rPC         # arg0
   13453     move   a1, rFP         # arg1
   13454     move   a2, rSELF       # arg2
   13455     JAL(dvmCheckBefore)
   13456     jr     rBIX
   13457 
   13458 /* ------------------------------ */
   13459     .balign 128
   13460 .L_ALT_OP_IF_NE: /* 0x33 */
   13461 /* File: mips/alt_stub.S */
   13462 /*
   13463  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13464  * any interesting requests and then jump to the real instruction
   13465  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13466  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13467  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13468  * bail to the real handler if breakFlags==0.
   13469  */
   13470     lbu    a3, offThread_breakFlags(rSELF)
   13471     la     rBIX, dvmAsmInstructionStart + (51 * 128)
   13472     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13473     bnez   a3, 1f
   13474     jr     rBIX            # nothing to do - jump to real handler
   13475 1:
   13476     EXPORT_PC()
   13477     move   a0, rPC         # arg0
   13478     move   a1, rFP         # arg1
   13479     move   a2, rSELF       # arg2
   13480     JAL(dvmCheckBefore)
   13481     jr     rBIX
   13482 
   13483 /* ------------------------------ */
   13484     .balign 128
   13485 .L_ALT_OP_IF_LT: /* 0x34 */
   13486 /* File: mips/alt_stub.S */
   13487 /*
   13488  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13489  * any interesting requests and then jump to the real instruction
   13490  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13491  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13492  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13493  * bail to the real handler if breakFlags==0.
   13494  */
   13495     lbu    a3, offThread_breakFlags(rSELF)
   13496     la     rBIX, dvmAsmInstructionStart + (52 * 128)
   13497     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13498     bnez   a3, 1f
   13499     jr     rBIX            # nothing to do - jump to real handler
   13500 1:
   13501     EXPORT_PC()
   13502     move   a0, rPC         # arg0
   13503     move   a1, rFP         # arg1
   13504     move   a2, rSELF       # arg2
   13505     JAL(dvmCheckBefore)
   13506     jr     rBIX
   13507 
   13508 /* ------------------------------ */
   13509     .balign 128
   13510 .L_ALT_OP_IF_GE: /* 0x35 */
   13511 /* File: mips/alt_stub.S */
   13512 /*
   13513  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13514  * any interesting requests and then jump to the real instruction
   13515  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13516  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13517  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13518  * bail to the real handler if breakFlags==0.
   13519  */
   13520     lbu    a3, offThread_breakFlags(rSELF)
   13521     la     rBIX, dvmAsmInstructionStart + (53 * 128)
   13522     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13523     bnez   a3, 1f
   13524     jr     rBIX            # nothing to do - jump to real handler
   13525 1:
   13526     EXPORT_PC()
   13527     move   a0, rPC         # arg0
   13528     move   a1, rFP         # arg1
   13529     move   a2, rSELF       # arg2
   13530     JAL(dvmCheckBefore)
   13531     jr     rBIX
   13532 
   13533 /* ------------------------------ */
   13534     .balign 128
   13535 .L_ALT_OP_IF_GT: /* 0x36 */
   13536 /* File: mips/alt_stub.S */
   13537 /*
   13538  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13539  * any interesting requests and then jump to the real instruction
   13540  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13541  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13542  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13543  * bail to the real handler if breakFlags==0.
   13544  */
   13545     lbu    a3, offThread_breakFlags(rSELF)
   13546     la     rBIX, dvmAsmInstructionStart + (54 * 128)
   13547     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13548     bnez   a3, 1f
   13549     jr     rBIX            # nothing to do - jump to real handler
   13550 1:
   13551     EXPORT_PC()
   13552     move   a0, rPC         # arg0
   13553     move   a1, rFP         # arg1
   13554     move   a2, rSELF       # arg2
   13555     JAL(dvmCheckBefore)
   13556     jr     rBIX
   13557 
   13558 /* ------------------------------ */
   13559     .balign 128
   13560 .L_ALT_OP_IF_LE: /* 0x37 */
   13561 /* File: mips/alt_stub.S */
   13562 /*
   13563  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13564  * any interesting requests and then jump to the real instruction
   13565  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13566  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13567  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13568  * bail to the real handler if breakFlags==0.
   13569  */
   13570     lbu    a3, offThread_breakFlags(rSELF)
   13571     la     rBIX, dvmAsmInstructionStart + (55 * 128)
   13572     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13573     bnez   a3, 1f
   13574     jr     rBIX            # nothing to do - jump to real handler
   13575 1:
   13576     EXPORT_PC()
   13577     move   a0, rPC         # arg0
   13578     move   a1, rFP         # arg1
   13579     move   a2, rSELF       # arg2
   13580     JAL(dvmCheckBefore)
   13581     jr     rBIX
   13582 
   13583 /* ------------------------------ */
   13584     .balign 128
   13585 .L_ALT_OP_IF_EQZ: /* 0x38 */
   13586 /* File: mips/alt_stub.S */
   13587 /*
   13588  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13589  * any interesting requests and then jump to the real instruction
   13590  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13591  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13592  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13593  * bail to the real handler if breakFlags==0.
   13594  */
   13595     lbu    a3, offThread_breakFlags(rSELF)
   13596     la     rBIX, dvmAsmInstructionStart + (56 * 128)
   13597     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13598     bnez   a3, 1f
   13599     jr     rBIX            # nothing to do - jump to real handler
   13600 1:
   13601     EXPORT_PC()
   13602     move   a0, rPC         # arg0
   13603     move   a1, rFP         # arg1
   13604     move   a2, rSELF       # arg2
   13605     JAL(dvmCheckBefore)
   13606     jr     rBIX
   13607 
   13608 /* ------------------------------ */
   13609     .balign 128
   13610 .L_ALT_OP_IF_NEZ: /* 0x39 */
   13611 /* File: mips/alt_stub.S */
   13612 /*
   13613  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13614  * any interesting requests and then jump to the real instruction
   13615  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13616  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13617  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13618  * bail to the real handler if breakFlags==0.
   13619  */
   13620     lbu    a3, offThread_breakFlags(rSELF)
   13621     la     rBIX, dvmAsmInstructionStart + (57 * 128)
   13622     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13623     bnez   a3, 1f
   13624     jr     rBIX            # nothing to do - jump to real handler
   13625 1:
   13626     EXPORT_PC()
   13627     move   a0, rPC         # arg0
   13628     move   a1, rFP         # arg1
   13629     move   a2, rSELF       # arg2
   13630     JAL(dvmCheckBefore)
   13631     jr     rBIX
   13632 
   13633 /* ------------------------------ */
   13634     .balign 128
   13635 .L_ALT_OP_IF_LTZ: /* 0x3a */
   13636 /* File: mips/alt_stub.S */
   13637 /*
   13638  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13639  * any interesting requests and then jump to the real instruction
   13640  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13641  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13642  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13643  * bail to the real handler if breakFlags==0.
   13644  */
   13645     lbu    a3, offThread_breakFlags(rSELF)
   13646     la     rBIX, dvmAsmInstructionStart + (58 * 128)
   13647     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13648     bnez   a3, 1f
   13649     jr     rBIX            # nothing to do - jump to real handler
   13650 1:
   13651     EXPORT_PC()
   13652     move   a0, rPC         # arg0
   13653     move   a1, rFP         # arg1
   13654     move   a2, rSELF       # arg2
   13655     JAL(dvmCheckBefore)
   13656     jr     rBIX
   13657 
   13658 /* ------------------------------ */
   13659     .balign 128
   13660 .L_ALT_OP_IF_GEZ: /* 0x3b */
   13661 /* File: mips/alt_stub.S */
   13662 /*
   13663  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13664  * any interesting requests and then jump to the real instruction
   13665  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13666  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13667  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13668  * bail to the real handler if breakFlags==0.
   13669  */
   13670     lbu    a3, offThread_breakFlags(rSELF)
   13671     la     rBIX, dvmAsmInstructionStart + (59 * 128)
   13672     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13673     bnez   a3, 1f
   13674     jr     rBIX            # nothing to do - jump to real handler
   13675 1:
   13676     EXPORT_PC()
   13677     move   a0, rPC         # arg0
   13678     move   a1, rFP         # arg1
   13679     move   a2, rSELF       # arg2
   13680     JAL(dvmCheckBefore)
   13681     jr     rBIX
   13682 
   13683 /* ------------------------------ */
   13684     .balign 128
   13685 .L_ALT_OP_IF_GTZ: /* 0x3c */
   13686 /* File: mips/alt_stub.S */
   13687 /*
   13688  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13689  * any interesting requests and then jump to the real instruction
   13690  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13691  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13692  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13693  * bail to the real handler if breakFlags==0.
   13694  */
   13695     lbu    a3, offThread_breakFlags(rSELF)
   13696     la     rBIX, dvmAsmInstructionStart + (60 * 128)
   13697     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13698     bnez   a3, 1f
   13699     jr     rBIX            # nothing to do - jump to real handler
   13700 1:
   13701     EXPORT_PC()
   13702     move   a0, rPC         # arg0
   13703     move   a1, rFP         # arg1
   13704     move   a2, rSELF       # arg2
   13705     JAL(dvmCheckBefore)
   13706     jr     rBIX
   13707 
   13708 /* ------------------------------ */
   13709     .balign 128
   13710 .L_ALT_OP_IF_LEZ: /* 0x3d */
   13711 /* File: mips/alt_stub.S */
   13712 /*
   13713  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13714  * any interesting requests and then jump to the real instruction
   13715  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13716  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13717  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13718  * bail to the real handler if breakFlags==0.
   13719  */
   13720     lbu    a3, offThread_breakFlags(rSELF)
   13721     la     rBIX, dvmAsmInstructionStart + (61 * 128)
   13722     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13723     bnez   a3, 1f
   13724     jr     rBIX            # nothing to do - jump to real handler
   13725 1:
   13726     EXPORT_PC()
   13727     move   a0, rPC         # arg0
   13728     move   a1, rFP         # arg1
   13729     move   a2, rSELF       # arg2
   13730     JAL(dvmCheckBefore)
   13731     jr     rBIX
   13732 
   13733 /* ------------------------------ */
   13734     .balign 128
   13735 .L_ALT_OP_UNUSED_3E: /* 0x3e */
   13736 /* File: mips/alt_stub.S */
   13737 /*
   13738  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13739  * any interesting requests and then jump to the real instruction
   13740  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13741  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13742  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13743  * bail to the real handler if breakFlags==0.
   13744  */
   13745     lbu    a3, offThread_breakFlags(rSELF)
   13746     la     rBIX, dvmAsmInstructionStart + (62 * 128)
   13747     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13748     bnez   a3, 1f
   13749     jr     rBIX            # nothing to do - jump to real handler
   13750 1:
   13751     EXPORT_PC()
   13752     move   a0, rPC         # arg0
   13753     move   a1, rFP         # arg1
   13754     move   a2, rSELF       # arg2
   13755     JAL(dvmCheckBefore)
   13756     jr     rBIX
   13757 
   13758 /* ------------------------------ */
   13759     .balign 128
   13760 .L_ALT_OP_UNUSED_3F: /* 0x3f */
   13761 /* File: mips/alt_stub.S */
   13762 /*
   13763  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13764  * any interesting requests and then jump to the real instruction
   13765  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13766  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13767  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13768  * bail to the real handler if breakFlags==0.
   13769  */
   13770     lbu    a3, offThread_breakFlags(rSELF)
   13771     la     rBIX, dvmAsmInstructionStart + (63 * 128)
   13772     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13773     bnez   a3, 1f
   13774     jr     rBIX            # nothing to do - jump to real handler
   13775 1:
   13776     EXPORT_PC()
   13777     move   a0, rPC         # arg0
   13778     move   a1, rFP         # arg1
   13779     move   a2, rSELF       # arg2
   13780     JAL(dvmCheckBefore)
   13781     jr     rBIX
   13782 
   13783 /* ------------------------------ */
   13784     .balign 128
   13785 .L_ALT_OP_UNUSED_40: /* 0x40 */
   13786 /* File: mips/alt_stub.S */
   13787 /*
   13788  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13789  * any interesting requests and then jump to the real instruction
   13790  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13791  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13792  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13793  * bail to the real handler if breakFlags==0.
   13794  */
   13795     lbu    a3, offThread_breakFlags(rSELF)
   13796     la     rBIX, dvmAsmInstructionStart + (64 * 128)
   13797     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13798     bnez   a3, 1f
   13799     jr     rBIX            # nothing to do - jump to real handler
   13800 1:
   13801     EXPORT_PC()
   13802     move   a0, rPC         # arg0
   13803     move   a1, rFP         # arg1
   13804     move   a2, rSELF       # arg2
   13805     JAL(dvmCheckBefore)
   13806     jr     rBIX
   13807 
   13808 /* ------------------------------ */
   13809     .balign 128
   13810 .L_ALT_OP_UNUSED_41: /* 0x41 */
   13811 /* File: mips/alt_stub.S */
   13812 /*
   13813  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13814  * any interesting requests and then jump to the real instruction
   13815  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13816  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13817  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13818  * bail to the real handler if breakFlags==0.
   13819  */
   13820     lbu    a3, offThread_breakFlags(rSELF)
   13821     la     rBIX, dvmAsmInstructionStart + (65 * 128)
   13822     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13823     bnez   a3, 1f
   13824     jr     rBIX            # nothing to do - jump to real handler
   13825 1:
   13826     EXPORT_PC()
   13827     move   a0, rPC         # arg0
   13828     move   a1, rFP         # arg1
   13829     move   a2, rSELF       # arg2
   13830     JAL(dvmCheckBefore)
   13831     jr     rBIX
   13832 
   13833 /* ------------------------------ */
   13834     .balign 128
   13835 .L_ALT_OP_UNUSED_42: /* 0x42 */
   13836 /* File: mips/alt_stub.S */
   13837 /*
   13838  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13839  * any interesting requests and then jump to the real instruction
   13840  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13841  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13842  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13843  * bail to the real handler if breakFlags==0.
   13844  */
   13845     lbu    a3, offThread_breakFlags(rSELF)
   13846     la     rBIX, dvmAsmInstructionStart + (66 * 128)
   13847     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13848     bnez   a3, 1f
   13849     jr     rBIX            # nothing to do - jump to real handler
   13850 1:
   13851     EXPORT_PC()
   13852     move   a0, rPC         # arg0
   13853     move   a1, rFP         # arg1
   13854     move   a2, rSELF       # arg2
   13855     JAL(dvmCheckBefore)
   13856     jr     rBIX
   13857 
   13858 /* ------------------------------ */
   13859     .balign 128
   13860 .L_ALT_OP_UNUSED_43: /* 0x43 */
   13861 /* File: mips/alt_stub.S */
   13862 /*
   13863  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13864  * any interesting requests and then jump to the real instruction
   13865  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13866  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13867  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13868  * bail to the real handler if breakFlags==0.
   13869  */
   13870     lbu    a3, offThread_breakFlags(rSELF)
   13871     la     rBIX, dvmAsmInstructionStart + (67 * 128)
   13872     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13873     bnez   a3, 1f
   13874     jr     rBIX            # nothing to do - jump to real handler
   13875 1:
   13876     EXPORT_PC()
   13877     move   a0, rPC         # arg0
   13878     move   a1, rFP         # arg1
   13879     move   a2, rSELF       # arg2
   13880     JAL(dvmCheckBefore)
   13881     jr     rBIX
   13882 
   13883 /* ------------------------------ */
   13884     .balign 128
   13885 .L_ALT_OP_AGET: /* 0x44 */
   13886 /* File: mips/alt_stub.S */
   13887 /*
   13888  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13889  * any interesting requests and then jump to the real instruction
   13890  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13891  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13892  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13893  * bail to the real handler if breakFlags==0.
   13894  */
   13895     lbu    a3, offThread_breakFlags(rSELF)
   13896     la     rBIX, dvmAsmInstructionStart + (68 * 128)
   13897     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13898     bnez   a3, 1f
   13899     jr     rBIX            # nothing to do - jump to real handler
   13900 1:
   13901     EXPORT_PC()
   13902     move   a0, rPC         # arg0
   13903     move   a1, rFP         # arg1
   13904     move   a2, rSELF       # arg2
   13905     JAL(dvmCheckBefore)
   13906     jr     rBIX
   13907 
   13908 /* ------------------------------ */
   13909     .balign 128
   13910 .L_ALT_OP_AGET_WIDE: /* 0x45 */
   13911 /* File: mips/alt_stub.S */
   13912 /*
   13913  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13914  * any interesting requests and then jump to the real instruction
   13915  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13916  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13917  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13918  * bail to the real handler if breakFlags==0.
   13919  */
   13920     lbu    a3, offThread_breakFlags(rSELF)
   13921     la     rBIX, dvmAsmInstructionStart + (69 * 128)
   13922     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13923     bnez   a3, 1f
   13924     jr     rBIX            # nothing to do - jump to real handler
   13925 1:
   13926     EXPORT_PC()
   13927     move   a0, rPC         # arg0
   13928     move   a1, rFP         # arg1
   13929     move   a2, rSELF       # arg2
   13930     JAL(dvmCheckBefore)
   13931     jr     rBIX
   13932 
   13933 /* ------------------------------ */
   13934     .balign 128
   13935 .L_ALT_OP_AGET_OBJECT: /* 0x46 */
   13936 /* File: mips/alt_stub.S */
   13937 /*
   13938  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13939  * any interesting requests and then jump to the real instruction
   13940  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13941  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13942  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13943  * bail to the real handler if breakFlags==0.
   13944  */
   13945     lbu    a3, offThread_breakFlags(rSELF)
   13946     la     rBIX, dvmAsmInstructionStart + (70 * 128)
   13947     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13948     bnez   a3, 1f
   13949     jr     rBIX            # nothing to do - jump to real handler
   13950 1:
   13951     EXPORT_PC()
   13952     move   a0, rPC         # arg0
   13953     move   a1, rFP         # arg1
   13954     move   a2, rSELF       # arg2
   13955     JAL(dvmCheckBefore)
   13956     jr     rBIX
   13957 
   13958 /* ------------------------------ */
   13959     .balign 128
   13960 .L_ALT_OP_AGET_BOOLEAN: /* 0x47 */
   13961 /* File: mips/alt_stub.S */
   13962 /*
   13963  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13964  * any interesting requests and then jump to the real instruction
   13965  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13966  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13967  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13968  * bail to the real handler if breakFlags==0.
   13969  */
   13970     lbu    a3, offThread_breakFlags(rSELF)
   13971     la     rBIX, dvmAsmInstructionStart + (71 * 128)
   13972     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13973     bnez   a3, 1f
   13974     jr     rBIX            # nothing to do - jump to real handler
   13975 1:
   13976     EXPORT_PC()
   13977     move   a0, rPC         # arg0
   13978     move   a1, rFP         # arg1
   13979     move   a2, rSELF       # arg2
   13980     JAL(dvmCheckBefore)
   13981     jr     rBIX
   13982 
   13983 /* ------------------------------ */
   13984     .balign 128
   13985 .L_ALT_OP_AGET_BYTE: /* 0x48 */
   13986 /* File: mips/alt_stub.S */
   13987 /*
   13988  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   13989  * any interesting requests and then jump to the real instruction
   13990  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   13991  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   13992  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   13993  * bail to the real handler if breakFlags==0.
   13994  */
   13995     lbu    a3, offThread_breakFlags(rSELF)
   13996     la     rBIX, dvmAsmInstructionStart + (72 * 128)
   13997     lw     rIBASE, offThread_curHandlerTable(rSELF)
   13998     bnez   a3, 1f
   13999     jr     rBIX            # nothing to do - jump to real handler
   14000 1:
   14001     EXPORT_PC()
   14002     move   a0, rPC         # arg0
   14003     move   a1, rFP         # arg1
   14004     move   a2, rSELF       # arg2
   14005     JAL(dvmCheckBefore)
   14006     jr     rBIX
   14007 
   14008 /* ------------------------------ */
   14009     .balign 128
   14010 .L_ALT_OP_AGET_CHAR: /* 0x49 */
   14011 /* File: mips/alt_stub.S */
   14012 /*
   14013  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14014  * any interesting requests and then jump to the real instruction
   14015  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14016  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14017  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14018  * bail to the real handler if breakFlags==0.
   14019  */
   14020     lbu    a3, offThread_breakFlags(rSELF)
   14021     la     rBIX, dvmAsmInstructionStart + (73 * 128)
   14022     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14023     bnez   a3, 1f
   14024     jr     rBIX            # nothing to do - jump to real handler
   14025 1:
   14026     EXPORT_PC()
   14027     move   a0, rPC         # arg0
   14028     move   a1, rFP         # arg1
   14029     move   a2, rSELF       # arg2
   14030     JAL(dvmCheckBefore)
   14031     jr     rBIX
   14032 
   14033 /* ------------------------------ */
   14034     .balign 128
   14035 .L_ALT_OP_AGET_SHORT: /* 0x4a */
   14036 /* File: mips/alt_stub.S */
   14037 /*
   14038  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14039  * any interesting requests and then jump to the real instruction
   14040  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14041  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14042  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14043  * bail to the real handler if breakFlags==0.
   14044  */
   14045     lbu    a3, offThread_breakFlags(rSELF)
   14046     la     rBIX, dvmAsmInstructionStart + (74 * 128)
   14047     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14048     bnez   a3, 1f
   14049     jr     rBIX            # nothing to do - jump to real handler
   14050 1:
   14051     EXPORT_PC()
   14052     move   a0, rPC         # arg0
   14053     move   a1, rFP         # arg1
   14054     move   a2, rSELF       # arg2
   14055     JAL(dvmCheckBefore)
   14056     jr     rBIX
   14057 
   14058 /* ------------------------------ */
   14059     .balign 128
   14060 .L_ALT_OP_APUT: /* 0x4b */
   14061 /* File: mips/alt_stub.S */
   14062 /*
   14063  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14064  * any interesting requests and then jump to the real instruction
   14065  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14066  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14067  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14068  * bail to the real handler if breakFlags==0.
   14069  */
   14070     lbu    a3, offThread_breakFlags(rSELF)
   14071     la     rBIX, dvmAsmInstructionStart + (75 * 128)
   14072     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14073     bnez   a3, 1f
   14074     jr     rBIX            # nothing to do - jump to real handler
   14075 1:
   14076     EXPORT_PC()
   14077     move   a0, rPC         # arg0
   14078     move   a1, rFP         # arg1
   14079     move   a2, rSELF       # arg2
   14080     JAL(dvmCheckBefore)
   14081     jr     rBIX
   14082 
   14083 /* ------------------------------ */
   14084     .balign 128
   14085 .L_ALT_OP_APUT_WIDE: /* 0x4c */
   14086 /* File: mips/alt_stub.S */
   14087 /*
   14088  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14089  * any interesting requests and then jump to the real instruction
   14090  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14091  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14092  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14093  * bail to the real handler if breakFlags==0.
   14094  */
   14095     lbu    a3, offThread_breakFlags(rSELF)
   14096     la     rBIX, dvmAsmInstructionStart + (76 * 128)
   14097     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14098     bnez   a3, 1f
   14099     jr     rBIX            # nothing to do - jump to real handler
   14100 1:
   14101     EXPORT_PC()
   14102     move   a0, rPC         # arg0
   14103     move   a1, rFP         # arg1
   14104     move   a2, rSELF       # arg2
   14105     JAL(dvmCheckBefore)
   14106     jr     rBIX
   14107 
   14108 /* ------------------------------ */
   14109     .balign 128
   14110 .L_ALT_OP_APUT_OBJECT: /* 0x4d */
   14111 /* File: mips/alt_stub.S */
   14112 /*
   14113  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14114  * any interesting requests and then jump to the real instruction
   14115  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14116  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14117  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14118  * bail to the real handler if breakFlags==0.
   14119  */
   14120     lbu    a3, offThread_breakFlags(rSELF)
   14121     la     rBIX, dvmAsmInstructionStart + (77 * 128)
   14122     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14123     bnez   a3, 1f
   14124     jr     rBIX            # nothing to do - jump to real handler
   14125 1:
   14126     EXPORT_PC()
   14127     move   a0, rPC         # arg0
   14128     move   a1, rFP         # arg1
   14129     move   a2, rSELF       # arg2
   14130     JAL(dvmCheckBefore)
   14131     jr     rBIX
   14132 
   14133 /* ------------------------------ */
   14134     .balign 128
   14135 .L_ALT_OP_APUT_BOOLEAN: /* 0x4e */
   14136 /* File: mips/alt_stub.S */
   14137 /*
   14138  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14139  * any interesting requests and then jump to the real instruction
   14140  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14141  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14142  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14143  * bail to the real handler if breakFlags==0.
   14144  */
   14145     lbu    a3, offThread_breakFlags(rSELF)
   14146     la     rBIX, dvmAsmInstructionStart + (78 * 128)
   14147     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14148     bnez   a3, 1f
   14149     jr     rBIX            # nothing to do - jump to real handler
   14150 1:
   14151     EXPORT_PC()
   14152     move   a0, rPC         # arg0
   14153     move   a1, rFP         # arg1
   14154     move   a2, rSELF       # arg2
   14155     JAL(dvmCheckBefore)
   14156     jr     rBIX
   14157 
   14158 /* ------------------------------ */
   14159     .balign 128
   14160 .L_ALT_OP_APUT_BYTE: /* 0x4f */
   14161 /* File: mips/alt_stub.S */
   14162 /*
   14163  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14164  * any interesting requests and then jump to the real instruction
   14165  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14166  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14167  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14168  * bail to the real handler if breakFlags==0.
   14169  */
   14170     lbu    a3, offThread_breakFlags(rSELF)
   14171     la     rBIX, dvmAsmInstructionStart + (79 * 128)
   14172     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14173     bnez   a3, 1f
   14174     jr     rBIX            # nothing to do - jump to real handler
   14175 1:
   14176     EXPORT_PC()
   14177     move   a0, rPC         # arg0
   14178     move   a1, rFP         # arg1
   14179     move   a2, rSELF       # arg2
   14180     JAL(dvmCheckBefore)
   14181     jr     rBIX
   14182 
   14183 /* ------------------------------ */
   14184     .balign 128
   14185 .L_ALT_OP_APUT_CHAR: /* 0x50 */
   14186 /* File: mips/alt_stub.S */
   14187 /*
   14188  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14189  * any interesting requests and then jump to the real instruction
   14190  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14191  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14192  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14193  * bail to the real handler if breakFlags==0.
   14194  */
   14195     lbu    a3, offThread_breakFlags(rSELF)
   14196     la     rBIX, dvmAsmInstructionStart + (80 * 128)
   14197     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14198     bnez   a3, 1f
   14199     jr     rBIX            # nothing to do - jump to real handler
   14200 1:
   14201     EXPORT_PC()
   14202     move   a0, rPC         # arg0
   14203     move   a1, rFP         # arg1
   14204     move   a2, rSELF       # arg2
   14205     JAL(dvmCheckBefore)
   14206     jr     rBIX
   14207 
   14208 /* ------------------------------ */
   14209     .balign 128
   14210 .L_ALT_OP_APUT_SHORT: /* 0x51 */
   14211 /* File: mips/alt_stub.S */
   14212 /*
   14213  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14214  * any interesting requests and then jump to the real instruction
   14215  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14216  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14217  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14218  * bail to the real handler if breakFlags==0.
   14219  */
   14220     lbu    a3, offThread_breakFlags(rSELF)
   14221     la     rBIX, dvmAsmInstructionStart + (81 * 128)
   14222     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14223     bnez   a3, 1f
   14224     jr     rBIX            # nothing to do - jump to real handler
   14225 1:
   14226     EXPORT_PC()
   14227     move   a0, rPC         # arg0
   14228     move   a1, rFP         # arg1
   14229     move   a2, rSELF       # arg2
   14230     JAL(dvmCheckBefore)
   14231     jr     rBIX
   14232 
   14233 /* ------------------------------ */
   14234     .balign 128
   14235 .L_ALT_OP_IGET: /* 0x52 */
   14236 /* File: mips/alt_stub.S */
   14237 /*
   14238  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14239  * any interesting requests and then jump to the real instruction
   14240  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14241  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14242  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14243  * bail to the real handler if breakFlags==0.
   14244  */
   14245     lbu    a3, offThread_breakFlags(rSELF)
   14246     la     rBIX, dvmAsmInstructionStart + (82 * 128)
   14247     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14248     bnez   a3, 1f
   14249     jr     rBIX            # nothing to do - jump to real handler
   14250 1:
   14251     EXPORT_PC()
   14252     move   a0, rPC         # arg0
   14253     move   a1, rFP         # arg1
   14254     move   a2, rSELF       # arg2
   14255     JAL(dvmCheckBefore)
   14256     jr     rBIX
   14257 
   14258 /* ------------------------------ */
   14259     .balign 128
   14260 .L_ALT_OP_IGET_WIDE: /* 0x53 */
   14261 /* File: mips/alt_stub.S */
   14262 /*
   14263  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14264  * any interesting requests and then jump to the real instruction
   14265  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14266  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14267  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14268  * bail to the real handler if breakFlags==0.
   14269  */
   14270     lbu    a3, offThread_breakFlags(rSELF)
   14271     la     rBIX, dvmAsmInstructionStart + (83 * 128)
   14272     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14273     bnez   a3, 1f
   14274     jr     rBIX            # nothing to do - jump to real handler
   14275 1:
   14276     EXPORT_PC()
   14277     move   a0, rPC         # arg0
   14278     move   a1, rFP         # arg1
   14279     move   a2, rSELF       # arg2
   14280     JAL(dvmCheckBefore)
   14281     jr     rBIX
   14282 
   14283 /* ------------------------------ */
   14284     .balign 128
   14285 .L_ALT_OP_IGET_OBJECT: /* 0x54 */
   14286 /* File: mips/alt_stub.S */
   14287 /*
   14288  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14289  * any interesting requests and then jump to the real instruction
   14290  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14291  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14292  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14293  * bail to the real handler if breakFlags==0.
   14294  */
   14295     lbu    a3, offThread_breakFlags(rSELF)
   14296     la     rBIX, dvmAsmInstructionStart + (84 * 128)
   14297     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14298     bnez   a3, 1f
   14299     jr     rBIX            # nothing to do - jump to real handler
   14300 1:
   14301     EXPORT_PC()
   14302     move   a0, rPC         # arg0
   14303     move   a1, rFP         # arg1
   14304     move   a2, rSELF       # arg2
   14305     JAL(dvmCheckBefore)
   14306     jr     rBIX
   14307 
   14308 /* ------------------------------ */
   14309     .balign 128
   14310 .L_ALT_OP_IGET_BOOLEAN: /* 0x55 */
   14311 /* File: mips/alt_stub.S */
   14312 /*
   14313  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14314  * any interesting requests and then jump to the real instruction
   14315  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14316  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14317  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14318  * bail to the real handler if breakFlags==0.
   14319  */
   14320     lbu    a3, offThread_breakFlags(rSELF)
   14321     la     rBIX, dvmAsmInstructionStart + (85 * 128)
   14322     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14323     bnez   a3, 1f
   14324     jr     rBIX            # nothing to do - jump to real handler
   14325 1:
   14326     EXPORT_PC()
   14327     move   a0, rPC         # arg0
   14328     move   a1, rFP         # arg1
   14329     move   a2, rSELF       # arg2
   14330     JAL(dvmCheckBefore)
   14331     jr     rBIX
   14332 
   14333 /* ------------------------------ */
   14334     .balign 128
   14335 .L_ALT_OP_IGET_BYTE: /* 0x56 */
   14336 /* File: mips/alt_stub.S */
   14337 /*
   14338  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14339  * any interesting requests and then jump to the real instruction
   14340  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14341  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14342  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14343  * bail to the real handler if breakFlags==0.
   14344  */
   14345     lbu    a3, offThread_breakFlags(rSELF)
   14346     la     rBIX, dvmAsmInstructionStart + (86 * 128)
   14347     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14348     bnez   a3, 1f
   14349     jr     rBIX            # nothing to do - jump to real handler
   14350 1:
   14351     EXPORT_PC()
   14352     move   a0, rPC         # arg0
   14353     move   a1, rFP         # arg1
   14354     move   a2, rSELF       # arg2
   14355     JAL(dvmCheckBefore)
   14356     jr     rBIX
   14357 
   14358 /* ------------------------------ */
   14359     .balign 128
   14360 .L_ALT_OP_IGET_CHAR: /* 0x57 */
   14361 /* File: mips/alt_stub.S */
   14362 /*
   14363  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14364  * any interesting requests and then jump to the real instruction
   14365  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14366  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14367  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14368  * bail to the real handler if breakFlags==0.
   14369  */
   14370     lbu    a3, offThread_breakFlags(rSELF)
   14371     la     rBIX, dvmAsmInstructionStart + (87 * 128)
   14372     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14373     bnez   a3, 1f
   14374     jr     rBIX            # nothing to do - jump to real handler
   14375 1:
   14376     EXPORT_PC()
   14377     move   a0, rPC         # arg0
   14378     move   a1, rFP         # arg1
   14379     move   a2, rSELF       # arg2
   14380     JAL(dvmCheckBefore)
   14381     jr     rBIX
   14382 
   14383 /* ------------------------------ */
   14384     .balign 128
   14385 .L_ALT_OP_IGET_SHORT: /* 0x58 */
   14386 /* File: mips/alt_stub.S */
   14387 /*
   14388  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14389  * any interesting requests and then jump to the real instruction
   14390  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14391  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14392  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14393  * bail to the real handler if breakFlags==0.
   14394  */
   14395     lbu    a3, offThread_breakFlags(rSELF)
   14396     la     rBIX, dvmAsmInstructionStart + (88 * 128)
   14397     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14398     bnez   a3, 1f
   14399     jr     rBIX            # nothing to do - jump to real handler
   14400 1:
   14401     EXPORT_PC()
   14402     move   a0, rPC         # arg0
   14403     move   a1, rFP         # arg1
   14404     move   a2, rSELF       # arg2
   14405     JAL(dvmCheckBefore)
   14406     jr     rBIX
   14407 
   14408 /* ------------------------------ */
   14409     .balign 128
   14410 .L_ALT_OP_IPUT: /* 0x59 */
   14411 /* File: mips/alt_stub.S */
   14412 /*
   14413  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14414  * any interesting requests and then jump to the real instruction
   14415  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14416  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14417  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14418  * bail to the real handler if breakFlags==0.
   14419  */
   14420     lbu    a3, offThread_breakFlags(rSELF)
   14421     la     rBIX, dvmAsmInstructionStart + (89 * 128)
   14422     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14423     bnez   a3, 1f
   14424     jr     rBIX            # nothing to do - jump to real handler
   14425 1:
   14426     EXPORT_PC()
   14427     move   a0, rPC         # arg0
   14428     move   a1, rFP         # arg1
   14429     move   a2, rSELF       # arg2
   14430     JAL(dvmCheckBefore)
   14431     jr     rBIX
   14432 
   14433 /* ------------------------------ */
   14434     .balign 128
   14435 .L_ALT_OP_IPUT_WIDE: /* 0x5a */
   14436 /* File: mips/alt_stub.S */
   14437 /*
   14438  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14439  * any interesting requests and then jump to the real instruction
   14440  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14441  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14442  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14443  * bail to the real handler if breakFlags==0.
   14444  */
   14445     lbu    a3, offThread_breakFlags(rSELF)
   14446     la     rBIX, dvmAsmInstructionStart + (90 * 128)
   14447     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14448     bnez   a3, 1f
   14449     jr     rBIX            # nothing to do - jump to real handler
   14450 1:
   14451     EXPORT_PC()
   14452     move   a0, rPC         # arg0
   14453     move   a1, rFP         # arg1
   14454     move   a2, rSELF       # arg2
   14455     JAL(dvmCheckBefore)
   14456     jr     rBIX
   14457 
   14458 /* ------------------------------ */
   14459     .balign 128
   14460 .L_ALT_OP_IPUT_OBJECT: /* 0x5b */
   14461 /* File: mips/alt_stub.S */
   14462 /*
   14463  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14464  * any interesting requests and then jump to the real instruction
   14465  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14466  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14467  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14468  * bail to the real handler if breakFlags==0.
   14469  */
   14470     lbu    a3, offThread_breakFlags(rSELF)
   14471     la     rBIX, dvmAsmInstructionStart + (91 * 128)
   14472     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14473     bnez   a3, 1f
   14474     jr     rBIX            # nothing to do - jump to real handler
   14475 1:
   14476     EXPORT_PC()
   14477     move   a0, rPC         # arg0
   14478     move   a1, rFP         # arg1
   14479     move   a2, rSELF       # arg2
   14480     JAL(dvmCheckBefore)
   14481     jr     rBIX
   14482 
   14483 /* ------------------------------ */
   14484     .balign 128
   14485 .L_ALT_OP_IPUT_BOOLEAN: /* 0x5c */
   14486 /* File: mips/alt_stub.S */
   14487 /*
   14488  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14489  * any interesting requests and then jump to the real instruction
   14490  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14491  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14492  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14493  * bail to the real handler if breakFlags==0.
   14494  */
   14495     lbu    a3, offThread_breakFlags(rSELF)
   14496     la     rBIX, dvmAsmInstructionStart + (92 * 128)
   14497     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14498     bnez   a3, 1f
   14499     jr     rBIX            # nothing to do - jump to real handler
   14500 1:
   14501     EXPORT_PC()
   14502     move   a0, rPC         # arg0
   14503     move   a1, rFP         # arg1
   14504     move   a2, rSELF       # arg2
   14505     JAL(dvmCheckBefore)
   14506     jr     rBIX
   14507 
   14508 /* ------------------------------ */
   14509     .balign 128
   14510 .L_ALT_OP_IPUT_BYTE: /* 0x5d */
   14511 /* File: mips/alt_stub.S */
   14512 /*
   14513  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14514  * any interesting requests and then jump to the real instruction
   14515  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14516  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14517  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14518  * bail to the real handler if breakFlags==0.
   14519  */
   14520     lbu    a3, offThread_breakFlags(rSELF)
   14521     la     rBIX, dvmAsmInstructionStart + (93 * 128)
   14522     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14523     bnez   a3, 1f
   14524     jr     rBIX            # nothing to do - jump to real handler
   14525 1:
   14526     EXPORT_PC()
   14527     move   a0, rPC         # arg0
   14528     move   a1, rFP         # arg1
   14529     move   a2, rSELF       # arg2
   14530     JAL(dvmCheckBefore)
   14531     jr     rBIX
   14532 
   14533 /* ------------------------------ */
   14534     .balign 128
   14535 .L_ALT_OP_IPUT_CHAR: /* 0x5e */
   14536 /* File: mips/alt_stub.S */
   14537 /*
   14538  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14539  * any interesting requests and then jump to the real instruction
   14540  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14541  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14542  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14543  * bail to the real handler if breakFlags==0.
   14544  */
   14545     lbu    a3, offThread_breakFlags(rSELF)
   14546     la     rBIX, dvmAsmInstructionStart + (94 * 128)
   14547     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14548     bnez   a3, 1f
   14549     jr     rBIX            # nothing to do - jump to real handler
   14550 1:
   14551     EXPORT_PC()
   14552     move   a0, rPC         # arg0
   14553     move   a1, rFP         # arg1
   14554     move   a2, rSELF       # arg2
   14555     JAL(dvmCheckBefore)
   14556     jr     rBIX
   14557 
   14558 /* ------------------------------ */
   14559     .balign 128
   14560 .L_ALT_OP_IPUT_SHORT: /* 0x5f */
   14561 /* File: mips/alt_stub.S */
   14562 /*
   14563  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14564  * any interesting requests and then jump to the real instruction
   14565  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14566  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14567  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14568  * bail to the real handler if breakFlags==0.
   14569  */
   14570     lbu    a3, offThread_breakFlags(rSELF)
   14571     la     rBIX, dvmAsmInstructionStart + (95 * 128)
   14572     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14573     bnez   a3, 1f
   14574     jr     rBIX            # nothing to do - jump to real handler
   14575 1:
   14576     EXPORT_PC()
   14577     move   a0, rPC         # arg0
   14578     move   a1, rFP         # arg1
   14579     move   a2, rSELF       # arg2
   14580     JAL(dvmCheckBefore)
   14581     jr     rBIX
   14582 
   14583 /* ------------------------------ */
   14584     .balign 128
   14585 .L_ALT_OP_SGET: /* 0x60 */
   14586 /* File: mips/alt_stub.S */
   14587 /*
   14588  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14589  * any interesting requests and then jump to the real instruction
   14590  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14591  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14592  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14593  * bail to the real handler if breakFlags==0.
   14594  */
   14595     lbu    a3, offThread_breakFlags(rSELF)
   14596     la     rBIX, dvmAsmInstructionStart + (96 * 128)
   14597     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14598     bnez   a3, 1f
   14599     jr     rBIX            # nothing to do - jump to real handler
   14600 1:
   14601     EXPORT_PC()
   14602     move   a0, rPC         # arg0
   14603     move   a1, rFP         # arg1
   14604     move   a2, rSELF       # arg2
   14605     JAL(dvmCheckBefore)
   14606     jr     rBIX
   14607 
   14608 /* ------------------------------ */
   14609     .balign 128
   14610 .L_ALT_OP_SGET_WIDE: /* 0x61 */
   14611 /* File: mips/alt_stub.S */
   14612 /*
   14613  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14614  * any interesting requests and then jump to the real instruction
   14615  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14616  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14617  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14618  * bail to the real handler if breakFlags==0.
   14619  */
   14620     lbu    a3, offThread_breakFlags(rSELF)
   14621     la     rBIX, dvmAsmInstructionStart + (97 * 128)
   14622     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14623     bnez   a3, 1f
   14624     jr     rBIX            # nothing to do - jump to real handler
   14625 1:
   14626     EXPORT_PC()
   14627     move   a0, rPC         # arg0
   14628     move   a1, rFP         # arg1
   14629     move   a2, rSELF       # arg2
   14630     JAL(dvmCheckBefore)
   14631     jr     rBIX
   14632 
   14633 /* ------------------------------ */
   14634     .balign 128
   14635 .L_ALT_OP_SGET_OBJECT: /* 0x62 */
   14636 /* File: mips/alt_stub.S */
   14637 /*
   14638  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14639  * any interesting requests and then jump to the real instruction
   14640  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14641  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14642  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14643  * bail to the real handler if breakFlags==0.
   14644  */
   14645     lbu    a3, offThread_breakFlags(rSELF)
   14646     la     rBIX, dvmAsmInstructionStart + (98 * 128)
   14647     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14648     bnez   a3, 1f
   14649     jr     rBIX            # nothing to do - jump to real handler
   14650 1:
   14651     EXPORT_PC()
   14652     move   a0, rPC         # arg0
   14653     move   a1, rFP         # arg1
   14654     move   a2, rSELF       # arg2
   14655     JAL(dvmCheckBefore)
   14656     jr     rBIX
   14657 
   14658 /* ------------------------------ */
   14659     .balign 128
   14660 .L_ALT_OP_SGET_BOOLEAN: /* 0x63 */
   14661 /* File: mips/alt_stub.S */
   14662 /*
   14663  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14664  * any interesting requests and then jump to the real instruction
   14665  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14666  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14667  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14668  * bail to the real handler if breakFlags==0.
   14669  */
   14670     lbu    a3, offThread_breakFlags(rSELF)
   14671     la     rBIX, dvmAsmInstructionStart + (99 * 128)
   14672     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14673     bnez   a3, 1f
   14674     jr     rBIX            # nothing to do - jump to real handler
   14675 1:
   14676     EXPORT_PC()
   14677     move   a0, rPC         # arg0
   14678     move   a1, rFP         # arg1
   14679     move   a2, rSELF       # arg2
   14680     JAL(dvmCheckBefore)
   14681     jr     rBIX
   14682 
   14683 /* ------------------------------ */
   14684     .balign 128
   14685 .L_ALT_OP_SGET_BYTE: /* 0x64 */
   14686 /* File: mips/alt_stub.S */
   14687 /*
   14688  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14689  * any interesting requests and then jump to the real instruction
   14690  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14691  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14692  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14693  * bail to the real handler if breakFlags==0.
   14694  */
   14695     lbu    a3, offThread_breakFlags(rSELF)
   14696     la     rBIX, dvmAsmInstructionStart + (100 * 128)
   14697     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14698     bnez   a3, 1f
   14699     jr     rBIX            # nothing to do - jump to real handler
   14700 1:
   14701     EXPORT_PC()
   14702     move   a0, rPC         # arg0
   14703     move   a1, rFP         # arg1
   14704     move   a2, rSELF       # arg2
   14705     JAL(dvmCheckBefore)
   14706     jr     rBIX
   14707 
   14708 /* ------------------------------ */
   14709     .balign 128
   14710 .L_ALT_OP_SGET_CHAR: /* 0x65 */
   14711 /* File: mips/alt_stub.S */
   14712 /*
   14713  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14714  * any interesting requests and then jump to the real instruction
   14715  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14716  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14717  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14718  * bail to the real handler if breakFlags==0.
   14719  */
   14720     lbu    a3, offThread_breakFlags(rSELF)
   14721     la     rBIX, dvmAsmInstructionStart + (101 * 128)
   14722     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14723     bnez   a3, 1f
   14724     jr     rBIX            # nothing to do - jump to real handler
   14725 1:
   14726     EXPORT_PC()
   14727     move   a0, rPC         # arg0
   14728     move   a1, rFP         # arg1
   14729     move   a2, rSELF       # arg2
   14730     JAL(dvmCheckBefore)
   14731     jr     rBIX
   14732 
   14733 /* ------------------------------ */
   14734     .balign 128
   14735 .L_ALT_OP_SGET_SHORT: /* 0x66 */
   14736 /* File: mips/alt_stub.S */
   14737 /*
   14738  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14739  * any interesting requests and then jump to the real instruction
   14740  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14741  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14742  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14743  * bail to the real handler if breakFlags==0.
   14744  */
   14745     lbu    a3, offThread_breakFlags(rSELF)
   14746     la     rBIX, dvmAsmInstructionStart + (102 * 128)
   14747     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14748     bnez   a3, 1f
   14749     jr     rBIX            # nothing to do - jump to real handler
   14750 1:
   14751     EXPORT_PC()
   14752     move   a0, rPC         # arg0
   14753     move   a1, rFP         # arg1
   14754     move   a2, rSELF       # arg2
   14755     JAL(dvmCheckBefore)
   14756     jr     rBIX
   14757 
   14758 /* ------------------------------ */
   14759     .balign 128
   14760 .L_ALT_OP_SPUT: /* 0x67 */
   14761 /* File: mips/alt_stub.S */
   14762 /*
   14763  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14764  * any interesting requests and then jump to the real instruction
   14765  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14766  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14767  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14768  * bail to the real handler if breakFlags==0.
   14769  */
   14770     lbu    a3, offThread_breakFlags(rSELF)
   14771     la     rBIX, dvmAsmInstructionStart + (103 * 128)
   14772     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14773     bnez   a3, 1f
   14774     jr     rBIX            # nothing to do - jump to real handler
   14775 1:
   14776     EXPORT_PC()
   14777     move   a0, rPC         # arg0
   14778     move   a1, rFP         # arg1
   14779     move   a2, rSELF       # arg2
   14780     JAL(dvmCheckBefore)
   14781     jr     rBIX
   14782 
   14783 /* ------------------------------ */
   14784     .balign 128
   14785 .L_ALT_OP_SPUT_WIDE: /* 0x68 */
   14786 /* File: mips/alt_stub.S */
   14787 /*
   14788  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14789  * any interesting requests and then jump to the real instruction
   14790  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14791  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14792  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14793  * bail to the real handler if breakFlags==0.
   14794  */
   14795     lbu    a3, offThread_breakFlags(rSELF)
   14796     la     rBIX, dvmAsmInstructionStart + (104 * 128)
   14797     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14798     bnez   a3, 1f
   14799     jr     rBIX            # nothing to do - jump to real handler
   14800 1:
   14801     EXPORT_PC()
   14802     move   a0, rPC         # arg0
   14803     move   a1, rFP         # arg1
   14804     move   a2, rSELF       # arg2
   14805     JAL(dvmCheckBefore)
   14806     jr     rBIX
   14807 
   14808 /* ------------------------------ */
   14809     .balign 128
   14810 .L_ALT_OP_SPUT_OBJECT: /* 0x69 */
   14811 /* File: mips/alt_stub.S */
   14812 /*
   14813  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14814  * any interesting requests and then jump to the real instruction
   14815  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14816  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14817  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14818  * bail to the real handler if breakFlags==0.
   14819  */
   14820     lbu    a3, offThread_breakFlags(rSELF)
   14821     la     rBIX, dvmAsmInstructionStart + (105 * 128)
   14822     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14823     bnez   a3, 1f
   14824     jr     rBIX            # nothing to do - jump to real handler
   14825 1:
   14826     EXPORT_PC()
   14827     move   a0, rPC         # arg0
   14828     move   a1, rFP         # arg1
   14829     move   a2, rSELF       # arg2
   14830     JAL(dvmCheckBefore)
   14831     jr     rBIX
   14832 
   14833 /* ------------------------------ */
   14834     .balign 128
   14835 .L_ALT_OP_SPUT_BOOLEAN: /* 0x6a */
   14836 /* File: mips/alt_stub.S */
   14837 /*
   14838  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14839  * any interesting requests and then jump to the real instruction
   14840  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14841  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14842  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14843  * bail to the real handler if breakFlags==0.
   14844  */
   14845     lbu    a3, offThread_breakFlags(rSELF)
   14846     la     rBIX, dvmAsmInstructionStart + (106 * 128)
   14847     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14848     bnez   a3, 1f
   14849     jr     rBIX            # nothing to do - jump to real handler
   14850 1:
   14851     EXPORT_PC()
   14852     move   a0, rPC         # arg0
   14853     move   a1, rFP         # arg1
   14854     move   a2, rSELF       # arg2
   14855     JAL(dvmCheckBefore)
   14856     jr     rBIX
   14857 
   14858 /* ------------------------------ */
   14859     .balign 128
   14860 .L_ALT_OP_SPUT_BYTE: /* 0x6b */
   14861 /* File: mips/alt_stub.S */
   14862 /*
   14863  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14864  * any interesting requests and then jump to the real instruction
   14865  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14866  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14867  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14868  * bail to the real handler if breakFlags==0.
   14869  */
   14870     lbu    a3, offThread_breakFlags(rSELF)
   14871     la     rBIX, dvmAsmInstructionStart + (107 * 128)
   14872     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14873     bnez   a3, 1f
   14874     jr     rBIX            # nothing to do - jump to real handler
   14875 1:
   14876     EXPORT_PC()
   14877     move   a0, rPC         # arg0
   14878     move   a1, rFP         # arg1
   14879     move   a2, rSELF       # arg2
   14880     JAL(dvmCheckBefore)
   14881     jr     rBIX
   14882 
   14883 /* ------------------------------ */
   14884     .balign 128
   14885 .L_ALT_OP_SPUT_CHAR: /* 0x6c */
   14886 /* File: mips/alt_stub.S */
   14887 /*
   14888  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14889  * any interesting requests and then jump to the real instruction
   14890  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14891  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14892  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14893  * bail to the real handler if breakFlags==0.
   14894  */
   14895     lbu    a3, offThread_breakFlags(rSELF)
   14896     la     rBIX, dvmAsmInstructionStart + (108 * 128)
   14897     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14898     bnez   a3, 1f
   14899     jr     rBIX            # nothing to do - jump to real handler
   14900 1:
   14901     EXPORT_PC()
   14902     move   a0, rPC         # arg0
   14903     move   a1, rFP         # arg1
   14904     move   a2, rSELF       # arg2
   14905     JAL(dvmCheckBefore)
   14906     jr     rBIX
   14907 
   14908 /* ------------------------------ */
   14909     .balign 128
   14910 .L_ALT_OP_SPUT_SHORT: /* 0x6d */
   14911 /* File: mips/alt_stub.S */
   14912 /*
   14913  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14914  * any interesting requests and then jump to the real instruction
   14915  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14916  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14917  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14918  * bail to the real handler if breakFlags==0.
   14919  */
   14920     lbu    a3, offThread_breakFlags(rSELF)
   14921     la     rBIX, dvmAsmInstructionStart + (109 * 128)
   14922     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14923     bnez   a3, 1f
   14924     jr     rBIX            # nothing to do - jump to real handler
   14925 1:
   14926     EXPORT_PC()
   14927     move   a0, rPC         # arg0
   14928     move   a1, rFP         # arg1
   14929     move   a2, rSELF       # arg2
   14930     JAL(dvmCheckBefore)
   14931     jr     rBIX
   14932 
   14933 /* ------------------------------ */
   14934     .balign 128
   14935 .L_ALT_OP_INVOKE_VIRTUAL: /* 0x6e */
   14936 /* File: mips/alt_stub.S */
   14937 /*
   14938  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14939  * any interesting requests and then jump to the real instruction
   14940  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14941  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14942  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14943  * bail to the real handler if breakFlags==0.
   14944  */
   14945     lbu    a3, offThread_breakFlags(rSELF)
   14946     la     rBIX, dvmAsmInstructionStart + (110 * 128)
   14947     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14948     bnez   a3, 1f
   14949     jr     rBIX            # nothing to do - jump to real handler
   14950 1:
   14951     EXPORT_PC()
   14952     move   a0, rPC         # arg0
   14953     move   a1, rFP         # arg1
   14954     move   a2, rSELF       # arg2
   14955     JAL(dvmCheckBefore)
   14956     jr     rBIX
   14957 
   14958 /* ------------------------------ */
   14959     .balign 128
   14960 .L_ALT_OP_INVOKE_SUPER: /* 0x6f */
   14961 /* File: mips/alt_stub.S */
   14962 /*
   14963  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14964  * any interesting requests and then jump to the real instruction
   14965  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14966  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14967  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14968  * bail to the real handler if breakFlags==0.
   14969  */
   14970     lbu    a3, offThread_breakFlags(rSELF)
   14971     la     rBIX, dvmAsmInstructionStart + (111 * 128)
   14972     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14973     bnez   a3, 1f
   14974     jr     rBIX            # nothing to do - jump to real handler
   14975 1:
   14976     EXPORT_PC()
   14977     move   a0, rPC         # arg0
   14978     move   a1, rFP         # arg1
   14979     move   a2, rSELF       # arg2
   14980     JAL(dvmCheckBefore)
   14981     jr     rBIX
   14982 
   14983 /* ------------------------------ */
   14984     .balign 128
   14985 .L_ALT_OP_INVOKE_DIRECT: /* 0x70 */
   14986 /* File: mips/alt_stub.S */
   14987 /*
   14988  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   14989  * any interesting requests and then jump to the real instruction
   14990  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   14991  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   14992  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   14993  * bail to the real handler if breakFlags==0.
   14994  */
   14995     lbu    a3, offThread_breakFlags(rSELF)
   14996     la     rBIX, dvmAsmInstructionStart + (112 * 128)
   14997     lw     rIBASE, offThread_curHandlerTable(rSELF)
   14998     bnez   a3, 1f
   14999     jr     rBIX            # nothing to do - jump to real handler
   15000 1:
   15001     EXPORT_PC()
   15002     move   a0, rPC         # arg0
   15003     move   a1, rFP         # arg1
   15004     move   a2, rSELF       # arg2
   15005     JAL(dvmCheckBefore)
   15006     jr     rBIX
   15007 
   15008 /* ------------------------------ */
   15009     .balign 128
   15010 .L_ALT_OP_INVOKE_STATIC: /* 0x71 */
   15011 /* File: mips/alt_stub.S */
   15012 /*
   15013  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15014  * any interesting requests and then jump to the real instruction
   15015  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15016  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15017  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15018  * bail to the real handler if breakFlags==0.
   15019  */
   15020     lbu    a3, offThread_breakFlags(rSELF)
   15021     la     rBIX, dvmAsmInstructionStart + (113 * 128)
   15022     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15023     bnez   a3, 1f
   15024     jr     rBIX            # nothing to do - jump to real handler
   15025 1:
   15026     EXPORT_PC()
   15027     move   a0, rPC         # arg0
   15028     move   a1, rFP         # arg1
   15029     move   a2, rSELF       # arg2
   15030     JAL(dvmCheckBefore)
   15031     jr     rBIX
   15032 
   15033 /* ------------------------------ */
   15034     .balign 128
   15035 .L_ALT_OP_INVOKE_INTERFACE: /* 0x72 */
   15036 /* File: mips/alt_stub.S */
   15037 /*
   15038  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15039  * any interesting requests and then jump to the real instruction
   15040  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15041  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15042  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15043  * bail to the real handler if breakFlags==0.
   15044  */
   15045     lbu    a3, offThread_breakFlags(rSELF)
   15046     la     rBIX, dvmAsmInstructionStart + (114 * 128)
   15047     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15048     bnez   a3, 1f
   15049     jr     rBIX            # nothing to do - jump to real handler
   15050 1:
   15051     EXPORT_PC()
   15052     move   a0, rPC         # arg0
   15053     move   a1, rFP         # arg1
   15054     move   a2, rSELF       # arg2
   15055     JAL(dvmCheckBefore)
   15056     jr     rBIX
   15057 
   15058 /* ------------------------------ */
   15059     .balign 128
   15060 .L_ALT_OP_UNUSED_73: /* 0x73 */
   15061 /* File: mips/alt_stub.S */
   15062 /*
   15063  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15064  * any interesting requests and then jump to the real instruction
   15065  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15066  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15067  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15068  * bail to the real handler if breakFlags==0.
   15069  */
   15070     lbu    a3, offThread_breakFlags(rSELF)
   15071     la     rBIX, dvmAsmInstructionStart + (115 * 128)
   15072     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15073     bnez   a3, 1f
   15074     jr     rBIX            # nothing to do - jump to real handler
   15075 1:
   15076     EXPORT_PC()
   15077     move   a0, rPC         # arg0
   15078     move   a1, rFP         # arg1
   15079     move   a2, rSELF       # arg2
   15080     JAL(dvmCheckBefore)
   15081     jr     rBIX
   15082 
   15083 /* ------------------------------ */
   15084     .balign 128
   15085 .L_ALT_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
   15086 /* File: mips/alt_stub.S */
   15087 /*
   15088  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15089  * any interesting requests and then jump to the real instruction
   15090  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15091  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15092  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15093  * bail to the real handler if breakFlags==0.
   15094  */
   15095     lbu    a3, offThread_breakFlags(rSELF)
   15096     la     rBIX, dvmAsmInstructionStart + (116 * 128)
   15097     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15098     bnez   a3, 1f
   15099     jr     rBIX            # nothing to do - jump to real handler
   15100 1:
   15101     EXPORT_PC()
   15102     move   a0, rPC         # arg0
   15103     move   a1, rFP         # arg1
   15104     move   a2, rSELF       # arg2
   15105     JAL(dvmCheckBefore)
   15106     jr     rBIX
   15107 
   15108 /* ------------------------------ */
   15109     .balign 128
   15110 .L_ALT_OP_INVOKE_SUPER_RANGE: /* 0x75 */
   15111 /* File: mips/alt_stub.S */
   15112 /*
   15113  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15114  * any interesting requests and then jump to the real instruction
   15115  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15116  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15117  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15118  * bail to the real handler if breakFlags==0.
   15119  */
   15120     lbu    a3, offThread_breakFlags(rSELF)
   15121     la     rBIX, dvmAsmInstructionStart + (117 * 128)
   15122     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15123     bnez   a3, 1f
   15124     jr     rBIX            # nothing to do - jump to real handler
   15125 1:
   15126     EXPORT_PC()
   15127     move   a0, rPC         # arg0
   15128     move   a1, rFP         # arg1
   15129     move   a2, rSELF       # arg2
   15130     JAL(dvmCheckBefore)
   15131     jr     rBIX
   15132 
   15133 /* ------------------------------ */
   15134     .balign 128
   15135 .L_ALT_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
   15136 /* File: mips/alt_stub.S */
   15137 /*
   15138  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15139  * any interesting requests and then jump to the real instruction
   15140  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15141  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15142  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15143  * bail to the real handler if breakFlags==0.
   15144  */
   15145     lbu    a3, offThread_breakFlags(rSELF)
   15146     la     rBIX, dvmAsmInstructionStart + (118 * 128)
   15147     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15148     bnez   a3, 1f
   15149     jr     rBIX            # nothing to do - jump to real handler
   15150 1:
   15151     EXPORT_PC()
   15152     move   a0, rPC         # arg0
   15153     move   a1, rFP         # arg1
   15154     move   a2, rSELF       # arg2
   15155     JAL(dvmCheckBefore)
   15156     jr     rBIX
   15157 
   15158 /* ------------------------------ */
   15159     .balign 128
   15160 .L_ALT_OP_INVOKE_STATIC_RANGE: /* 0x77 */
   15161 /* File: mips/alt_stub.S */
   15162 /*
   15163  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15164  * any interesting requests and then jump to the real instruction
   15165  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15166  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15167  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15168  * bail to the real handler if breakFlags==0.
   15169  */
   15170     lbu    a3, offThread_breakFlags(rSELF)
   15171     la     rBIX, dvmAsmInstructionStart + (119 * 128)
   15172     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15173     bnez   a3, 1f
   15174     jr     rBIX            # nothing to do - jump to real handler
   15175 1:
   15176     EXPORT_PC()
   15177     move   a0, rPC         # arg0
   15178     move   a1, rFP         # arg1
   15179     move   a2, rSELF       # arg2
   15180     JAL(dvmCheckBefore)
   15181     jr     rBIX
   15182 
   15183 /* ------------------------------ */
   15184     .balign 128
   15185 .L_ALT_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
   15186 /* File: mips/alt_stub.S */
   15187 /*
   15188  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15189  * any interesting requests and then jump to the real instruction
   15190  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15191  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15192  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15193  * bail to the real handler if breakFlags==0.
   15194  */
   15195     lbu    a3, offThread_breakFlags(rSELF)
   15196     la     rBIX, dvmAsmInstructionStart + (120 * 128)
   15197     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15198     bnez   a3, 1f
   15199     jr     rBIX            # nothing to do - jump to real handler
   15200 1:
   15201     EXPORT_PC()
   15202     move   a0, rPC         # arg0
   15203     move   a1, rFP         # arg1
   15204     move   a2, rSELF       # arg2
   15205     JAL(dvmCheckBefore)
   15206     jr     rBIX
   15207 
   15208 /* ------------------------------ */
   15209     .balign 128
   15210 .L_ALT_OP_UNUSED_79: /* 0x79 */
   15211 /* File: mips/alt_stub.S */
   15212 /*
   15213  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15214  * any interesting requests and then jump to the real instruction
   15215  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15216  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15217  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15218  * bail to the real handler if breakFlags==0.
   15219  */
   15220     lbu    a3, offThread_breakFlags(rSELF)
   15221     la     rBIX, dvmAsmInstructionStart + (121 * 128)
   15222     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15223     bnez   a3, 1f
   15224     jr     rBIX            # nothing to do - jump to real handler
   15225 1:
   15226     EXPORT_PC()
   15227     move   a0, rPC         # arg0
   15228     move   a1, rFP         # arg1
   15229     move   a2, rSELF       # arg2
   15230     JAL(dvmCheckBefore)
   15231     jr     rBIX
   15232 
   15233 /* ------------------------------ */
   15234     .balign 128
   15235 .L_ALT_OP_UNUSED_7A: /* 0x7a */
   15236 /* File: mips/alt_stub.S */
   15237 /*
   15238  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15239  * any interesting requests and then jump to the real instruction
   15240  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15241  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15242  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15243  * bail to the real handler if breakFlags==0.
   15244  */
   15245     lbu    a3, offThread_breakFlags(rSELF)
   15246     la     rBIX, dvmAsmInstructionStart + (122 * 128)
   15247     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15248     bnez   a3, 1f
   15249     jr     rBIX            # nothing to do - jump to real handler
   15250 1:
   15251     EXPORT_PC()
   15252     move   a0, rPC         # arg0
   15253     move   a1, rFP         # arg1
   15254     move   a2, rSELF       # arg2
   15255     JAL(dvmCheckBefore)
   15256     jr     rBIX
   15257 
   15258 /* ------------------------------ */
   15259     .balign 128
   15260 .L_ALT_OP_NEG_INT: /* 0x7b */
   15261 /* File: mips/alt_stub.S */
   15262 /*
   15263  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15264  * any interesting requests and then jump to the real instruction
   15265  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15266  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15267  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15268  * bail to the real handler if breakFlags==0.
   15269  */
   15270     lbu    a3, offThread_breakFlags(rSELF)
   15271     la     rBIX, dvmAsmInstructionStart + (123 * 128)
   15272     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15273     bnez   a3, 1f
   15274     jr     rBIX            # nothing to do - jump to real handler
   15275 1:
   15276     EXPORT_PC()
   15277     move   a0, rPC         # arg0
   15278     move   a1, rFP         # arg1
   15279     move   a2, rSELF       # arg2
   15280     JAL(dvmCheckBefore)
   15281     jr     rBIX
   15282 
   15283 /* ------------------------------ */
   15284     .balign 128
   15285 .L_ALT_OP_NOT_INT: /* 0x7c */
   15286 /* File: mips/alt_stub.S */
   15287 /*
   15288  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15289  * any interesting requests and then jump to the real instruction
   15290  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15291  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15292  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15293  * bail to the real handler if breakFlags==0.
   15294  */
   15295     lbu    a3, offThread_breakFlags(rSELF)
   15296     la     rBIX, dvmAsmInstructionStart + (124 * 128)
   15297     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15298     bnez   a3, 1f
   15299     jr     rBIX            # nothing to do - jump to real handler
   15300 1:
   15301     EXPORT_PC()
   15302     move   a0, rPC         # arg0
   15303     move   a1, rFP         # arg1
   15304     move   a2, rSELF       # arg2
   15305     JAL(dvmCheckBefore)
   15306     jr     rBIX
   15307 
   15308 /* ------------------------------ */
   15309     .balign 128
   15310 .L_ALT_OP_NEG_LONG: /* 0x7d */
   15311 /* File: mips/alt_stub.S */
   15312 /*
   15313  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15314  * any interesting requests and then jump to the real instruction
   15315  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15316  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15317  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15318  * bail to the real handler if breakFlags==0.
   15319  */
   15320     lbu    a3, offThread_breakFlags(rSELF)
   15321     la     rBIX, dvmAsmInstructionStart + (125 * 128)
   15322     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15323     bnez   a3, 1f
   15324     jr     rBIX            # nothing to do - jump to real handler
   15325 1:
   15326     EXPORT_PC()
   15327     move   a0, rPC         # arg0
   15328     move   a1, rFP         # arg1
   15329     move   a2, rSELF       # arg2
   15330     JAL(dvmCheckBefore)
   15331     jr     rBIX
   15332 
   15333 /* ------------------------------ */
   15334     .balign 128
   15335 .L_ALT_OP_NOT_LONG: /* 0x7e */
   15336 /* File: mips/alt_stub.S */
   15337 /*
   15338  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15339  * any interesting requests and then jump to the real instruction
   15340  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15341  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15342  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15343  * bail to the real handler if breakFlags==0.
   15344  */
   15345     lbu    a3, offThread_breakFlags(rSELF)
   15346     la     rBIX, dvmAsmInstructionStart + (126 * 128)
   15347     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15348     bnez   a3, 1f
   15349     jr     rBIX            # nothing to do - jump to real handler
   15350 1:
   15351     EXPORT_PC()
   15352     move   a0, rPC         # arg0
   15353     move   a1, rFP         # arg1
   15354     move   a2, rSELF       # arg2
   15355     JAL(dvmCheckBefore)
   15356     jr     rBIX
   15357 
   15358 /* ------------------------------ */
   15359     .balign 128
   15360 .L_ALT_OP_NEG_FLOAT: /* 0x7f */
   15361 /* File: mips/alt_stub.S */
   15362 /*
   15363  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15364  * any interesting requests and then jump to the real instruction
   15365  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15366  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15367  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15368  * bail to the real handler if breakFlags==0.
   15369  */
   15370     lbu    a3, offThread_breakFlags(rSELF)
   15371     la     rBIX, dvmAsmInstructionStart + (127 * 128)
   15372     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15373     bnez   a3, 1f
   15374     jr     rBIX            # nothing to do - jump to real handler
   15375 1:
   15376     EXPORT_PC()
   15377     move   a0, rPC         # arg0
   15378     move   a1, rFP         # arg1
   15379     move   a2, rSELF       # arg2
   15380     JAL(dvmCheckBefore)
   15381     jr     rBIX
   15382 
   15383 /* ------------------------------ */
   15384     .balign 128
   15385 .L_ALT_OP_NEG_DOUBLE: /* 0x80 */
   15386 /* File: mips/alt_stub.S */
   15387 /*
   15388  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15389  * any interesting requests and then jump to the real instruction
   15390  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15391  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15392  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15393  * bail to the real handler if breakFlags==0.
   15394  */
   15395     lbu    a3, offThread_breakFlags(rSELF)
   15396     la     rBIX, dvmAsmInstructionStart + (128 * 128)
   15397     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15398     bnez   a3, 1f
   15399     jr     rBIX            # nothing to do - jump to real handler
   15400 1:
   15401     EXPORT_PC()
   15402     move   a0, rPC         # arg0
   15403     move   a1, rFP         # arg1
   15404     move   a2, rSELF       # arg2
   15405     JAL(dvmCheckBefore)
   15406     jr     rBIX
   15407 
   15408 /* ------------------------------ */
   15409     .balign 128
   15410 .L_ALT_OP_INT_TO_LONG: /* 0x81 */
   15411 /* File: mips/alt_stub.S */
   15412 /*
   15413  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15414  * any interesting requests and then jump to the real instruction
   15415  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15416  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15417  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15418  * bail to the real handler if breakFlags==0.
   15419  */
   15420     lbu    a3, offThread_breakFlags(rSELF)
   15421     la     rBIX, dvmAsmInstructionStart + (129 * 128)
   15422     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15423     bnez   a3, 1f
   15424     jr     rBIX            # nothing to do - jump to real handler
   15425 1:
   15426     EXPORT_PC()
   15427     move   a0, rPC         # arg0
   15428     move   a1, rFP         # arg1
   15429     move   a2, rSELF       # arg2
   15430     JAL(dvmCheckBefore)
   15431     jr     rBIX
   15432 
   15433 /* ------------------------------ */
   15434     .balign 128
   15435 .L_ALT_OP_INT_TO_FLOAT: /* 0x82 */
   15436 /* File: mips/alt_stub.S */
   15437 /*
   15438  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15439  * any interesting requests and then jump to the real instruction
   15440  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15441  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15442  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15443  * bail to the real handler if breakFlags==0.
   15444  */
   15445     lbu    a3, offThread_breakFlags(rSELF)
   15446     la     rBIX, dvmAsmInstructionStart + (130 * 128)
   15447     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15448     bnez   a3, 1f
   15449     jr     rBIX            # nothing to do - jump to real handler
   15450 1:
   15451     EXPORT_PC()
   15452     move   a0, rPC         # arg0
   15453     move   a1, rFP         # arg1
   15454     move   a2, rSELF       # arg2
   15455     JAL(dvmCheckBefore)
   15456     jr     rBIX
   15457 
   15458 /* ------------------------------ */
   15459     .balign 128
   15460 .L_ALT_OP_INT_TO_DOUBLE: /* 0x83 */
   15461 /* File: mips/alt_stub.S */
   15462 /*
   15463  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15464  * any interesting requests and then jump to the real instruction
   15465  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15466  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15467  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15468  * bail to the real handler if breakFlags==0.
   15469  */
   15470     lbu    a3, offThread_breakFlags(rSELF)
   15471     la     rBIX, dvmAsmInstructionStart + (131 * 128)
   15472     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15473     bnez   a3, 1f
   15474     jr     rBIX            # nothing to do - jump to real handler
   15475 1:
   15476     EXPORT_PC()
   15477     move   a0, rPC         # arg0
   15478     move   a1, rFP         # arg1
   15479     move   a2, rSELF       # arg2
   15480     JAL(dvmCheckBefore)
   15481     jr     rBIX
   15482 
   15483 /* ------------------------------ */
   15484     .balign 128
   15485 .L_ALT_OP_LONG_TO_INT: /* 0x84 */
   15486 /* File: mips/alt_stub.S */
   15487 /*
   15488  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15489  * any interesting requests and then jump to the real instruction
   15490  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15491  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15492  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15493  * bail to the real handler if breakFlags==0.
   15494  */
   15495     lbu    a3, offThread_breakFlags(rSELF)
   15496     la     rBIX, dvmAsmInstructionStart + (132 * 128)
   15497     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15498     bnez   a3, 1f
   15499     jr     rBIX            # nothing to do - jump to real handler
   15500 1:
   15501     EXPORT_PC()
   15502     move   a0, rPC         # arg0
   15503     move   a1, rFP         # arg1
   15504     move   a2, rSELF       # arg2
   15505     JAL(dvmCheckBefore)
   15506     jr     rBIX
   15507 
   15508 /* ------------------------------ */
   15509     .balign 128
   15510 .L_ALT_OP_LONG_TO_FLOAT: /* 0x85 */
   15511 /* File: mips/alt_stub.S */
   15512 /*
   15513  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15514  * any interesting requests and then jump to the real instruction
   15515  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15516  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15517  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15518  * bail to the real handler if breakFlags==0.
   15519  */
   15520     lbu    a3, offThread_breakFlags(rSELF)
   15521     la     rBIX, dvmAsmInstructionStart + (133 * 128)
   15522     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15523     bnez   a3, 1f
   15524     jr     rBIX            # nothing to do - jump to real handler
   15525 1:
   15526     EXPORT_PC()
   15527     move   a0, rPC         # arg0
   15528     move   a1, rFP         # arg1
   15529     move   a2, rSELF       # arg2
   15530     JAL(dvmCheckBefore)
   15531     jr     rBIX
   15532 
   15533 /* ------------------------------ */
   15534     .balign 128
   15535 .L_ALT_OP_LONG_TO_DOUBLE: /* 0x86 */
   15536 /* File: mips/alt_stub.S */
   15537 /*
   15538  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15539  * any interesting requests and then jump to the real instruction
   15540  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15541  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15542  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15543  * bail to the real handler if breakFlags==0.
   15544  */
   15545     lbu    a3, offThread_breakFlags(rSELF)
   15546     la     rBIX, dvmAsmInstructionStart + (134 * 128)
   15547     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15548     bnez   a3, 1f
   15549     jr     rBIX            # nothing to do - jump to real handler
   15550 1:
   15551     EXPORT_PC()
   15552     move   a0, rPC         # arg0
   15553     move   a1, rFP         # arg1
   15554     move   a2, rSELF       # arg2
   15555     JAL(dvmCheckBefore)
   15556     jr     rBIX
   15557 
   15558 /* ------------------------------ */
   15559     .balign 128
   15560 .L_ALT_OP_FLOAT_TO_INT: /* 0x87 */
   15561 /* File: mips/alt_stub.S */
   15562 /*
   15563  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15564  * any interesting requests and then jump to the real instruction
   15565  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15566  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15567  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15568  * bail to the real handler if breakFlags==0.
   15569  */
   15570     lbu    a3, offThread_breakFlags(rSELF)
   15571     la     rBIX, dvmAsmInstructionStart + (135 * 128)
   15572     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15573     bnez   a3, 1f
   15574     jr     rBIX            # nothing to do - jump to real handler
   15575 1:
   15576     EXPORT_PC()
   15577     move   a0, rPC         # arg0
   15578     move   a1, rFP         # arg1
   15579     move   a2, rSELF       # arg2
   15580     JAL(dvmCheckBefore)
   15581     jr     rBIX
   15582 
   15583 /* ------------------------------ */
   15584     .balign 128
   15585 .L_ALT_OP_FLOAT_TO_LONG: /* 0x88 */
   15586 /* File: mips/alt_stub.S */
   15587 /*
   15588  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15589  * any interesting requests and then jump to the real instruction
   15590  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15591  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15592  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15593  * bail to the real handler if breakFlags==0.
   15594  */
   15595     lbu    a3, offThread_breakFlags(rSELF)
   15596     la     rBIX, dvmAsmInstructionStart + (136 * 128)
   15597     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15598     bnez   a3, 1f
   15599     jr     rBIX            # nothing to do - jump to real handler
   15600 1:
   15601     EXPORT_PC()
   15602     move   a0, rPC         # arg0
   15603     move   a1, rFP         # arg1
   15604     move   a2, rSELF       # arg2
   15605     JAL(dvmCheckBefore)
   15606     jr     rBIX
   15607 
   15608 /* ------------------------------ */
   15609     .balign 128
   15610 .L_ALT_OP_FLOAT_TO_DOUBLE: /* 0x89 */
   15611 /* File: mips/alt_stub.S */
   15612 /*
   15613  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15614  * any interesting requests and then jump to the real instruction
   15615  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15616  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15617  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15618  * bail to the real handler if breakFlags==0.
   15619  */
   15620     lbu    a3, offThread_breakFlags(rSELF)
   15621     la     rBIX, dvmAsmInstructionStart + (137 * 128)
   15622     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15623     bnez   a3, 1f
   15624     jr     rBIX            # nothing to do - jump to real handler
   15625 1:
   15626     EXPORT_PC()
   15627     move   a0, rPC         # arg0
   15628     move   a1, rFP         # arg1
   15629     move   a2, rSELF       # arg2
   15630     JAL(dvmCheckBefore)
   15631     jr     rBIX
   15632 
   15633 /* ------------------------------ */
   15634     .balign 128
   15635 .L_ALT_OP_DOUBLE_TO_INT: /* 0x8a */
   15636 /* File: mips/alt_stub.S */
   15637 /*
   15638  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15639  * any interesting requests and then jump to the real instruction
   15640  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15641  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15642  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15643  * bail to the real handler if breakFlags==0.
   15644  */
   15645     lbu    a3, offThread_breakFlags(rSELF)
   15646     la     rBIX, dvmAsmInstructionStart + (138 * 128)
   15647     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15648     bnez   a3, 1f
   15649     jr     rBIX            # nothing to do - jump to real handler
   15650 1:
   15651     EXPORT_PC()
   15652     move   a0, rPC         # arg0
   15653     move   a1, rFP         # arg1
   15654     move   a2, rSELF       # arg2
   15655     JAL(dvmCheckBefore)
   15656     jr     rBIX
   15657 
   15658 /* ------------------------------ */
   15659     .balign 128
   15660 .L_ALT_OP_DOUBLE_TO_LONG: /* 0x8b */
   15661 /* File: mips/alt_stub.S */
   15662 /*
   15663  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15664  * any interesting requests and then jump to the real instruction
   15665  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15666  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15667  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15668  * bail to the real handler if breakFlags==0.
   15669  */
   15670     lbu    a3, offThread_breakFlags(rSELF)
   15671     la     rBIX, dvmAsmInstructionStart + (139 * 128)
   15672     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15673     bnez   a3, 1f
   15674     jr     rBIX            # nothing to do - jump to real handler
   15675 1:
   15676     EXPORT_PC()
   15677     move   a0, rPC         # arg0
   15678     move   a1, rFP         # arg1
   15679     move   a2, rSELF       # arg2
   15680     JAL(dvmCheckBefore)
   15681     jr     rBIX
   15682 
   15683 /* ------------------------------ */
   15684     .balign 128
   15685 .L_ALT_OP_DOUBLE_TO_FLOAT: /* 0x8c */
   15686 /* File: mips/alt_stub.S */
   15687 /*
   15688  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15689  * any interesting requests and then jump to the real instruction
   15690  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15691  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15692  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15693  * bail to the real handler if breakFlags==0.
   15694  */
   15695     lbu    a3, offThread_breakFlags(rSELF)
   15696     la     rBIX, dvmAsmInstructionStart + (140 * 128)
   15697     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15698     bnez   a3, 1f
   15699     jr     rBIX            # nothing to do - jump to real handler
   15700 1:
   15701     EXPORT_PC()
   15702     move   a0, rPC         # arg0
   15703     move   a1, rFP         # arg1
   15704     move   a2, rSELF       # arg2
   15705     JAL(dvmCheckBefore)
   15706     jr     rBIX
   15707 
   15708 /* ------------------------------ */
   15709     .balign 128
   15710 .L_ALT_OP_INT_TO_BYTE: /* 0x8d */
   15711 /* File: mips/alt_stub.S */
   15712 /*
   15713  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15714  * any interesting requests and then jump to the real instruction
   15715  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15716  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15717  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15718  * bail to the real handler if breakFlags==0.
   15719  */
   15720     lbu    a3, offThread_breakFlags(rSELF)
   15721     la     rBIX, dvmAsmInstructionStart + (141 * 128)
   15722     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15723     bnez   a3, 1f
   15724     jr     rBIX            # nothing to do - jump to real handler
   15725 1:
   15726     EXPORT_PC()
   15727     move   a0, rPC         # arg0
   15728     move   a1, rFP         # arg1
   15729     move   a2, rSELF       # arg2
   15730     JAL(dvmCheckBefore)
   15731     jr     rBIX
   15732 
   15733 /* ------------------------------ */
   15734     .balign 128
   15735 .L_ALT_OP_INT_TO_CHAR: /* 0x8e */
   15736 /* File: mips/alt_stub.S */
   15737 /*
   15738  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15739  * any interesting requests and then jump to the real instruction
   15740  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15741  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15742  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15743  * bail to the real handler if breakFlags==0.
   15744  */
   15745     lbu    a3, offThread_breakFlags(rSELF)
   15746     la     rBIX, dvmAsmInstructionStart + (142 * 128)
   15747     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15748     bnez   a3, 1f
   15749     jr     rBIX            # nothing to do - jump to real handler
   15750 1:
   15751     EXPORT_PC()
   15752     move   a0, rPC         # arg0
   15753     move   a1, rFP         # arg1
   15754     move   a2, rSELF       # arg2
   15755     JAL(dvmCheckBefore)
   15756     jr     rBIX
   15757 
   15758 /* ------------------------------ */
   15759     .balign 128
   15760 .L_ALT_OP_INT_TO_SHORT: /* 0x8f */
   15761 /* File: mips/alt_stub.S */
   15762 /*
   15763  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15764  * any interesting requests and then jump to the real instruction
   15765  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15766  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15767  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15768  * bail to the real handler if breakFlags==0.
   15769  */
   15770     lbu    a3, offThread_breakFlags(rSELF)
   15771     la     rBIX, dvmAsmInstructionStart + (143 * 128)
   15772     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15773     bnez   a3, 1f
   15774     jr     rBIX            # nothing to do - jump to real handler
   15775 1:
   15776     EXPORT_PC()
   15777     move   a0, rPC         # arg0
   15778     move   a1, rFP         # arg1
   15779     move   a2, rSELF       # arg2
   15780     JAL(dvmCheckBefore)
   15781     jr     rBIX
   15782 
   15783 /* ------------------------------ */
   15784     .balign 128
   15785 .L_ALT_OP_ADD_INT: /* 0x90 */
   15786 /* File: mips/alt_stub.S */
   15787 /*
   15788  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15789  * any interesting requests and then jump to the real instruction
   15790  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15791  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15792  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15793  * bail to the real handler if breakFlags==0.
   15794  */
   15795     lbu    a3, offThread_breakFlags(rSELF)
   15796     la     rBIX, dvmAsmInstructionStart + (144 * 128)
   15797     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15798     bnez   a3, 1f
   15799     jr     rBIX            # nothing to do - jump to real handler
   15800 1:
   15801     EXPORT_PC()
   15802     move   a0, rPC         # arg0
   15803     move   a1, rFP         # arg1
   15804     move   a2, rSELF       # arg2
   15805     JAL(dvmCheckBefore)
   15806     jr     rBIX
   15807 
   15808 /* ------------------------------ */
   15809     .balign 128
   15810 .L_ALT_OP_SUB_INT: /* 0x91 */
   15811 /* File: mips/alt_stub.S */
   15812 /*
   15813  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15814  * any interesting requests and then jump to the real instruction
   15815  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15816  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15817  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15818  * bail to the real handler if breakFlags==0.
   15819  */
   15820     lbu    a3, offThread_breakFlags(rSELF)
   15821     la     rBIX, dvmAsmInstructionStart + (145 * 128)
   15822     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15823     bnez   a3, 1f
   15824     jr     rBIX            # nothing to do - jump to real handler
   15825 1:
   15826     EXPORT_PC()
   15827     move   a0, rPC         # arg0
   15828     move   a1, rFP         # arg1
   15829     move   a2, rSELF       # arg2
   15830     JAL(dvmCheckBefore)
   15831     jr     rBIX
   15832 
   15833 /* ------------------------------ */
   15834     .balign 128
   15835 .L_ALT_OP_MUL_INT: /* 0x92 */
   15836 /* File: mips/alt_stub.S */
   15837 /*
   15838  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15839  * any interesting requests and then jump to the real instruction
   15840  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15841  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15842  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15843  * bail to the real handler if breakFlags==0.
   15844  */
   15845     lbu    a3, offThread_breakFlags(rSELF)
   15846     la     rBIX, dvmAsmInstructionStart + (146 * 128)
   15847     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15848     bnez   a3, 1f
   15849     jr     rBIX            # nothing to do - jump to real handler
   15850 1:
   15851     EXPORT_PC()
   15852     move   a0, rPC         # arg0
   15853     move   a1, rFP         # arg1
   15854     move   a2, rSELF       # arg2
   15855     JAL(dvmCheckBefore)
   15856     jr     rBIX
   15857 
   15858 /* ------------------------------ */
   15859     .balign 128
   15860 .L_ALT_OP_DIV_INT: /* 0x93 */
   15861 /* File: mips/alt_stub.S */
   15862 /*
   15863  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15864  * any interesting requests and then jump to the real instruction
   15865  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15866  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15867  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15868  * bail to the real handler if breakFlags==0.
   15869  */
   15870     lbu    a3, offThread_breakFlags(rSELF)
   15871     la     rBIX, dvmAsmInstructionStart + (147 * 128)
   15872     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15873     bnez   a3, 1f
   15874     jr     rBIX            # nothing to do - jump to real handler
   15875 1:
   15876     EXPORT_PC()
   15877     move   a0, rPC         # arg0
   15878     move   a1, rFP         # arg1
   15879     move   a2, rSELF       # arg2
   15880     JAL(dvmCheckBefore)
   15881     jr     rBIX
   15882 
   15883 /* ------------------------------ */
   15884     .balign 128
   15885 .L_ALT_OP_REM_INT: /* 0x94 */
   15886 /* File: mips/alt_stub.S */
   15887 /*
   15888  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15889  * any interesting requests and then jump to the real instruction
   15890  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15891  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15892  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15893  * bail to the real handler if breakFlags==0.
   15894  */
   15895     lbu    a3, offThread_breakFlags(rSELF)
   15896     la     rBIX, dvmAsmInstructionStart + (148 * 128)
   15897     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15898     bnez   a3, 1f
   15899     jr     rBIX            # nothing to do - jump to real handler
   15900 1:
   15901     EXPORT_PC()
   15902     move   a0, rPC         # arg0
   15903     move   a1, rFP         # arg1
   15904     move   a2, rSELF       # arg2
   15905     JAL(dvmCheckBefore)
   15906     jr     rBIX
   15907 
   15908 /* ------------------------------ */
   15909     .balign 128
   15910 .L_ALT_OP_AND_INT: /* 0x95 */
   15911 /* File: mips/alt_stub.S */
   15912 /*
   15913  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15914  * any interesting requests and then jump to the real instruction
   15915  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15916  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15917  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15918  * bail to the real handler if breakFlags==0.
   15919  */
   15920     lbu    a3, offThread_breakFlags(rSELF)
   15921     la     rBIX, dvmAsmInstructionStart + (149 * 128)
   15922     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15923     bnez   a3, 1f
   15924     jr     rBIX            # nothing to do - jump to real handler
   15925 1:
   15926     EXPORT_PC()
   15927     move   a0, rPC         # arg0
   15928     move   a1, rFP         # arg1
   15929     move   a2, rSELF       # arg2
   15930     JAL(dvmCheckBefore)
   15931     jr     rBIX
   15932 
   15933 /* ------------------------------ */
   15934     .balign 128
   15935 .L_ALT_OP_OR_INT: /* 0x96 */
   15936 /* File: mips/alt_stub.S */
   15937 /*
   15938  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15939  * any interesting requests and then jump to the real instruction
   15940  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15941  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15942  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15943  * bail to the real handler if breakFlags==0.
   15944  */
   15945     lbu    a3, offThread_breakFlags(rSELF)
   15946     la     rBIX, dvmAsmInstructionStart + (150 * 128)
   15947     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15948     bnez   a3, 1f
   15949     jr     rBIX            # nothing to do - jump to real handler
   15950 1:
   15951     EXPORT_PC()
   15952     move   a0, rPC         # arg0
   15953     move   a1, rFP         # arg1
   15954     move   a2, rSELF       # arg2
   15955     JAL(dvmCheckBefore)
   15956     jr     rBIX
   15957 
   15958 /* ------------------------------ */
   15959     .balign 128
   15960 .L_ALT_OP_XOR_INT: /* 0x97 */
   15961 /* File: mips/alt_stub.S */
   15962 /*
   15963  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15964  * any interesting requests and then jump to the real instruction
   15965  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15966  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15967  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15968  * bail to the real handler if breakFlags==0.
   15969  */
   15970     lbu    a3, offThread_breakFlags(rSELF)
   15971     la     rBIX, dvmAsmInstructionStart + (151 * 128)
   15972     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15973     bnez   a3, 1f
   15974     jr     rBIX            # nothing to do - jump to real handler
   15975 1:
   15976     EXPORT_PC()
   15977     move   a0, rPC         # arg0
   15978     move   a1, rFP         # arg1
   15979     move   a2, rSELF       # arg2
   15980     JAL(dvmCheckBefore)
   15981     jr     rBIX
   15982 
   15983 /* ------------------------------ */
   15984     .balign 128
   15985 .L_ALT_OP_SHL_INT: /* 0x98 */
   15986 /* File: mips/alt_stub.S */
   15987 /*
   15988  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   15989  * any interesting requests and then jump to the real instruction
   15990  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   15991  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   15992  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   15993  * bail to the real handler if breakFlags==0.
   15994  */
   15995     lbu    a3, offThread_breakFlags(rSELF)
   15996     la     rBIX, dvmAsmInstructionStart + (152 * 128)
   15997     lw     rIBASE, offThread_curHandlerTable(rSELF)
   15998     bnez   a3, 1f
   15999     jr     rBIX            # nothing to do - jump to real handler
   16000 1:
   16001     EXPORT_PC()
   16002     move   a0, rPC         # arg0
   16003     move   a1, rFP         # arg1
   16004     move   a2, rSELF       # arg2
   16005     JAL(dvmCheckBefore)
   16006     jr     rBIX
   16007 
   16008 /* ------------------------------ */
   16009     .balign 128
   16010 .L_ALT_OP_SHR_INT: /* 0x99 */
   16011 /* File: mips/alt_stub.S */
   16012 /*
   16013  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16014  * any interesting requests and then jump to the real instruction
   16015  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16016  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16017  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16018  * bail to the real handler if breakFlags==0.
   16019  */
   16020     lbu    a3, offThread_breakFlags(rSELF)
   16021     la     rBIX, dvmAsmInstructionStart + (153 * 128)
   16022     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16023     bnez   a3, 1f
   16024     jr     rBIX            # nothing to do - jump to real handler
   16025 1:
   16026     EXPORT_PC()
   16027     move   a0, rPC         # arg0
   16028     move   a1, rFP         # arg1
   16029     move   a2, rSELF       # arg2
   16030     JAL(dvmCheckBefore)
   16031     jr     rBIX
   16032 
   16033 /* ------------------------------ */
   16034     .balign 128
   16035 .L_ALT_OP_USHR_INT: /* 0x9a */
   16036 /* File: mips/alt_stub.S */
   16037 /*
   16038  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16039  * any interesting requests and then jump to the real instruction
   16040  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16041  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16042  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16043  * bail to the real handler if breakFlags==0.
   16044  */
   16045     lbu    a3, offThread_breakFlags(rSELF)
   16046     la     rBIX, dvmAsmInstructionStart + (154 * 128)
   16047     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16048     bnez   a3, 1f
   16049     jr     rBIX            # nothing to do - jump to real handler
   16050 1:
   16051     EXPORT_PC()
   16052     move   a0, rPC         # arg0
   16053     move   a1, rFP         # arg1
   16054     move   a2, rSELF       # arg2
   16055     JAL(dvmCheckBefore)
   16056     jr     rBIX
   16057 
   16058 /* ------------------------------ */
   16059     .balign 128
   16060 .L_ALT_OP_ADD_LONG: /* 0x9b */
   16061 /* File: mips/alt_stub.S */
   16062 /*
   16063  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16064  * any interesting requests and then jump to the real instruction
   16065  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16066  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16067  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16068  * bail to the real handler if breakFlags==0.
   16069  */
   16070     lbu    a3, offThread_breakFlags(rSELF)
   16071     la     rBIX, dvmAsmInstructionStart + (155 * 128)
   16072     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16073     bnez   a3, 1f
   16074     jr     rBIX            # nothing to do - jump to real handler
   16075 1:
   16076     EXPORT_PC()
   16077     move   a0, rPC         # arg0
   16078     move   a1, rFP         # arg1
   16079     move   a2, rSELF       # arg2
   16080     JAL(dvmCheckBefore)
   16081     jr     rBIX
   16082 
   16083 /* ------------------------------ */
   16084     .balign 128
   16085 .L_ALT_OP_SUB_LONG: /* 0x9c */
   16086 /* File: mips/alt_stub.S */
   16087 /*
   16088  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16089  * any interesting requests and then jump to the real instruction
   16090  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16091  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16092  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16093  * bail to the real handler if breakFlags==0.
   16094  */
   16095     lbu    a3, offThread_breakFlags(rSELF)
   16096     la     rBIX, dvmAsmInstructionStart + (156 * 128)
   16097     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16098     bnez   a3, 1f
   16099     jr     rBIX            # nothing to do - jump to real handler
   16100 1:
   16101     EXPORT_PC()
   16102     move   a0, rPC         # arg0
   16103     move   a1, rFP         # arg1
   16104     move   a2, rSELF       # arg2
   16105     JAL(dvmCheckBefore)
   16106     jr     rBIX
   16107 
   16108 /* ------------------------------ */
   16109     .balign 128
   16110 .L_ALT_OP_MUL_LONG: /* 0x9d */
   16111 /* File: mips/alt_stub.S */
   16112 /*
   16113  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16114  * any interesting requests and then jump to the real instruction
   16115  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16116  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16117  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16118  * bail to the real handler if breakFlags==0.
   16119  */
   16120     lbu    a3, offThread_breakFlags(rSELF)
   16121     la     rBIX, dvmAsmInstructionStart + (157 * 128)
   16122     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16123     bnez   a3, 1f
   16124     jr     rBIX            # nothing to do - jump to real handler
   16125 1:
   16126     EXPORT_PC()
   16127     move   a0, rPC         # arg0
   16128     move   a1, rFP         # arg1
   16129     move   a2, rSELF       # arg2
   16130     JAL(dvmCheckBefore)
   16131     jr     rBIX
   16132 
   16133 /* ------------------------------ */
   16134     .balign 128
   16135 .L_ALT_OP_DIV_LONG: /* 0x9e */
   16136 /* File: mips/alt_stub.S */
   16137 /*
   16138  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16139  * any interesting requests and then jump to the real instruction
   16140  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16141  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16142  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16143  * bail to the real handler if breakFlags==0.
   16144  */
   16145     lbu    a3, offThread_breakFlags(rSELF)
   16146     la     rBIX, dvmAsmInstructionStart + (158 * 128)
   16147     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16148     bnez   a3, 1f
   16149     jr     rBIX            # nothing to do - jump to real handler
   16150 1:
   16151     EXPORT_PC()
   16152     move   a0, rPC         # arg0
   16153     move   a1, rFP         # arg1
   16154     move   a2, rSELF       # arg2
   16155     JAL(dvmCheckBefore)
   16156     jr     rBIX
   16157 
   16158 /* ------------------------------ */
   16159     .balign 128
   16160 .L_ALT_OP_REM_LONG: /* 0x9f */
   16161 /* File: mips/alt_stub.S */
   16162 /*
   16163  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16164  * any interesting requests and then jump to the real instruction
   16165  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16166  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16167  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16168  * bail to the real handler if breakFlags==0.
   16169  */
   16170     lbu    a3, offThread_breakFlags(rSELF)
   16171     la     rBIX, dvmAsmInstructionStart + (159 * 128)
   16172     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16173     bnez   a3, 1f
   16174     jr     rBIX            # nothing to do - jump to real handler
   16175 1:
   16176     EXPORT_PC()
   16177     move   a0, rPC         # arg0
   16178     move   a1, rFP         # arg1
   16179     move   a2, rSELF       # arg2
   16180     JAL(dvmCheckBefore)
   16181     jr     rBIX
   16182 
   16183 /* ------------------------------ */
   16184     .balign 128
   16185 .L_ALT_OP_AND_LONG: /* 0xa0 */
   16186 /* File: mips/alt_stub.S */
   16187 /*
   16188  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16189  * any interesting requests and then jump to the real instruction
   16190  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16191  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16192  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16193  * bail to the real handler if breakFlags==0.
   16194  */
   16195     lbu    a3, offThread_breakFlags(rSELF)
   16196     la     rBIX, dvmAsmInstructionStart + (160 * 128)
   16197     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16198     bnez   a3, 1f
   16199     jr     rBIX            # nothing to do - jump to real handler
   16200 1:
   16201     EXPORT_PC()
   16202     move   a0, rPC         # arg0
   16203     move   a1, rFP         # arg1
   16204     move   a2, rSELF       # arg2
   16205     JAL(dvmCheckBefore)
   16206     jr     rBIX
   16207 
   16208 /* ------------------------------ */
   16209     .balign 128
   16210 .L_ALT_OP_OR_LONG: /* 0xa1 */
   16211 /* File: mips/alt_stub.S */
   16212 /*
   16213  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16214  * any interesting requests and then jump to the real instruction
   16215  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16216  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16217  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16218  * bail to the real handler if breakFlags==0.
   16219  */
   16220     lbu    a3, offThread_breakFlags(rSELF)
   16221     la     rBIX, dvmAsmInstructionStart + (161 * 128)
   16222     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16223     bnez   a3, 1f
   16224     jr     rBIX            # nothing to do - jump to real handler
   16225 1:
   16226     EXPORT_PC()
   16227     move   a0, rPC         # arg0
   16228     move   a1, rFP         # arg1
   16229     move   a2, rSELF       # arg2
   16230     JAL(dvmCheckBefore)
   16231     jr     rBIX
   16232 
   16233 /* ------------------------------ */
   16234     .balign 128
   16235 .L_ALT_OP_XOR_LONG: /* 0xa2 */
   16236 /* File: mips/alt_stub.S */
   16237 /*
   16238  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16239  * any interesting requests and then jump to the real instruction
   16240  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16241  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16242  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16243  * bail to the real handler if breakFlags==0.
   16244  */
   16245     lbu    a3, offThread_breakFlags(rSELF)
   16246     la     rBIX, dvmAsmInstructionStart + (162 * 128)
   16247     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16248     bnez   a3, 1f
   16249     jr     rBIX            # nothing to do - jump to real handler
   16250 1:
   16251     EXPORT_PC()
   16252     move   a0, rPC         # arg0
   16253     move   a1, rFP         # arg1
   16254     move   a2, rSELF       # arg2
   16255     JAL(dvmCheckBefore)
   16256     jr     rBIX
   16257 
   16258 /* ------------------------------ */
   16259     .balign 128
   16260 .L_ALT_OP_SHL_LONG: /* 0xa3 */
   16261 /* File: mips/alt_stub.S */
   16262 /*
   16263  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16264  * any interesting requests and then jump to the real instruction
   16265  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16266  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16267  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16268  * bail to the real handler if breakFlags==0.
   16269  */
   16270     lbu    a3, offThread_breakFlags(rSELF)
   16271     la     rBIX, dvmAsmInstructionStart + (163 * 128)
   16272     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16273     bnez   a3, 1f
   16274     jr     rBIX            # nothing to do - jump to real handler
   16275 1:
   16276     EXPORT_PC()
   16277     move   a0, rPC         # arg0
   16278     move   a1, rFP         # arg1
   16279     move   a2, rSELF       # arg2
   16280     JAL(dvmCheckBefore)
   16281     jr     rBIX
   16282 
   16283 /* ------------------------------ */
   16284     .balign 128
   16285 .L_ALT_OP_SHR_LONG: /* 0xa4 */
   16286 /* File: mips/alt_stub.S */
   16287 /*
   16288  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16289  * any interesting requests and then jump to the real instruction
   16290  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16291  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16292  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16293  * bail to the real handler if breakFlags==0.
   16294  */
   16295     lbu    a3, offThread_breakFlags(rSELF)
   16296     la     rBIX, dvmAsmInstructionStart + (164 * 128)
   16297     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16298     bnez   a3, 1f
   16299     jr     rBIX            # nothing to do - jump to real handler
   16300 1:
   16301     EXPORT_PC()
   16302     move   a0, rPC         # arg0
   16303     move   a1, rFP         # arg1
   16304     move   a2, rSELF       # arg2
   16305     JAL(dvmCheckBefore)
   16306     jr     rBIX
   16307 
   16308 /* ------------------------------ */
   16309     .balign 128
   16310 .L_ALT_OP_USHR_LONG: /* 0xa5 */
   16311 /* File: mips/alt_stub.S */
   16312 /*
   16313  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16314  * any interesting requests and then jump to the real instruction
   16315  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16316  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16317  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16318  * bail to the real handler if breakFlags==0.
   16319  */
   16320     lbu    a3, offThread_breakFlags(rSELF)
   16321     la     rBIX, dvmAsmInstructionStart + (165 * 128)
   16322     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16323     bnez   a3, 1f
   16324     jr     rBIX            # nothing to do - jump to real handler
   16325 1:
   16326     EXPORT_PC()
   16327     move   a0, rPC         # arg0
   16328     move   a1, rFP         # arg1
   16329     move   a2, rSELF       # arg2
   16330     JAL(dvmCheckBefore)
   16331     jr     rBIX
   16332 
   16333 /* ------------------------------ */
   16334     .balign 128
   16335 .L_ALT_OP_ADD_FLOAT: /* 0xa6 */
   16336 /* File: mips/alt_stub.S */
   16337 /*
   16338  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16339  * any interesting requests and then jump to the real instruction
   16340  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16341  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16342  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16343  * bail to the real handler if breakFlags==0.
   16344  */
   16345     lbu    a3, offThread_breakFlags(rSELF)
   16346     la     rBIX, dvmAsmInstructionStart + (166 * 128)
   16347     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16348     bnez   a3, 1f
   16349     jr     rBIX            # nothing to do - jump to real handler
   16350 1:
   16351     EXPORT_PC()
   16352     move   a0, rPC         # arg0
   16353     move   a1, rFP         # arg1
   16354     move   a2, rSELF       # arg2
   16355     JAL(dvmCheckBefore)
   16356     jr     rBIX
   16357 
   16358 /* ------------------------------ */
   16359     .balign 128
   16360 .L_ALT_OP_SUB_FLOAT: /* 0xa7 */
   16361 /* File: mips/alt_stub.S */
   16362 /*
   16363  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16364  * any interesting requests and then jump to the real instruction
   16365  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16366  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16367  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16368  * bail to the real handler if breakFlags==0.
   16369  */
   16370     lbu    a3, offThread_breakFlags(rSELF)
   16371     la     rBIX, dvmAsmInstructionStart + (167 * 128)
   16372     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16373     bnez   a3, 1f
   16374     jr     rBIX            # nothing to do - jump to real handler
   16375 1:
   16376     EXPORT_PC()
   16377     move   a0, rPC         # arg0
   16378     move   a1, rFP         # arg1
   16379     move   a2, rSELF       # arg2
   16380     JAL(dvmCheckBefore)
   16381     jr     rBIX
   16382 
   16383 /* ------------------------------ */
   16384     .balign 128
   16385 .L_ALT_OP_MUL_FLOAT: /* 0xa8 */
   16386 /* File: mips/alt_stub.S */
   16387 /*
   16388  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16389  * any interesting requests and then jump to the real instruction
   16390  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16391  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16392  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16393  * bail to the real handler if breakFlags==0.
   16394  */
   16395     lbu    a3, offThread_breakFlags(rSELF)
   16396     la     rBIX, dvmAsmInstructionStart + (168 * 128)
   16397     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16398     bnez   a3, 1f
   16399     jr     rBIX            # nothing to do - jump to real handler
   16400 1:
   16401     EXPORT_PC()
   16402     move   a0, rPC         # arg0
   16403     move   a1, rFP         # arg1
   16404     move   a2, rSELF       # arg2
   16405     JAL(dvmCheckBefore)
   16406     jr     rBIX
   16407 
   16408 /* ------------------------------ */
   16409     .balign 128
   16410 .L_ALT_OP_DIV_FLOAT: /* 0xa9 */
   16411 /* File: mips/alt_stub.S */
   16412 /*
   16413  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16414  * any interesting requests and then jump to the real instruction
   16415  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16416  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16417  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16418  * bail to the real handler if breakFlags==0.
   16419  */
   16420     lbu    a3, offThread_breakFlags(rSELF)
   16421     la     rBIX, dvmAsmInstructionStart + (169 * 128)
   16422     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16423     bnez   a3, 1f
   16424     jr     rBIX            # nothing to do - jump to real handler
   16425 1:
   16426     EXPORT_PC()
   16427     move   a0, rPC         # arg0
   16428     move   a1, rFP         # arg1
   16429     move   a2, rSELF       # arg2
   16430     JAL(dvmCheckBefore)
   16431     jr     rBIX
   16432 
   16433 /* ------------------------------ */
   16434     .balign 128
   16435 .L_ALT_OP_REM_FLOAT: /* 0xaa */
   16436 /* File: mips/alt_stub.S */
   16437 /*
   16438  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16439  * any interesting requests and then jump to the real instruction
   16440  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16441  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16442  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16443  * bail to the real handler if breakFlags==0.
   16444  */
   16445     lbu    a3, offThread_breakFlags(rSELF)
   16446     la     rBIX, dvmAsmInstructionStart + (170 * 128)
   16447     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16448     bnez   a3, 1f
   16449     jr     rBIX            # nothing to do - jump to real handler
   16450 1:
   16451     EXPORT_PC()
   16452     move   a0, rPC         # arg0
   16453     move   a1, rFP         # arg1
   16454     move   a2, rSELF       # arg2
   16455     JAL(dvmCheckBefore)
   16456     jr     rBIX
   16457 
   16458 /* ------------------------------ */
   16459     .balign 128
   16460 .L_ALT_OP_ADD_DOUBLE: /* 0xab */
   16461 /* File: mips/alt_stub.S */
   16462 /*
   16463  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16464  * any interesting requests and then jump to the real instruction
   16465  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16466  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16467  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16468  * bail to the real handler if breakFlags==0.
   16469  */
   16470     lbu    a3, offThread_breakFlags(rSELF)
   16471     la     rBIX, dvmAsmInstructionStart + (171 * 128)
   16472     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16473     bnez   a3, 1f
   16474     jr     rBIX            # nothing to do - jump to real handler
   16475 1:
   16476     EXPORT_PC()
   16477     move   a0, rPC         # arg0
   16478     move   a1, rFP         # arg1
   16479     move   a2, rSELF       # arg2
   16480     JAL(dvmCheckBefore)
   16481     jr     rBIX
   16482 
   16483 /* ------------------------------ */
   16484     .balign 128
   16485 .L_ALT_OP_SUB_DOUBLE: /* 0xac */
   16486 /* File: mips/alt_stub.S */
   16487 /*
   16488  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16489  * any interesting requests and then jump to the real instruction
   16490  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16491  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16492  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16493  * bail to the real handler if breakFlags==0.
   16494  */
   16495     lbu    a3, offThread_breakFlags(rSELF)
   16496     la     rBIX, dvmAsmInstructionStart + (172 * 128)
   16497     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16498     bnez   a3, 1f
   16499     jr     rBIX            # nothing to do - jump to real handler
   16500 1:
   16501     EXPORT_PC()
   16502     move   a0, rPC         # arg0
   16503     move   a1, rFP         # arg1
   16504     move   a2, rSELF       # arg2
   16505     JAL(dvmCheckBefore)
   16506     jr     rBIX
   16507 
   16508 /* ------------------------------ */
   16509     .balign 128
   16510 .L_ALT_OP_MUL_DOUBLE: /* 0xad */
   16511 /* File: mips/alt_stub.S */
   16512 /*
   16513  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16514  * any interesting requests and then jump to the real instruction
   16515  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16516  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16517  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16518  * bail to the real handler if breakFlags==0.
   16519  */
   16520     lbu    a3, offThread_breakFlags(rSELF)
   16521     la     rBIX, dvmAsmInstructionStart + (173 * 128)
   16522     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16523     bnez   a3, 1f
   16524     jr     rBIX            # nothing to do - jump to real handler
   16525 1:
   16526     EXPORT_PC()
   16527     move   a0, rPC         # arg0
   16528     move   a1, rFP         # arg1
   16529     move   a2, rSELF       # arg2
   16530     JAL(dvmCheckBefore)
   16531     jr     rBIX
   16532 
   16533 /* ------------------------------ */
   16534     .balign 128
   16535 .L_ALT_OP_DIV_DOUBLE: /* 0xae */
   16536 /* File: mips/alt_stub.S */
   16537 /*
   16538  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16539  * any interesting requests and then jump to the real instruction
   16540  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16541  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16542  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16543  * bail to the real handler if breakFlags==0.
   16544  */
   16545     lbu    a3, offThread_breakFlags(rSELF)
   16546     la     rBIX, dvmAsmInstructionStart + (174 * 128)
   16547     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16548     bnez   a3, 1f
   16549     jr     rBIX            # nothing to do - jump to real handler
   16550 1:
   16551     EXPORT_PC()
   16552     move   a0, rPC         # arg0
   16553     move   a1, rFP         # arg1
   16554     move   a2, rSELF       # arg2
   16555     JAL(dvmCheckBefore)
   16556     jr     rBIX
   16557 
   16558 /* ------------------------------ */
   16559     .balign 128
   16560 .L_ALT_OP_REM_DOUBLE: /* 0xaf */
   16561 /* File: mips/alt_stub.S */
   16562 /*
   16563  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16564  * any interesting requests and then jump to the real instruction
   16565  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16566  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16567  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16568  * bail to the real handler if breakFlags==0.
   16569  */
   16570     lbu    a3, offThread_breakFlags(rSELF)
   16571     la     rBIX, dvmAsmInstructionStart + (175 * 128)
   16572     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16573     bnez   a3, 1f
   16574     jr     rBIX            # nothing to do - jump to real handler
   16575 1:
   16576     EXPORT_PC()
   16577     move   a0, rPC         # arg0
   16578     move   a1, rFP         # arg1
   16579     move   a2, rSELF       # arg2
   16580     JAL(dvmCheckBefore)
   16581     jr     rBIX
   16582 
   16583 /* ------------------------------ */
   16584     .balign 128
   16585 .L_ALT_OP_ADD_INT_2ADDR: /* 0xb0 */
   16586 /* File: mips/alt_stub.S */
   16587 /*
   16588  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16589  * any interesting requests and then jump to the real instruction
   16590  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16591  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16592  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16593  * bail to the real handler if breakFlags==0.
   16594  */
   16595     lbu    a3, offThread_breakFlags(rSELF)
   16596     la     rBIX, dvmAsmInstructionStart + (176 * 128)
   16597     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16598     bnez   a3, 1f
   16599     jr     rBIX            # nothing to do - jump to real handler
   16600 1:
   16601     EXPORT_PC()
   16602     move   a0, rPC         # arg0
   16603     move   a1, rFP         # arg1
   16604     move   a2, rSELF       # arg2
   16605     JAL(dvmCheckBefore)
   16606     jr     rBIX
   16607 
   16608 /* ------------------------------ */
   16609     .balign 128
   16610 .L_ALT_OP_SUB_INT_2ADDR: /* 0xb1 */
   16611 /* File: mips/alt_stub.S */
   16612 /*
   16613  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16614  * any interesting requests and then jump to the real instruction
   16615  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16616  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16617  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16618  * bail to the real handler if breakFlags==0.
   16619  */
   16620     lbu    a3, offThread_breakFlags(rSELF)
   16621     la     rBIX, dvmAsmInstructionStart + (177 * 128)
   16622     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16623     bnez   a3, 1f
   16624     jr     rBIX            # nothing to do - jump to real handler
   16625 1:
   16626     EXPORT_PC()
   16627     move   a0, rPC         # arg0
   16628     move   a1, rFP         # arg1
   16629     move   a2, rSELF       # arg2
   16630     JAL(dvmCheckBefore)
   16631     jr     rBIX
   16632 
   16633 /* ------------------------------ */
   16634     .balign 128
   16635 .L_ALT_OP_MUL_INT_2ADDR: /* 0xb2 */
   16636 /* File: mips/alt_stub.S */
   16637 /*
   16638  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16639  * any interesting requests and then jump to the real instruction
   16640  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16641  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16642  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16643  * bail to the real handler if breakFlags==0.
   16644  */
   16645     lbu    a3, offThread_breakFlags(rSELF)
   16646     la     rBIX, dvmAsmInstructionStart + (178 * 128)
   16647     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16648     bnez   a3, 1f
   16649     jr     rBIX            # nothing to do - jump to real handler
   16650 1:
   16651     EXPORT_PC()
   16652     move   a0, rPC         # arg0
   16653     move   a1, rFP         # arg1
   16654     move   a2, rSELF       # arg2
   16655     JAL(dvmCheckBefore)
   16656     jr     rBIX
   16657 
   16658 /* ------------------------------ */
   16659     .balign 128
   16660 .L_ALT_OP_DIV_INT_2ADDR: /* 0xb3 */
   16661 /* File: mips/alt_stub.S */
   16662 /*
   16663  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16664  * any interesting requests and then jump to the real instruction
   16665  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16666  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16667  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16668  * bail to the real handler if breakFlags==0.
   16669  */
   16670     lbu    a3, offThread_breakFlags(rSELF)
   16671     la     rBIX, dvmAsmInstructionStart + (179 * 128)
   16672     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16673     bnez   a3, 1f
   16674     jr     rBIX            # nothing to do - jump to real handler
   16675 1:
   16676     EXPORT_PC()
   16677     move   a0, rPC         # arg0
   16678     move   a1, rFP         # arg1
   16679     move   a2, rSELF       # arg2
   16680     JAL(dvmCheckBefore)
   16681     jr     rBIX
   16682 
   16683 /* ------------------------------ */
   16684     .balign 128
   16685 .L_ALT_OP_REM_INT_2ADDR: /* 0xb4 */
   16686 /* File: mips/alt_stub.S */
   16687 /*
   16688  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16689  * any interesting requests and then jump to the real instruction
   16690  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16691  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16692  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16693  * bail to the real handler if breakFlags==0.
   16694  */
   16695     lbu    a3, offThread_breakFlags(rSELF)
   16696     la     rBIX, dvmAsmInstructionStart + (180 * 128)
   16697     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16698     bnez   a3, 1f
   16699     jr     rBIX            # nothing to do - jump to real handler
   16700 1:
   16701     EXPORT_PC()
   16702     move   a0, rPC         # arg0
   16703     move   a1, rFP         # arg1
   16704     move   a2, rSELF       # arg2
   16705     JAL(dvmCheckBefore)
   16706     jr     rBIX
   16707 
   16708 /* ------------------------------ */
   16709     .balign 128
   16710 .L_ALT_OP_AND_INT_2ADDR: /* 0xb5 */
   16711 /* File: mips/alt_stub.S */
   16712 /*
   16713  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16714  * any interesting requests and then jump to the real instruction
   16715  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16716  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16717  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16718  * bail to the real handler if breakFlags==0.
   16719  */
   16720     lbu    a3, offThread_breakFlags(rSELF)
   16721     la     rBIX, dvmAsmInstructionStart + (181 * 128)
   16722     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16723     bnez   a3, 1f
   16724     jr     rBIX            # nothing to do - jump to real handler
   16725 1:
   16726     EXPORT_PC()
   16727     move   a0, rPC         # arg0
   16728     move   a1, rFP         # arg1
   16729     move   a2, rSELF       # arg2
   16730     JAL(dvmCheckBefore)
   16731     jr     rBIX
   16732 
   16733 /* ------------------------------ */
   16734     .balign 128
   16735 .L_ALT_OP_OR_INT_2ADDR: /* 0xb6 */
   16736 /* File: mips/alt_stub.S */
   16737 /*
   16738  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16739  * any interesting requests and then jump to the real instruction
   16740  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16741  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16742  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16743  * bail to the real handler if breakFlags==0.
   16744  */
   16745     lbu    a3, offThread_breakFlags(rSELF)
   16746     la     rBIX, dvmAsmInstructionStart + (182 * 128)
   16747     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16748     bnez   a3, 1f
   16749     jr     rBIX            # nothing to do - jump to real handler
   16750 1:
   16751     EXPORT_PC()
   16752     move   a0, rPC         # arg0
   16753     move   a1, rFP         # arg1
   16754     move   a2, rSELF       # arg2
   16755     JAL(dvmCheckBefore)
   16756     jr     rBIX
   16757 
   16758 /* ------------------------------ */
   16759     .balign 128
   16760 .L_ALT_OP_XOR_INT_2ADDR: /* 0xb7 */
   16761 /* File: mips/alt_stub.S */
   16762 /*
   16763  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16764  * any interesting requests and then jump to the real instruction
   16765  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16766  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16767  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16768  * bail to the real handler if breakFlags==0.
   16769  */
   16770     lbu    a3, offThread_breakFlags(rSELF)
   16771     la     rBIX, dvmAsmInstructionStart + (183 * 128)
   16772     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16773     bnez   a3, 1f
   16774     jr     rBIX            # nothing to do - jump to real handler
   16775 1:
   16776     EXPORT_PC()
   16777     move   a0, rPC         # arg0
   16778     move   a1, rFP         # arg1
   16779     move   a2, rSELF       # arg2
   16780     JAL(dvmCheckBefore)
   16781     jr     rBIX
   16782 
   16783 /* ------------------------------ */
   16784     .balign 128
   16785 .L_ALT_OP_SHL_INT_2ADDR: /* 0xb8 */
   16786 /* File: mips/alt_stub.S */
   16787 /*
   16788  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16789  * any interesting requests and then jump to the real instruction
   16790  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16791  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16792  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16793  * bail to the real handler if breakFlags==0.
   16794  */
   16795     lbu    a3, offThread_breakFlags(rSELF)
   16796     la     rBIX, dvmAsmInstructionStart + (184 * 128)
   16797     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16798     bnez   a3, 1f
   16799     jr     rBIX            # nothing to do - jump to real handler
   16800 1:
   16801     EXPORT_PC()
   16802     move   a0, rPC         # arg0
   16803     move   a1, rFP         # arg1
   16804     move   a2, rSELF       # arg2
   16805     JAL(dvmCheckBefore)
   16806     jr     rBIX
   16807 
   16808 /* ------------------------------ */
   16809     .balign 128
   16810 .L_ALT_OP_SHR_INT_2ADDR: /* 0xb9 */
   16811 /* File: mips/alt_stub.S */
   16812 /*
   16813  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16814  * any interesting requests and then jump to the real instruction
   16815  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16816  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16817  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16818  * bail to the real handler if breakFlags==0.
   16819  */
   16820     lbu    a3, offThread_breakFlags(rSELF)
   16821     la     rBIX, dvmAsmInstructionStart + (185 * 128)
   16822     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16823     bnez   a3, 1f
   16824     jr     rBIX            # nothing to do - jump to real handler
   16825 1:
   16826     EXPORT_PC()
   16827     move   a0, rPC         # arg0
   16828     move   a1, rFP         # arg1
   16829     move   a2, rSELF       # arg2
   16830     JAL(dvmCheckBefore)
   16831     jr     rBIX
   16832 
   16833 /* ------------------------------ */
   16834     .balign 128
   16835 .L_ALT_OP_USHR_INT_2ADDR: /* 0xba */
   16836 /* File: mips/alt_stub.S */
   16837 /*
   16838  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16839  * any interesting requests and then jump to the real instruction
   16840  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16841  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16842  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16843  * bail to the real handler if breakFlags==0.
   16844  */
   16845     lbu    a3, offThread_breakFlags(rSELF)
   16846     la     rBIX, dvmAsmInstructionStart + (186 * 128)
   16847     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16848     bnez   a3, 1f
   16849     jr     rBIX            # nothing to do - jump to real handler
   16850 1:
   16851     EXPORT_PC()
   16852     move   a0, rPC         # arg0
   16853     move   a1, rFP         # arg1
   16854     move   a2, rSELF       # arg2
   16855     JAL(dvmCheckBefore)
   16856     jr     rBIX
   16857 
   16858 /* ------------------------------ */
   16859     .balign 128
   16860 .L_ALT_OP_ADD_LONG_2ADDR: /* 0xbb */
   16861 /* File: mips/alt_stub.S */
   16862 /*
   16863  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16864  * any interesting requests and then jump to the real instruction
   16865  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16866  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16867  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16868  * bail to the real handler if breakFlags==0.
   16869  */
   16870     lbu    a3, offThread_breakFlags(rSELF)
   16871     la     rBIX, dvmAsmInstructionStart + (187 * 128)
   16872     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16873     bnez   a3, 1f
   16874     jr     rBIX            # nothing to do - jump to real handler
   16875 1:
   16876     EXPORT_PC()
   16877     move   a0, rPC         # arg0
   16878     move   a1, rFP         # arg1
   16879     move   a2, rSELF       # arg2
   16880     JAL(dvmCheckBefore)
   16881     jr     rBIX
   16882 
   16883 /* ------------------------------ */
   16884     .balign 128
   16885 .L_ALT_OP_SUB_LONG_2ADDR: /* 0xbc */
   16886 /* File: mips/alt_stub.S */
   16887 /*
   16888  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16889  * any interesting requests and then jump to the real instruction
   16890  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16891  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16892  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16893  * bail to the real handler if breakFlags==0.
   16894  */
   16895     lbu    a3, offThread_breakFlags(rSELF)
   16896     la     rBIX, dvmAsmInstructionStart + (188 * 128)
   16897     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16898     bnez   a3, 1f
   16899     jr     rBIX            # nothing to do - jump to real handler
   16900 1:
   16901     EXPORT_PC()
   16902     move   a0, rPC         # arg0
   16903     move   a1, rFP         # arg1
   16904     move   a2, rSELF       # arg2
   16905     JAL(dvmCheckBefore)
   16906     jr     rBIX
   16907 
   16908 /* ------------------------------ */
   16909     .balign 128
   16910 .L_ALT_OP_MUL_LONG_2ADDR: /* 0xbd */
   16911 /* File: mips/alt_stub.S */
   16912 /*
   16913  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16914  * any interesting requests and then jump to the real instruction
   16915  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16916  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16917  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16918  * bail to the real handler if breakFlags==0.
   16919  */
   16920     lbu    a3, offThread_breakFlags(rSELF)
   16921     la     rBIX, dvmAsmInstructionStart + (189 * 128)
   16922     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16923     bnez   a3, 1f
   16924     jr     rBIX            # nothing to do - jump to real handler
   16925 1:
   16926     EXPORT_PC()
   16927     move   a0, rPC         # arg0
   16928     move   a1, rFP         # arg1
   16929     move   a2, rSELF       # arg2
   16930     JAL(dvmCheckBefore)
   16931     jr     rBIX
   16932 
   16933 /* ------------------------------ */
   16934     .balign 128
   16935 .L_ALT_OP_DIV_LONG_2ADDR: /* 0xbe */
   16936 /* File: mips/alt_stub.S */
   16937 /*
   16938  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16939  * any interesting requests and then jump to the real instruction
   16940  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16941  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16942  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16943  * bail to the real handler if breakFlags==0.
   16944  */
   16945     lbu    a3, offThread_breakFlags(rSELF)
   16946     la     rBIX, dvmAsmInstructionStart + (190 * 128)
   16947     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16948     bnez   a3, 1f
   16949     jr     rBIX            # nothing to do - jump to real handler
   16950 1:
   16951     EXPORT_PC()
   16952     move   a0, rPC         # arg0
   16953     move   a1, rFP         # arg1
   16954     move   a2, rSELF       # arg2
   16955     JAL(dvmCheckBefore)
   16956     jr     rBIX
   16957 
   16958 /* ------------------------------ */
   16959     .balign 128
   16960 .L_ALT_OP_REM_LONG_2ADDR: /* 0xbf */
   16961 /* File: mips/alt_stub.S */
   16962 /*
   16963  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16964  * any interesting requests and then jump to the real instruction
   16965  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16966  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16967  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16968  * bail to the real handler if breakFlags==0.
   16969  */
   16970     lbu    a3, offThread_breakFlags(rSELF)
   16971     la     rBIX, dvmAsmInstructionStart + (191 * 128)
   16972     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16973     bnez   a3, 1f
   16974     jr     rBIX            # nothing to do - jump to real handler
   16975 1:
   16976     EXPORT_PC()
   16977     move   a0, rPC         # arg0
   16978     move   a1, rFP         # arg1
   16979     move   a2, rSELF       # arg2
   16980     JAL(dvmCheckBefore)
   16981     jr     rBIX
   16982 
   16983 /* ------------------------------ */
   16984     .balign 128
   16985 .L_ALT_OP_AND_LONG_2ADDR: /* 0xc0 */
   16986 /* File: mips/alt_stub.S */
   16987 /*
   16988  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   16989  * any interesting requests and then jump to the real instruction
   16990  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   16991  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   16992  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   16993  * bail to the real handler if breakFlags==0.
   16994  */
   16995     lbu    a3, offThread_breakFlags(rSELF)
   16996     la     rBIX, dvmAsmInstructionStart + (192 * 128)
   16997     lw     rIBASE, offThread_curHandlerTable(rSELF)
   16998     bnez   a3, 1f
   16999     jr     rBIX            # nothing to do - jump to real handler
   17000 1:
   17001     EXPORT_PC()
   17002     move   a0, rPC         # arg0
   17003     move   a1, rFP         # arg1
   17004     move   a2, rSELF       # arg2
   17005     JAL(dvmCheckBefore)
   17006     jr     rBIX
   17007 
   17008 /* ------------------------------ */
   17009     .balign 128
   17010 .L_ALT_OP_OR_LONG_2ADDR: /* 0xc1 */
   17011 /* File: mips/alt_stub.S */
   17012 /*
   17013  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17014  * any interesting requests and then jump to the real instruction
   17015  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17016  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17017  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17018  * bail to the real handler if breakFlags==0.
   17019  */
   17020     lbu    a3, offThread_breakFlags(rSELF)
   17021     la     rBIX, dvmAsmInstructionStart + (193 * 128)
   17022     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17023     bnez   a3, 1f
   17024     jr     rBIX            # nothing to do - jump to real handler
   17025 1:
   17026     EXPORT_PC()
   17027     move   a0, rPC         # arg0
   17028     move   a1, rFP         # arg1
   17029     move   a2, rSELF       # arg2
   17030     JAL(dvmCheckBefore)
   17031     jr     rBIX
   17032 
   17033 /* ------------------------------ */
   17034     .balign 128
   17035 .L_ALT_OP_XOR_LONG_2ADDR: /* 0xc2 */
   17036 /* File: mips/alt_stub.S */
   17037 /*
   17038  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17039  * any interesting requests and then jump to the real instruction
   17040  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17041  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17042  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17043  * bail to the real handler if breakFlags==0.
   17044  */
   17045     lbu    a3, offThread_breakFlags(rSELF)
   17046     la     rBIX, dvmAsmInstructionStart + (194 * 128)
   17047     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17048     bnez   a3, 1f
   17049     jr     rBIX            # nothing to do - jump to real handler
   17050 1:
   17051     EXPORT_PC()
   17052     move   a0, rPC         # arg0
   17053     move   a1, rFP         # arg1
   17054     move   a2, rSELF       # arg2
   17055     JAL(dvmCheckBefore)
   17056     jr     rBIX
   17057 
   17058 /* ------------------------------ */
   17059     .balign 128
   17060 .L_ALT_OP_SHL_LONG_2ADDR: /* 0xc3 */
   17061 /* File: mips/alt_stub.S */
   17062 /*
   17063  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17064  * any interesting requests and then jump to the real instruction
   17065  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17066  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17067  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17068  * bail to the real handler if breakFlags==0.
   17069  */
   17070     lbu    a3, offThread_breakFlags(rSELF)
   17071     la     rBIX, dvmAsmInstructionStart + (195 * 128)
   17072     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17073     bnez   a3, 1f
   17074     jr     rBIX            # nothing to do - jump to real handler
   17075 1:
   17076     EXPORT_PC()
   17077     move   a0, rPC         # arg0
   17078     move   a1, rFP         # arg1
   17079     move   a2, rSELF       # arg2
   17080     JAL(dvmCheckBefore)
   17081     jr     rBIX
   17082 
   17083 /* ------------------------------ */
   17084     .balign 128
   17085 .L_ALT_OP_SHR_LONG_2ADDR: /* 0xc4 */
   17086 /* File: mips/alt_stub.S */
   17087 /*
   17088  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17089  * any interesting requests and then jump to the real instruction
   17090  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17091  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17092  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17093  * bail to the real handler if breakFlags==0.
   17094  */
   17095     lbu    a3, offThread_breakFlags(rSELF)
   17096     la     rBIX, dvmAsmInstructionStart + (196 * 128)
   17097     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17098     bnez   a3, 1f
   17099     jr     rBIX            # nothing to do - jump to real handler
   17100 1:
   17101     EXPORT_PC()
   17102     move   a0, rPC         # arg0
   17103     move   a1, rFP         # arg1
   17104     move   a2, rSELF       # arg2
   17105     JAL(dvmCheckBefore)
   17106     jr     rBIX
   17107 
   17108 /* ------------------------------ */
   17109     .balign 128
   17110 .L_ALT_OP_USHR_LONG_2ADDR: /* 0xc5 */
   17111 /* File: mips/alt_stub.S */
   17112 /*
   17113  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17114  * any interesting requests and then jump to the real instruction
   17115  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17116  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17117  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17118  * bail to the real handler if breakFlags==0.
   17119  */
   17120     lbu    a3, offThread_breakFlags(rSELF)
   17121     la     rBIX, dvmAsmInstructionStart + (197 * 128)
   17122     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17123     bnez   a3, 1f
   17124     jr     rBIX            # nothing to do - jump to real handler
   17125 1:
   17126     EXPORT_PC()
   17127     move   a0, rPC         # arg0
   17128     move   a1, rFP         # arg1
   17129     move   a2, rSELF       # arg2
   17130     JAL(dvmCheckBefore)
   17131     jr     rBIX
   17132 
   17133 /* ------------------------------ */
   17134     .balign 128
   17135 .L_ALT_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
   17136 /* File: mips/alt_stub.S */
   17137 /*
   17138  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17139  * any interesting requests and then jump to the real instruction
   17140  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17141  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17142  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17143  * bail to the real handler if breakFlags==0.
   17144  */
   17145     lbu    a3, offThread_breakFlags(rSELF)
   17146     la     rBIX, dvmAsmInstructionStart + (198 * 128)
   17147     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17148     bnez   a3, 1f
   17149     jr     rBIX            # nothing to do - jump to real handler
   17150 1:
   17151     EXPORT_PC()
   17152     move   a0, rPC         # arg0
   17153     move   a1, rFP         # arg1
   17154     move   a2, rSELF       # arg2
   17155     JAL(dvmCheckBefore)
   17156     jr     rBIX
   17157 
   17158 /* ------------------------------ */
   17159     .balign 128
   17160 .L_ALT_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
   17161 /* File: mips/alt_stub.S */
   17162 /*
   17163  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17164  * any interesting requests and then jump to the real instruction
   17165  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17166  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17167  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17168  * bail to the real handler if breakFlags==0.
   17169  */
   17170     lbu    a3, offThread_breakFlags(rSELF)
   17171     la     rBIX, dvmAsmInstructionStart + (199 * 128)
   17172     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17173     bnez   a3, 1f
   17174     jr     rBIX            # nothing to do - jump to real handler
   17175 1:
   17176     EXPORT_PC()
   17177     move   a0, rPC         # arg0
   17178     move   a1, rFP         # arg1
   17179     move   a2, rSELF       # arg2
   17180     JAL(dvmCheckBefore)
   17181     jr     rBIX
   17182 
   17183 /* ------------------------------ */
   17184     .balign 128
   17185 .L_ALT_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
   17186 /* File: mips/alt_stub.S */
   17187 /*
   17188  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17189  * any interesting requests and then jump to the real instruction
   17190  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17191  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17192  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17193  * bail to the real handler if breakFlags==0.
   17194  */
   17195     lbu    a3, offThread_breakFlags(rSELF)
   17196     la     rBIX, dvmAsmInstructionStart + (200 * 128)
   17197     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17198     bnez   a3, 1f
   17199     jr     rBIX            # nothing to do - jump to real handler
   17200 1:
   17201     EXPORT_PC()
   17202     move   a0, rPC         # arg0
   17203     move   a1, rFP         # arg1
   17204     move   a2, rSELF       # arg2
   17205     JAL(dvmCheckBefore)
   17206     jr     rBIX
   17207 
   17208 /* ------------------------------ */
   17209     .balign 128
   17210 .L_ALT_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
   17211 /* File: mips/alt_stub.S */
   17212 /*
   17213  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17214  * any interesting requests and then jump to the real instruction
   17215  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17216  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17217  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17218  * bail to the real handler if breakFlags==0.
   17219  */
   17220     lbu    a3, offThread_breakFlags(rSELF)
   17221     la     rBIX, dvmAsmInstructionStart + (201 * 128)
   17222     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17223     bnez   a3, 1f
   17224     jr     rBIX            # nothing to do - jump to real handler
   17225 1:
   17226     EXPORT_PC()
   17227     move   a0, rPC         # arg0
   17228     move   a1, rFP         # arg1
   17229     move   a2, rSELF       # arg2
   17230     JAL(dvmCheckBefore)
   17231     jr     rBIX
   17232 
   17233 /* ------------------------------ */
   17234     .balign 128
   17235 .L_ALT_OP_REM_FLOAT_2ADDR: /* 0xca */
   17236 /* File: mips/alt_stub.S */
   17237 /*
   17238  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17239  * any interesting requests and then jump to the real instruction
   17240  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17241  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17242  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17243  * bail to the real handler if breakFlags==0.
   17244  */
   17245     lbu    a3, offThread_breakFlags(rSELF)
   17246     la     rBIX, dvmAsmInstructionStart + (202 * 128)
   17247     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17248     bnez   a3, 1f
   17249     jr     rBIX            # nothing to do - jump to real handler
   17250 1:
   17251     EXPORT_PC()
   17252     move   a0, rPC         # arg0
   17253     move   a1, rFP         # arg1
   17254     move   a2, rSELF       # arg2
   17255     JAL(dvmCheckBefore)
   17256     jr     rBIX
   17257 
   17258 /* ------------------------------ */
   17259     .balign 128
   17260 .L_ALT_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
   17261 /* File: mips/alt_stub.S */
   17262 /*
   17263  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17264  * any interesting requests and then jump to the real instruction
   17265  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17266  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17267  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17268  * bail to the real handler if breakFlags==0.
   17269  */
   17270     lbu    a3, offThread_breakFlags(rSELF)
   17271     la     rBIX, dvmAsmInstructionStart + (203 * 128)
   17272     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17273     bnez   a3, 1f
   17274     jr     rBIX            # nothing to do - jump to real handler
   17275 1:
   17276     EXPORT_PC()
   17277     move   a0, rPC         # arg0
   17278     move   a1, rFP         # arg1
   17279     move   a2, rSELF       # arg2
   17280     JAL(dvmCheckBefore)
   17281     jr     rBIX
   17282 
   17283 /* ------------------------------ */
   17284     .balign 128
   17285 .L_ALT_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
   17286 /* File: mips/alt_stub.S */
   17287 /*
   17288  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17289  * any interesting requests and then jump to the real instruction
   17290  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17291  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17292  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17293  * bail to the real handler if breakFlags==0.
   17294  */
   17295     lbu    a3, offThread_breakFlags(rSELF)
   17296     la     rBIX, dvmAsmInstructionStart + (204 * 128)
   17297     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17298     bnez   a3, 1f
   17299     jr     rBIX            # nothing to do - jump to real handler
   17300 1:
   17301     EXPORT_PC()
   17302     move   a0, rPC         # arg0
   17303     move   a1, rFP         # arg1
   17304     move   a2, rSELF       # arg2
   17305     JAL(dvmCheckBefore)
   17306     jr     rBIX
   17307 
   17308 /* ------------------------------ */
   17309     .balign 128
   17310 .L_ALT_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
   17311 /* File: mips/alt_stub.S */
   17312 /*
   17313  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17314  * any interesting requests and then jump to the real instruction
   17315  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17316  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17317  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17318  * bail to the real handler if breakFlags==0.
   17319  */
   17320     lbu    a3, offThread_breakFlags(rSELF)
   17321     la     rBIX, dvmAsmInstructionStart + (205 * 128)
   17322     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17323     bnez   a3, 1f
   17324     jr     rBIX            # nothing to do - jump to real handler
   17325 1:
   17326     EXPORT_PC()
   17327     move   a0, rPC         # arg0
   17328     move   a1, rFP         # arg1
   17329     move   a2, rSELF       # arg2
   17330     JAL(dvmCheckBefore)
   17331     jr     rBIX
   17332 
   17333 /* ------------------------------ */
   17334     .balign 128
   17335 .L_ALT_OP_DIV_DOUBLE_2ADDR: /* 0xce */
   17336 /* File: mips/alt_stub.S */
   17337 /*
   17338  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17339  * any interesting requests and then jump to the real instruction
   17340  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17341  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17342  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17343  * bail to the real handler if breakFlags==0.
   17344  */
   17345     lbu    a3, offThread_breakFlags(rSELF)
   17346     la     rBIX, dvmAsmInstructionStart + (206 * 128)
   17347     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17348     bnez   a3, 1f
   17349     jr     rBIX            # nothing to do - jump to real handler
   17350 1:
   17351     EXPORT_PC()
   17352     move   a0, rPC         # arg0
   17353     move   a1, rFP         # arg1
   17354     move   a2, rSELF       # arg2
   17355     JAL(dvmCheckBefore)
   17356     jr     rBIX
   17357 
   17358 /* ------------------------------ */
   17359     .balign 128
   17360 .L_ALT_OP_REM_DOUBLE_2ADDR: /* 0xcf */
   17361 /* File: mips/alt_stub.S */
   17362 /*
   17363  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17364  * any interesting requests and then jump to the real instruction
   17365  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17366  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17367  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17368  * bail to the real handler if breakFlags==0.
   17369  */
   17370     lbu    a3, offThread_breakFlags(rSELF)
   17371     la     rBIX, dvmAsmInstructionStart + (207 * 128)
   17372     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17373     bnez   a3, 1f
   17374     jr     rBIX            # nothing to do - jump to real handler
   17375 1:
   17376     EXPORT_PC()
   17377     move   a0, rPC         # arg0
   17378     move   a1, rFP         # arg1
   17379     move   a2, rSELF       # arg2
   17380     JAL(dvmCheckBefore)
   17381     jr     rBIX
   17382 
   17383 /* ------------------------------ */
   17384     .balign 128
   17385 .L_ALT_OP_ADD_INT_LIT16: /* 0xd0 */
   17386 /* File: mips/alt_stub.S */
   17387 /*
   17388  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17389  * any interesting requests and then jump to the real instruction
   17390  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17391  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17392  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17393  * bail to the real handler if breakFlags==0.
   17394  */
   17395     lbu    a3, offThread_breakFlags(rSELF)
   17396     la     rBIX, dvmAsmInstructionStart + (208 * 128)
   17397     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17398     bnez   a3, 1f
   17399     jr     rBIX            # nothing to do - jump to real handler
   17400 1:
   17401     EXPORT_PC()
   17402     move   a0, rPC         # arg0
   17403     move   a1, rFP         # arg1
   17404     move   a2, rSELF       # arg2
   17405     JAL(dvmCheckBefore)
   17406     jr     rBIX
   17407 
   17408 /* ------------------------------ */
   17409     .balign 128
   17410 .L_ALT_OP_RSUB_INT: /* 0xd1 */
   17411 /* File: mips/alt_stub.S */
   17412 /*
   17413  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17414  * any interesting requests and then jump to the real instruction
   17415  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17416  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17417  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17418  * bail to the real handler if breakFlags==0.
   17419  */
   17420     lbu    a3, offThread_breakFlags(rSELF)
   17421     la     rBIX, dvmAsmInstructionStart + (209 * 128)
   17422     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17423     bnez   a3, 1f
   17424     jr     rBIX            # nothing to do - jump to real handler
   17425 1:
   17426     EXPORT_PC()
   17427     move   a0, rPC         # arg0
   17428     move   a1, rFP         # arg1
   17429     move   a2, rSELF       # arg2
   17430     JAL(dvmCheckBefore)
   17431     jr     rBIX
   17432 
   17433 /* ------------------------------ */
   17434     .balign 128
   17435 .L_ALT_OP_MUL_INT_LIT16: /* 0xd2 */
   17436 /* File: mips/alt_stub.S */
   17437 /*
   17438  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17439  * any interesting requests and then jump to the real instruction
   17440  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17441  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17442  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17443  * bail to the real handler if breakFlags==0.
   17444  */
   17445     lbu    a3, offThread_breakFlags(rSELF)
   17446     la     rBIX, dvmAsmInstructionStart + (210 * 128)
   17447     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17448     bnez   a3, 1f
   17449     jr     rBIX            # nothing to do - jump to real handler
   17450 1:
   17451     EXPORT_PC()
   17452     move   a0, rPC         # arg0
   17453     move   a1, rFP         # arg1
   17454     move   a2, rSELF       # arg2
   17455     JAL(dvmCheckBefore)
   17456     jr     rBIX
   17457 
   17458 /* ------------------------------ */
   17459     .balign 128
   17460 .L_ALT_OP_DIV_INT_LIT16: /* 0xd3 */
   17461 /* File: mips/alt_stub.S */
   17462 /*
   17463  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17464  * any interesting requests and then jump to the real instruction
   17465  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17466  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17467  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17468  * bail to the real handler if breakFlags==0.
   17469  */
   17470     lbu    a3, offThread_breakFlags(rSELF)
   17471     la     rBIX, dvmAsmInstructionStart + (211 * 128)
   17472     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17473     bnez   a3, 1f
   17474     jr     rBIX            # nothing to do - jump to real handler
   17475 1:
   17476     EXPORT_PC()
   17477     move   a0, rPC         # arg0
   17478     move   a1, rFP         # arg1
   17479     move   a2, rSELF       # arg2
   17480     JAL(dvmCheckBefore)
   17481     jr     rBIX
   17482 
   17483 /* ------------------------------ */
   17484     .balign 128
   17485 .L_ALT_OP_REM_INT_LIT16: /* 0xd4 */
   17486 /* File: mips/alt_stub.S */
   17487 /*
   17488  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17489  * any interesting requests and then jump to the real instruction
   17490  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17491  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17492  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17493  * bail to the real handler if breakFlags==0.
   17494  */
   17495     lbu    a3, offThread_breakFlags(rSELF)
   17496     la     rBIX, dvmAsmInstructionStart + (212 * 128)
   17497     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17498     bnez   a3, 1f
   17499     jr     rBIX            # nothing to do - jump to real handler
   17500 1:
   17501     EXPORT_PC()
   17502     move   a0, rPC         # arg0
   17503     move   a1, rFP         # arg1
   17504     move   a2, rSELF       # arg2
   17505     JAL(dvmCheckBefore)
   17506     jr     rBIX
   17507 
   17508 /* ------------------------------ */
   17509     .balign 128
   17510 .L_ALT_OP_AND_INT_LIT16: /* 0xd5 */
   17511 /* File: mips/alt_stub.S */
   17512 /*
   17513  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17514  * any interesting requests and then jump to the real instruction
   17515  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17516  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17517  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17518  * bail to the real handler if breakFlags==0.
   17519  */
   17520     lbu    a3, offThread_breakFlags(rSELF)
   17521     la     rBIX, dvmAsmInstructionStart + (213 * 128)
   17522     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17523     bnez   a3, 1f
   17524     jr     rBIX            # nothing to do - jump to real handler
   17525 1:
   17526     EXPORT_PC()
   17527     move   a0, rPC         # arg0
   17528     move   a1, rFP         # arg1
   17529     move   a2, rSELF       # arg2
   17530     JAL(dvmCheckBefore)
   17531     jr     rBIX
   17532 
   17533 /* ------------------------------ */
   17534     .balign 128
   17535 .L_ALT_OP_OR_INT_LIT16: /* 0xd6 */
   17536 /* File: mips/alt_stub.S */
   17537 /*
   17538  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17539  * any interesting requests and then jump to the real instruction
   17540  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17541  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17542  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17543  * bail to the real handler if breakFlags==0.
   17544  */
   17545     lbu    a3, offThread_breakFlags(rSELF)
   17546     la     rBIX, dvmAsmInstructionStart + (214 * 128)
   17547     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17548     bnez   a3, 1f
   17549     jr     rBIX            # nothing to do - jump to real handler
   17550 1:
   17551     EXPORT_PC()
   17552     move   a0, rPC         # arg0
   17553     move   a1, rFP         # arg1
   17554     move   a2, rSELF       # arg2
   17555     JAL(dvmCheckBefore)
   17556     jr     rBIX
   17557 
   17558 /* ------------------------------ */
   17559     .balign 128
   17560 .L_ALT_OP_XOR_INT_LIT16: /* 0xd7 */
   17561 /* File: mips/alt_stub.S */
   17562 /*
   17563  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17564  * any interesting requests and then jump to the real instruction
   17565  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17566  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17567  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17568  * bail to the real handler if breakFlags==0.
   17569  */
   17570     lbu    a3, offThread_breakFlags(rSELF)
   17571     la     rBIX, dvmAsmInstructionStart + (215 * 128)
   17572     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17573     bnez   a3, 1f
   17574     jr     rBIX            # nothing to do - jump to real handler
   17575 1:
   17576     EXPORT_PC()
   17577     move   a0, rPC         # arg0
   17578     move   a1, rFP         # arg1
   17579     move   a2, rSELF       # arg2
   17580     JAL(dvmCheckBefore)
   17581     jr     rBIX
   17582 
   17583 /* ------------------------------ */
   17584     .balign 128
   17585 .L_ALT_OP_ADD_INT_LIT8: /* 0xd8 */
   17586 /* File: mips/alt_stub.S */
   17587 /*
   17588  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17589  * any interesting requests and then jump to the real instruction
   17590  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17591  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17592  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17593  * bail to the real handler if breakFlags==0.
   17594  */
   17595     lbu    a3, offThread_breakFlags(rSELF)
   17596     la     rBIX, dvmAsmInstructionStart + (216 * 128)
   17597     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17598     bnez   a3, 1f
   17599     jr     rBIX            # nothing to do - jump to real handler
   17600 1:
   17601     EXPORT_PC()
   17602     move   a0, rPC         # arg0
   17603     move   a1, rFP         # arg1
   17604     move   a2, rSELF       # arg2
   17605     JAL(dvmCheckBefore)
   17606     jr     rBIX
   17607 
   17608 /* ------------------------------ */
   17609     .balign 128
   17610 .L_ALT_OP_RSUB_INT_LIT8: /* 0xd9 */
   17611 /* File: mips/alt_stub.S */
   17612 /*
   17613  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17614  * any interesting requests and then jump to the real instruction
   17615  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17616  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17617  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17618  * bail to the real handler if breakFlags==0.
   17619  */
   17620     lbu    a3, offThread_breakFlags(rSELF)
   17621     la     rBIX, dvmAsmInstructionStart + (217 * 128)
   17622     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17623     bnez   a3, 1f
   17624     jr     rBIX            # nothing to do - jump to real handler
   17625 1:
   17626     EXPORT_PC()
   17627     move   a0, rPC         # arg0
   17628     move   a1, rFP         # arg1
   17629     move   a2, rSELF       # arg2
   17630     JAL(dvmCheckBefore)
   17631     jr     rBIX
   17632 
   17633 /* ------------------------------ */
   17634     .balign 128
   17635 .L_ALT_OP_MUL_INT_LIT8: /* 0xda */
   17636 /* File: mips/alt_stub.S */
   17637 /*
   17638  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17639  * any interesting requests and then jump to the real instruction
   17640  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17641  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17642  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17643  * bail to the real handler if breakFlags==0.
   17644  */
   17645     lbu    a3, offThread_breakFlags(rSELF)
   17646     la     rBIX, dvmAsmInstructionStart + (218 * 128)
   17647     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17648     bnez   a3, 1f
   17649     jr     rBIX            # nothing to do - jump to real handler
   17650 1:
   17651     EXPORT_PC()
   17652     move   a0, rPC         # arg0
   17653     move   a1, rFP         # arg1
   17654     move   a2, rSELF       # arg2
   17655     JAL(dvmCheckBefore)
   17656     jr     rBIX
   17657 
   17658 /* ------------------------------ */
   17659     .balign 128
   17660 .L_ALT_OP_DIV_INT_LIT8: /* 0xdb */
   17661 /* File: mips/alt_stub.S */
   17662 /*
   17663  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17664  * any interesting requests and then jump to the real instruction
   17665  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17666  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17667  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17668  * bail to the real handler if breakFlags==0.
   17669  */
   17670     lbu    a3, offThread_breakFlags(rSELF)
   17671     la     rBIX, dvmAsmInstructionStart + (219 * 128)
   17672     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17673     bnez   a3, 1f
   17674     jr     rBIX            # nothing to do - jump to real handler
   17675 1:
   17676     EXPORT_PC()
   17677     move   a0, rPC         # arg0
   17678     move   a1, rFP         # arg1
   17679     move   a2, rSELF       # arg2
   17680     JAL(dvmCheckBefore)
   17681     jr     rBIX
   17682 
   17683 /* ------------------------------ */
   17684     .balign 128
   17685 .L_ALT_OP_REM_INT_LIT8: /* 0xdc */
   17686 /* File: mips/alt_stub.S */
   17687 /*
   17688  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17689  * any interesting requests and then jump to the real instruction
   17690  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17691  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17692  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17693  * bail to the real handler if breakFlags==0.
   17694  */
   17695     lbu    a3, offThread_breakFlags(rSELF)
   17696     la     rBIX, dvmAsmInstructionStart + (220 * 128)
   17697     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17698     bnez   a3, 1f
   17699     jr     rBIX            # nothing to do - jump to real handler
   17700 1:
   17701     EXPORT_PC()
   17702     move   a0, rPC         # arg0
   17703     move   a1, rFP         # arg1
   17704     move   a2, rSELF       # arg2
   17705     JAL(dvmCheckBefore)
   17706     jr     rBIX
   17707 
   17708 /* ------------------------------ */
   17709     .balign 128
   17710 .L_ALT_OP_AND_INT_LIT8: /* 0xdd */
   17711 /* File: mips/alt_stub.S */
   17712 /*
   17713  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17714  * any interesting requests and then jump to the real instruction
   17715  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17716  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17717  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17718  * bail to the real handler if breakFlags==0.
   17719  */
   17720     lbu    a3, offThread_breakFlags(rSELF)
   17721     la     rBIX, dvmAsmInstructionStart + (221 * 128)
   17722     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17723     bnez   a3, 1f
   17724     jr     rBIX            # nothing to do - jump to real handler
   17725 1:
   17726     EXPORT_PC()
   17727     move   a0, rPC         # arg0
   17728     move   a1, rFP         # arg1
   17729     move   a2, rSELF       # arg2
   17730     JAL(dvmCheckBefore)
   17731     jr     rBIX
   17732 
   17733 /* ------------------------------ */
   17734     .balign 128
   17735 .L_ALT_OP_OR_INT_LIT8: /* 0xde */
   17736 /* File: mips/alt_stub.S */
   17737 /*
   17738  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17739  * any interesting requests and then jump to the real instruction
   17740  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17741  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17742  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17743  * bail to the real handler if breakFlags==0.
   17744  */
   17745     lbu    a3, offThread_breakFlags(rSELF)
   17746     la     rBIX, dvmAsmInstructionStart + (222 * 128)
   17747     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17748     bnez   a3, 1f
   17749     jr     rBIX            # nothing to do - jump to real handler
   17750 1:
   17751     EXPORT_PC()
   17752     move   a0, rPC         # arg0
   17753     move   a1, rFP         # arg1
   17754     move   a2, rSELF       # arg2
   17755     JAL(dvmCheckBefore)
   17756     jr     rBIX
   17757 
   17758 /* ------------------------------ */
   17759     .balign 128
   17760 .L_ALT_OP_XOR_INT_LIT8: /* 0xdf */
   17761 /* File: mips/alt_stub.S */
   17762 /*
   17763  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17764  * any interesting requests and then jump to the real instruction
   17765  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17766  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17767  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17768  * bail to the real handler if breakFlags==0.
   17769  */
   17770     lbu    a3, offThread_breakFlags(rSELF)
   17771     la     rBIX, dvmAsmInstructionStart + (223 * 128)
   17772     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17773     bnez   a3, 1f
   17774     jr     rBIX            # nothing to do - jump to real handler
   17775 1:
   17776     EXPORT_PC()
   17777     move   a0, rPC         # arg0
   17778     move   a1, rFP         # arg1
   17779     move   a2, rSELF       # arg2
   17780     JAL(dvmCheckBefore)
   17781     jr     rBIX
   17782 
   17783 /* ------------------------------ */
   17784     .balign 128
   17785 .L_ALT_OP_SHL_INT_LIT8: /* 0xe0 */
   17786 /* File: mips/alt_stub.S */
   17787 /*
   17788  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17789  * any interesting requests and then jump to the real instruction
   17790  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17791  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17792  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17793  * bail to the real handler if breakFlags==0.
   17794  */
   17795     lbu    a3, offThread_breakFlags(rSELF)
   17796     la     rBIX, dvmAsmInstructionStart + (224 * 128)
   17797     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17798     bnez   a3, 1f
   17799     jr     rBIX            # nothing to do - jump to real handler
   17800 1:
   17801     EXPORT_PC()
   17802     move   a0, rPC         # arg0
   17803     move   a1, rFP         # arg1
   17804     move   a2, rSELF       # arg2
   17805     JAL(dvmCheckBefore)
   17806     jr     rBIX
   17807 
   17808 /* ------------------------------ */
   17809     .balign 128
   17810 .L_ALT_OP_SHR_INT_LIT8: /* 0xe1 */
   17811 /* File: mips/alt_stub.S */
   17812 /*
   17813  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17814  * any interesting requests and then jump to the real instruction
   17815  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17816  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17817  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17818  * bail to the real handler if breakFlags==0.
   17819  */
   17820     lbu    a3, offThread_breakFlags(rSELF)
   17821     la     rBIX, dvmAsmInstructionStart + (225 * 128)
   17822     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17823     bnez   a3, 1f
   17824     jr     rBIX            # nothing to do - jump to real handler
   17825 1:
   17826     EXPORT_PC()
   17827     move   a0, rPC         # arg0
   17828     move   a1, rFP         # arg1
   17829     move   a2, rSELF       # arg2
   17830     JAL(dvmCheckBefore)
   17831     jr     rBIX
   17832 
   17833 /* ------------------------------ */
   17834     .balign 128
   17835 .L_ALT_OP_USHR_INT_LIT8: /* 0xe2 */
   17836 /* File: mips/alt_stub.S */
   17837 /*
   17838  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17839  * any interesting requests and then jump to the real instruction
   17840  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17841  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17842  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17843  * bail to the real handler if breakFlags==0.
   17844  */
   17845     lbu    a3, offThread_breakFlags(rSELF)
   17846     la     rBIX, dvmAsmInstructionStart + (226 * 128)
   17847     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17848     bnez   a3, 1f
   17849     jr     rBIX            # nothing to do - jump to real handler
   17850 1:
   17851     EXPORT_PC()
   17852     move   a0, rPC         # arg0
   17853     move   a1, rFP         # arg1
   17854     move   a2, rSELF       # arg2
   17855     JAL(dvmCheckBefore)
   17856     jr     rBIX
   17857 
   17858 /* ------------------------------ */
   17859     .balign 128
   17860 .L_ALT_OP_IGET_VOLATILE: /* 0xe3 */
   17861 /* File: mips/alt_stub.S */
   17862 /*
   17863  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17864  * any interesting requests and then jump to the real instruction
   17865  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17866  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17867  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17868  * bail to the real handler if breakFlags==0.
   17869  */
   17870     lbu    a3, offThread_breakFlags(rSELF)
   17871     la     rBIX, dvmAsmInstructionStart + (227 * 128)
   17872     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17873     bnez   a3, 1f
   17874     jr     rBIX            # nothing to do - jump to real handler
   17875 1:
   17876     EXPORT_PC()
   17877     move   a0, rPC         # arg0
   17878     move   a1, rFP         # arg1
   17879     move   a2, rSELF       # arg2
   17880     JAL(dvmCheckBefore)
   17881     jr     rBIX
   17882 
   17883 /* ------------------------------ */
   17884     .balign 128
   17885 .L_ALT_OP_IPUT_VOLATILE: /* 0xe4 */
   17886 /* File: mips/alt_stub.S */
   17887 /*
   17888  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17889  * any interesting requests and then jump to the real instruction
   17890  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17891  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17892  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17893  * bail to the real handler if breakFlags==0.
   17894  */
   17895     lbu    a3, offThread_breakFlags(rSELF)
   17896     la     rBIX, dvmAsmInstructionStart + (228 * 128)
   17897     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17898     bnez   a3, 1f
   17899     jr     rBIX            # nothing to do - jump to real handler
   17900 1:
   17901     EXPORT_PC()
   17902     move   a0, rPC         # arg0
   17903     move   a1, rFP         # arg1
   17904     move   a2, rSELF       # arg2
   17905     JAL(dvmCheckBefore)
   17906     jr     rBIX
   17907 
   17908 /* ------------------------------ */
   17909     .balign 128
   17910 .L_ALT_OP_SGET_VOLATILE: /* 0xe5 */
   17911 /* File: mips/alt_stub.S */
   17912 /*
   17913  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17914  * any interesting requests and then jump to the real instruction
   17915  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17916  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17917  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17918  * bail to the real handler if breakFlags==0.
   17919  */
   17920     lbu    a3, offThread_breakFlags(rSELF)
   17921     la     rBIX, dvmAsmInstructionStart + (229 * 128)
   17922     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17923     bnez   a3, 1f
   17924     jr     rBIX            # nothing to do - jump to real handler
   17925 1:
   17926     EXPORT_PC()
   17927     move   a0, rPC         # arg0
   17928     move   a1, rFP         # arg1
   17929     move   a2, rSELF       # arg2
   17930     JAL(dvmCheckBefore)
   17931     jr     rBIX
   17932 
   17933 /* ------------------------------ */
   17934     .balign 128
   17935 .L_ALT_OP_SPUT_VOLATILE: /* 0xe6 */
   17936 /* File: mips/alt_stub.S */
   17937 /*
   17938  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17939  * any interesting requests and then jump to the real instruction
   17940  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17941  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17942  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17943  * bail to the real handler if breakFlags==0.
   17944  */
   17945     lbu    a3, offThread_breakFlags(rSELF)
   17946     la     rBIX, dvmAsmInstructionStart + (230 * 128)
   17947     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17948     bnez   a3, 1f
   17949     jr     rBIX            # nothing to do - jump to real handler
   17950 1:
   17951     EXPORT_PC()
   17952     move   a0, rPC         # arg0
   17953     move   a1, rFP         # arg1
   17954     move   a2, rSELF       # arg2
   17955     JAL(dvmCheckBefore)
   17956     jr     rBIX
   17957 
   17958 /* ------------------------------ */
   17959     .balign 128
   17960 .L_ALT_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
   17961 /* File: mips/alt_stub.S */
   17962 /*
   17963  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17964  * any interesting requests and then jump to the real instruction
   17965  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17966  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17967  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17968  * bail to the real handler if breakFlags==0.
   17969  */
   17970     lbu    a3, offThread_breakFlags(rSELF)
   17971     la     rBIX, dvmAsmInstructionStart + (231 * 128)
   17972     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17973     bnez   a3, 1f
   17974     jr     rBIX            # nothing to do - jump to real handler
   17975 1:
   17976     EXPORT_PC()
   17977     move   a0, rPC         # arg0
   17978     move   a1, rFP         # arg1
   17979     move   a2, rSELF       # arg2
   17980     JAL(dvmCheckBefore)
   17981     jr     rBIX
   17982 
   17983 /* ------------------------------ */
   17984     .balign 128
   17985 .L_ALT_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
   17986 /* File: mips/alt_stub.S */
   17987 /*
   17988  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   17989  * any interesting requests and then jump to the real instruction
   17990  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   17991  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   17992  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   17993  * bail to the real handler if breakFlags==0.
   17994  */
   17995     lbu    a3, offThread_breakFlags(rSELF)
   17996     la     rBIX, dvmAsmInstructionStart + (232 * 128)
   17997     lw     rIBASE, offThread_curHandlerTable(rSELF)
   17998     bnez   a3, 1f
   17999     jr     rBIX            # nothing to do - jump to real handler
   18000 1:
   18001     EXPORT_PC()
   18002     move   a0, rPC         # arg0
   18003     move   a1, rFP         # arg1
   18004     move   a2, rSELF       # arg2
   18005     JAL(dvmCheckBefore)
   18006     jr     rBIX
   18007 
   18008 /* ------------------------------ */
   18009     .balign 128
   18010 .L_ALT_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
   18011 /* File: mips/alt_stub.S */
   18012 /*
   18013  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18014  * any interesting requests and then jump to the real instruction
   18015  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18016  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18017  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18018  * bail to the real handler if breakFlags==0.
   18019  */
   18020     lbu    a3, offThread_breakFlags(rSELF)
   18021     la     rBIX, dvmAsmInstructionStart + (233 * 128)
   18022     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18023     bnez   a3, 1f
   18024     jr     rBIX            # nothing to do - jump to real handler
   18025 1:
   18026     EXPORT_PC()
   18027     move   a0, rPC         # arg0
   18028     move   a1, rFP         # arg1
   18029     move   a2, rSELF       # arg2
   18030     JAL(dvmCheckBefore)
   18031     jr     rBIX
   18032 
   18033 /* ------------------------------ */
   18034     .balign 128
   18035 .L_ALT_OP_SGET_WIDE_VOLATILE: /* 0xea */
   18036 /* File: mips/alt_stub.S */
   18037 /*
   18038  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18039  * any interesting requests and then jump to the real instruction
   18040  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18041  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18042  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18043  * bail to the real handler if breakFlags==0.
   18044  */
   18045     lbu    a3, offThread_breakFlags(rSELF)
   18046     la     rBIX, dvmAsmInstructionStart + (234 * 128)
   18047     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18048     bnez   a3, 1f
   18049     jr     rBIX            # nothing to do - jump to real handler
   18050 1:
   18051     EXPORT_PC()
   18052     move   a0, rPC         # arg0
   18053     move   a1, rFP         # arg1
   18054     move   a2, rSELF       # arg2
   18055     JAL(dvmCheckBefore)
   18056     jr     rBIX
   18057 
   18058 /* ------------------------------ */
   18059     .balign 128
   18060 .L_ALT_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
   18061 /* File: mips/alt_stub.S */
   18062 /*
   18063  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18064  * any interesting requests and then jump to the real instruction
   18065  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18066  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18067  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18068  * bail to the real handler if breakFlags==0.
   18069  */
   18070     lbu    a3, offThread_breakFlags(rSELF)
   18071     la     rBIX, dvmAsmInstructionStart + (235 * 128)
   18072     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18073     bnez   a3, 1f
   18074     jr     rBIX            # nothing to do - jump to real handler
   18075 1:
   18076     EXPORT_PC()
   18077     move   a0, rPC         # arg0
   18078     move   a1, rFP         # arg1
   18079     move   a2, rSELF       # arg2
   18080     JAL(dvmCheckBefore)
   18081     jr     rBIX
   18082 
   18083 /* ------------------------------ */
   18084     .balign 128
   18085 .L_ALT_OP_BREAKPOINT: /* 0xec */
   18086 /* File: mips/alt_stub.S */
   18087 /*
   18088  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18089  * any interesting requests and then jump to the real instruction
   18090  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18091  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18092  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18093  * bail to the real handler if breakFlags==0.
   18094  */
   18095     lbu    a3, offThread_breakFlags(rSELF)
   18096     la     rBIX, dvmAsmInstructionStart + (236 * 128)
   18097     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18098     bnez   a3, 1f
   18099     jr     rBIX            # nothing to do - jump to real handler
   18100 1:
   18101     EXPORT_PC()
   18102     move   a0, rPC         # arg0
   18103     move   a1, rFP         # arg1
   18104     move   a2, rSELF       # arg2
   18105     JAL(dvmCheckBefore)
   18106     jr     rBIX
   18107 
   18108 /* ------------------------------ */
   18109     .balign 128
   18110 .L_ALT_OP_THROW_VERIFICATION_ERROR: /* 0xed */
   18111 /* File: mips/alt_stub.S */
   18112 /*
   18113  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18114  * any interesting requests and then jump to the real instruction
   18115  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18116  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18117  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18118  * bail to the real handler if breakFlags==0.
   18119  */
   18120     lbu    a3, offThread_breakFlags(rSELF)
   18121     la     rBIX, dvmAsmInstructionStart + (237 * 128)
   18122     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18123     bnez   a3, 1f
   18124     jr     rBIX            # nothing to do - jump to real handler
   18125 1:
   18126     EXPORT_PC()
   18127     move   a0, rPC         # arg0
   18128     move   a1, rFP         # arg1
   18129     move   a2, rSELF       # arg2
   18130     JAL(dvmCheckBefore)
   18131     jr     rBIX
   18132 
   18133 /* ------------------------------ */
   18134     .balign 128
   18135 .L_ALT_OP_EXECUTE_INLINE: /* 0xee */
   18136 /* File: mips/alt_stub.S */
   18137 /*
   18138  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18139  * any interesting requests and then jump to the real instruction
   18140  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18141  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18142  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18143  * bail to the real handler if breakFlags==0.
   18144  */
   18145     lbu    a3, offThread_breakFlags(rSELF)
   18146     la     rBIX, dvmAsmInstructionStart + (238 * 128)
   18147     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18148     bnez   a3, 1f
   18149     jr     rBIX            # nothing to do - jump to real handler
   18150 1:
   18151     EXPORT_PC()
   18152     move   a0, rPC         # arg0
   18153     move   a1, rFP         # arg1
   18154     move   a2, rSELF       # arg2
   18155     JAL(dvmCheckBefore)
   18156     jr     rBIX
   18157 
   18158 /* ------------------------------ */
   18159     .balign 128
   18160 .L_ALT_OP_EXECUTE_INLINE_RANGE: /* 0xef */
   18161 /* File: mips/alt_stub.S */
   18162 /*
   18163  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18164  * any interesting requests and then jump to the real instruction
   18165  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18166  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18167  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18168  * bail to the real handler if breakFlags==0.
   18169  */
   18170     lbu    a3, offThread_breakFlags(rSELF)
   18171     la     rBIX, dvmAsmInstructionStart + (239 * 128)
   18172     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18173     bnez   a3, 1f
   18174     jr     rBIX            # nothing to do - jump to real handler
   18175 1:
   18176     EXPORT_PC()
   18177     move   a0, rPC         # arg0
   18178     move   a1, rFP         # arg1
   18179     move   a2, rSELF       # arg2
   18180     JAL(dvmCheckBefore)
   18181     jr     rBIX
   18182 
   18183 /* ------------------------------ */
   18184     .balign 128
   18185 .L_ALT_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
   18186 /* File: mips/alt_stub.S */
   18187 /*
   18188  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18189  * any interesting requests and then jump to the real instruction
   18190  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18191  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18192  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18193  * bail to the real handler if breakFlags==0.
   18194  */
   18195     lbu    a3, offThread_breakFlags(rSELF)
   18196     la     rBIX, dvmAsmInstructionStart + (240 * 128)
   18197     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18198     bnez   a3, 1f
   18199     jr     rBIX            # nothing to do - jump to real handler
   18200 1:
   18201     EXPORT_PC()
   18202     move   a0, rPC         # arg0
   18203     move   a1, rFP         # arg1
   18204     move   a2, rSELF       # arg2
   18205     JAL(dvmCheckBefore)
   18206     jr     rBIX
   18207 
   18208 /* ------------------------------ */
   18209     .balign 128
   18210 .L_ALT_OP_RETURN_VOID_BARRIER: /* 0xf1 */
   18211 /* File: mips/alt_stub.S */
   18212 /*
   18213  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18214  * any interesting requests and then jump to the real instruction
   18215  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18216  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18217  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18218  * bail to the real handler if breakFlags==0.
   18219  */
   18220     lbu    a3, offThread_breakFlags(rSELF)
   18221     la     rBIX, dvmAsmInstructionStart + (241 * 128)
   18222     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18223     bnez   a3, 1f
   18224     jr     rBIX            # nothing to do - jump to real handler
   18225 1:
   18226     EXPORT_PC()
   18227     move   a0, rPC         # arg0
   18228     move   a1, rFP         # arg1
   18229     move   a2, rSELF       # arg2
   18230     JAL(dvmCheckBefore)
   18231     jr     rBIX
   18232 
   18233 /* ------------------------------ */
   18234     .balign 128
   18235 .L_ALT_OP_IGET_QUICK: /* 0xf2 */
   18236 /* File: mips/alt_stub.S */
   18237 /*
   18238  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18239  * any interesting requests and then jump to the real instruction
   18240  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18241  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18242  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18243  * bail to the real handler if breakFlags==0.
   18244  */
   18245     lbu    a3, offThread_breakFlags(rSELF)
   18246     la     rBIX, dvmAsmInstructionStart + (242 * 128)
   18247     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18248     bnez   a3, 1f
   18249     jr     rBIX            # nothing to do - jump to real handler
   18250 1:
   18251     EXPORT_PC()
   18252     move   a0, rPC         # arg0
   18253     move   a1, rFP         # arg1
   18254     move   a2, rSELF       # arg2
   18255     JAL(dvmCheckBefore)
   18256     jr     rBIX
   18257 
   18258 /* ------------------------------ */
   18259     .balign 128
   18260 .L_ALT_OP_IGET_WIDE_QUICK: /* 0xf3 */
   18261 /* File: mips/alt_stub.S */
   18262 /*
   18263  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18264  * any interesting requests and then jump to the real instruction
   18265  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18266  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18267  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18268  * bail to the real handler if breakFlags==0.
   18269  */
   18270     lbu    a3, offThread_breakFlags(rSELF)
   18271     la     rBIX, dvmAsmInstructionStart + (243 * 128)
   18272     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18273     bnez   a3, 1f
   18274     jr     rBIX            # nothing to do - jump to real handler
   18275 1:
   18276     EXPORT_PC()
   18277     move   a0, rPC         # arg0
   18278     move   a1, rFP         # arg1
   18279     move   a2, rSELF       # arg2
   18280     JAL(dvmCheckBefore)
   18281     jr     rBIX
   18282 
   18283 /* ------------------------------ */
   18284     .balign 128
   18285 .L_ALT_OP_IGET_OBJECT_QUICK: /* 0xf4 */
   18286 /* File: mips/alt_stub.S */
   18287 /*
   18288  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18289  * any interesting requests and then jump to the real instruction
   18290  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18291  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18292  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18293  * bail to the real handler if breakFlags==0.
   18294  */
   18295     lbu    a3, offThread_breakFlags(rSELF)
   18296     la     rBIX, dvmAsmInstructionStart + (244 * 128)
   18297     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18298     bnez   a3, 1f
   18299     jr     rBIX            # nothing to do - jump to real handler
   18300 1:
   18301     EXPORT_PC()
   18302     move   a0, rPC         # arg0
   18303     move   a1, rFP         # arg1
   18304     move   a2, rSELF       # arg2
   18305     JAL(dvmCheckBefore)
   18306     jr     rBIX
   18307 
   18308 /* ------------------------------ */
   18309     .balign 128
   18310 .L_ALT_OP_IPUT_QUICK: /* 0xf5 */
   18311 /* File: mips/alt_stub.S */
   18312 /*
   18313  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18314  * any interesting requests and then jump to the real instruction
   18315  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18316  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18317  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18318  * bail to the real handler if breakFlags==0.
   18319  */
   18320     lbu    a3, offThread_breakFlags(rSELF)
   18321     la     rBIX, dvmAsmInstructionStart + (245 * 128)
   18322     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18323     bnez   a3, 1f
   18324     jr     rBIX            # nothing to do - jump to real handler
   18325 1:
   18326     EXPORT_PC()
   18327     move   a0, rPC         # arg0
   18328     move   a1, rFP         # arg1
   18329     move   a2, rSELF       # arg2
   18330     JAL(dvmCheckBefore)
   18331     jr     rBIX
   18332 
   18333 /* ------------------------------ */
   18334     .balign 128
   18335 .L_ALT_OP_IPUT_WIDE_QUICK: /* 0xf6 */
   18336 /* File: mips/alt_stub.S */
   18337 /*
   18338  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18339  * any interesting requests and then jump to the real instruction
   18340  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18341  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18342  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18343  * bail to the real handler if breakFlags==0.
   18344  */
   18345     lbu    a3, offThread_breakFlags(rSELF)
   18346     la     rBIX, dvmAsmInstructionStart + (246 * 128)
   18347     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18348     bnez   a3, 1f
   18349     jr     rBIX            # nothing to do - jump to real handler
   18350 1:
   18351     EXPORT_PC()
   18352     move   a0, rPC         # arg0
   18353     move   a1, rFP         # arg1
   18354     move   a2, rSELF       # arg2
   18355     JAL(dvmCheckBefore)
   18356     jr     rBIX
   18357 
   18358 /* ------------------------------ */
   18359     .balign 128
   18360 .L_ALT_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
   18361 /* File: mips/alt_stub.S */
   18362 /*
   18363  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18364  * any interesting requests and then jump to the real instruction
   18365  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18366  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18367  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18368  * bail to the real handler if breakFlags==0.
   18369  */
   18370     lbu    a3, offThread_breakFlags(rSELF)
   18371     la     rBIX, dvmAsmInstructionStart + (247 * 128)
   18372     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18373     bnez   a3, 1f
   18374     jr     rBIX            # nothing to do - jump to real handler
   18375 1:
   18376     EXPORT_PC()
   18377     move   a0, rPC         # arg0
   18378     move   a1, rFP         # arg1
   18379     move   a2, rSELF       # arg2
   18380     JAL(dvmCheckBefore)
   18381     jr     rBIX
   18382 
   18383 /* ------------------------------ */
   18384     .balign 128
   18385 .L_ALT_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
   18386 /* File: mips/alt_stub.S */
   18387 /*
   18388  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18389  * any interesting requests and then jump to the real instruction
   18390  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18391  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18392  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18393  * bail to the real handler if breakFlags==0.
   18394  */
   18395     lbu    a3, offThread_breakFlags(rSELF)
   18396     la     rBIX, dvmAsmInstructionStart + (248 * 128)
   18397     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18398     bnez   a3, 1f
   18399     jr     rBIX            # nothing to do - jump to real handler
   18400 1:
   18401     EXPORT_PC()
   18402     move   a0, rPC         # arg0
   18403     move   a1, rFP         # arg1
   18404     move   a2, rSELF       # arg2
   18405     JAL(dvmCheckBefore)
   18406     jr     rBIX
   18407 
   18408 /* ------------------------------ */
   18409     .balign 128
   18410 .L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
   18411 /* File: mips/alt_stub.S */
   18412 /*
   18413  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18414  * any interesting requests and then jump to the real instruction
   18415  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18416  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18417  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18418  * bail to the real handler if breakFlags==0.
   18419  */
   18420     lbu    a3, offThread_breakFlags(rSELF)
   18421     la     rBIX, dvmAsmInstructionStart + (249 * 128)
   18422     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18423     bnez   a3, 1f
   18424     jr     rBIX            # nothing to do - jump to real handler
   18425 1:
   18426     EXPORT_PC()
   18427     move   a0, rPC         # arg0
   18428     move   a1, rFP         # arg1
   18429     move   a2, rSELF       # arg2
   18430     JAL(dvmCheckBefore)
   18431     jr     rBIX
   18432 
   18433 /* ------------------------------ */
   18434     .balign 128
   18435 .L_ALT_OP_INVOKE_SUPER_QUICK: /* 0xfa */
   18436 /* File: mips/alt_stub.S */
   18437 /*
   18438  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18439  * any interesting requests and then jump to the real instruction
   18440  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18441  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18442  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18443  * bail to the real handler if breakFlags==0.
   18444  */
   18445     lbu    a3, offThread_breakFlags(rSELF)
   18446     la     rBIX, dvmAsmInstructionStart + (250 * 128)
   18447     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18448     bnez   a3, 1f
   18449     jr     rBIX            # nothing to do - jump to real handler
   18450 1:
   18451     EXPORT_PC()
   18452     move   a0, rPC         # arg0
   18453     move   a1, rFP         # arg1
   18454     move   a2, rSELF       # arg2
   18455     JAL(dvmCheckBefore)
   18456     jr     rBIX
   18457 
   18458 /* ------------------------------ */
   18459     .balign 128
   18460 .L_ALT_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
   18461 /* File: mips/alt_stub.S */
   18462 /*
   18463  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18464  * any interesting requests and then jump to the real instruction
   18465  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18466  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18467  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18468  * bail to the real handler if breakFlags==0.
   18469  */
   18470     lbu    a3, offThread_breakFlags(rSELF)
   18471     la     rBIX, dvmAsmInstructionStart + (251 * 128)
   18472     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18473     bnez   a3, 1f
   18474     jr     rBIX            # nothing to do - jump to real handler
   18475 1:
   18476     EXPORT_PC()
   18477     move   a0, rPC         # arg0
   18478     move   a1, rFP         # arg1
   18479     move   a2, rSELF       # arg2
   18480     JAL(dvmCheckBefore)
   18481     jr     rBIX
   18482 
   18483 /* ------------------------------ */
   18484     .balign 128
   18485 .L_ALT_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
   18486 /* File: mips/alt_stub.S */
   18487 /*
   18488  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18489  * any interesting requests and then jump to the real instruction
   18490  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18491  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18492  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18493  * bail to the real handler if breakFlags==0.
   18494  */
   18495     lbu    a3, offThread_breakFlags(rSELF)
   18496     la     rBIX, dvmAsmInstructionStart + (252 * 128)
   18497     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18498     bnez   a3, 1f
   18499     jr     rBIX            # nothing to do - jump to real handler
   18500 1:
   18501     EXPORT_PC()
   18502     move   a0, rPC         # arg0
   18503     move   a1, rFP         # arg1
   18504     move   a2, rSELF       # arg2
   18505     JAL(dvmCheckBefore)
   18506     jr     rBIX
   18507 
   18508 /* ------------------------------ */
   18509     .balign 128
   18510 .L_ALT_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
   18511 /* File: mips/alt_stub.S */
   18512 /*
   18513  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18514  * any interesting requests and then jump to the real instruction
   18515  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18516  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18517  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18518  * bail to the real handler if breakFlags==0.
   18519  */
   18520     lbu    a3, offThread_breakFlags(rSELF)
   18521     la     rBIX, dvmAsmInstructionStart + (253 * 128)
   18522     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18523     bnez   a3, 1f
   18524     jr     rBIX            # nothing to do - jump to real handler
   18525 1:
   18526     EXPORT_PC()
   18527     move   a0, rPC         # arg0
   18528     move   a1, rFP         # arg1
   18529     move   a2, rSELF       # arg2
   18530     JAL(dvmCheckBefore)
   18531     jr     rBIX
   18532 
   18533 /* ------------------------------ */
   18534     .balign 128
   18535 .L_ALT_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
   18536 /* File: mips/alt_stub.S */
   18537 /*
   18538  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18539  * any interesting requests and then jump to the real instruction
   18540  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18541  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18542  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18543  * bail to the real handler if breakFlags==0.
   18544  */
   18545     lbu    a3, offThread_breakFlags(rSELF)
   18546     la     rBIX, dvmAsmInstructionStart + (254 * 128)
   18547     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18548     bnez   a3, 1f
   18549     jr     rBIX            # nothing to do - jump to real handler
   18550 1:
   18551     EXPORT_PC()
   18552     move   a0, rPC         # arg0
   18553     move   a1, rFP         # arg1
   18554     move   a2, rSELF       # arg2
   18555     JAL(dvmCheckBefore)
   18556     jr     rBIX
   18557 
   18558 /* ------------------------------ */
   18559     .balign 128
   18560 .L_ALT_OP_UNUSED_FF: /* 0xff */
   18561 /* File: mips/alt_stub.S */
   18562 /*
   18563  * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
   18564  * any interesting requests and then jump to the real instruction
   18565  * handler.    Note that the call to dvmCheckBefore is done as a tail call.
   18566  * rIBASE updates won't be seen until a refresh, and we can tell we have a
   18567  * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
   18568  * bail to the real handler if breakFlags==0.
   18569  */
   18570     lbu    a3, offThread_breakFlags(rSELF)
   18571     la     rBIX, dvmAsmInstructionStart + (255 * 128)
   18572     lw     rIBASE, offThread_curHandlerTable(rSELF)
   18573     bnez   a3, 1f
   18574     jr     rBIX            # nothing to do - jump to real handler
   18575 1:
   18576     EXPORT_PC()
   18577     move   a0, rPC         # arg0
   18578     move   a1, rFP         # arg1
   18579     move   a2, rSELF       # arg2
   18580     JAL(dvmCheckBefore)
   18581     jr     rBIX
   18582 
   18583     .balign 128
   18584     .size   dvmAsmAltInstructionStart, .-dvmAsmAltInstructionStart
   18585     .global dvmAsmAltInstructionEnd
   18586 dvmAsmAltInstructionEnd:
   18587