InterpAsm-armv7-a-neon.S revision 4185972e211b0c84b9fe7d90c56b28cc15e474fa
1/*
2 * This file was generated automatically by gen-mterp.py for 'armv7-a-neon'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: armv5te/header.S */
8/*
9 * Copyright (C) 2008 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 *      http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25 * ARMv5 definitions and declarations.
26 */
27
28/*
29ARM EABI general notes:
30
31r0-r3 hold first 4 args to a method; they are not preserved across method calls
32r4-r8 are available for general use
33r9 is given special treatment in some situations, but not for us
34r10 (sl) seems to be generally available
35r11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
36r12 (ip) is scratch -- not preserved across method calls
37r13 (sp) should be managed carefully in case a signal arrives
38r14 (lr) must be preserved
39r15 (pc) can be tinkered with directly
40
41r0 holds returns of <= 4 bytes
42r0-r1 hold returns of 8 bytes, low word in r0
43
44Callee must save/restore r4+ (except r12) if it modifies them.  If VFP
45is present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
46s0-s15 (d0-d7, q0-a3) do not need to be.
47
48Stack is "full descending".  Only the arguments that don't fit in the first 4
49registers are placed on the stack.  "sp" points at the first stacked argument
50(i.e. the 5th arg).
51
52VFP: single-precision results in s0, double-precision results in d0.
53
54In the EABI, "sp" must be 64-bit aligned on entry to a function, and any
5564-bit quantities (long long, double) must be 64-bit aligned.
56*/
57
58/*
59Mterp and ARM notes:
60
61The following registers have fixed assignments:
62
63  reg nick      purpose
64  r4  rPC       interpreted program counter, used for fetching instructions
65  r5  rFP       interpreted frame pointer, used for accessing locals and args
66  r6  rSELF     self (Thread) pointer
67  r7  rINST     first 16-bit code unit of current instruction
68  r8  rIBASE    interpreted instruction base pointer, used for computed goto
69
70Macros are provided for common operations.  Each macro MUST emit only
71one instruction to make instruction-counting easier.  They MUST NOT alter
72unspecified registers or condition codes.
73*/
74
75/* single-purpose registers, given names for clarity */
76#define rPC     r4
77#define rFP     r5
78#define rSELF   r6
79#define rINST   r7
80#define rIBASE  r8
81
82/* save/restore the PC and/or FP from the thread struct */
83#define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
84#define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
85#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
86#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
87#define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
88#define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
89
90/*
91 * "export" the PC to the stack frame, f/b/o future exception objects.  Must
92 * be done *before* something throws.
93 *
94 * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
95 * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
96 *
97 * It's okay to do this more than once.
98 */
99#define EXPORT_PC() \
100    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
101
102/*
103 * Given a frame pointer, find the stack save area.
104 *
105 * In C this is "((StackSaveArea*)(_fp) -1)".
106 */
107#define SAVEAREA_FROM_FP(_reg, _fpreg) \
108    sub     _reg, _fpreg, #sizeofStackSaveArea
109
110/*
111 * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
112 */
113#define FETCH_INST()            ldrh    rINST, [rPC]
114
115/*
116 * Fetch the next instruction from the specified offset.  Advances rPC
117 * to point to the next instruction.  "_count" is in 16-bit code units.
118 *
119 * Because of the limited size of immediate constants on ARM, this is only
120 * suitable for small forward movements (i.e. don't try to implement "goto"
121 * with this).
122 *
123 * This must come AFTER anything that can throw an exception, or the
124 * exception catch may miss.  (This also implies that it must come after
125 * EXPORT_PC().)
126 */
127#define FETCH_ADVANCE_INST(_count) ldrh    rINST, [rPC, #((_count)*2)]!
128
129/*
130 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
131 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
132 */
133#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
134        ldrh    _dreg, [_sreg, #((_count)*2)]!
135
136/*
137 * Fetch the next instruction from an offset specified by _reg.  Updates
138 * rPC to point to the next instruction.  "_reg" must specify the distance
139 * in bytes, *not* 16-bit code units, and may be a signed value.
140 *
141 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
142 * bits that hold the shift distance are used for the half/byte/sign flags.
143 * In some cases we can pre-double _reg for free, so we require a byte offset
144 * here.
145 */
146#define FETCH_ADVANCE_INST_RB(_reg) ldrh    rINST, [rPC, _reg]!
147
148/*
149 * Fetch a half-word code unit from an offset past the current PC.  The
150 * "_count" value is in 16-bit code units.  Does not advance rPC.
151 *
152 * The "_S" variant works the same but treats the value as signed.
153 */
154#define FETCH(_reg, _count)     ldrh    _reg, [rPC, #((_count)*2)]
155#define FETCH_S(_reg, _count)   ldrsh   _reg, [rPC, #((_count)*2)]
156
157/*
158 * Fetch one byte from an offset past the current PC.  Pass in the same
159 * "_count" as you would for FETCH, and an additional 0/1 indicating which
160 * byte of the halfword you want (lo/hi).
161 */
162#define FETCH_B(_reg, _count, _byte) ldrb     _reg, [rPC, #((_count)*2+(_byte))]
163
164/*
165 * Put the instruction's opcode field into the specified register.
166 */
167#define GET_INST_OPCODE(_reg)   and     _reg, rINST, #255
168
169/*
170 * Put the prefetched instruction's opcode field into the specified register.
171 */
172#define GET_PREFETCHED_OPCODE(_oreg, _ireg)   and     _oreg, _ireg, #255
173
174/*
175 * Begin executing the opcode in _reg.  Because this only jumps within the
176 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
177 */
178#define GOTO_OPCODE(_reg)       add     pc, rIBASE, _reg, lsl #6
179#define GOTO_OPCODE_BASE(_base,_reg)  add     pc, _base, _reg, lsl #6
180#define GOTO_OPCODE_IFEQ(_reg)  addeq   pc, rIBASE, _reg, lsl #6
181#define GOTO_OPCODE_IFNE(_reg)  addne   pc, rIBASE, _reg, lsl #6
182
183/*
184 * Get/set the 32-bit value from a Dalvik register.
185 */
186#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
187#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
188
189/*
190 * Convert a virtual register index into an address.
191 */
192#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
193        add     _reg, rFP, _vreg, lsl #2
194
195/*
196 * This is a #include, not a %include, because we want the C pre-processor
197 * to expand the macros into assembler assignment statements.
198 */
199#include "../common/asm-constants.h"
200
201#if defined(WITH_JIT)
202#include "../common/jit-config.h"
203#endif
204
205/* File: armv7-a/platform.S */
206/*
207 * ===========================================================================
208 *  CPU-version-specific defines
209 * ===========================================================================
210 */
211
212#if !defined(ANDROID_SMP)
213# error "Must define ANDROID_SMP"
214#endif
215
216/*
217 * Macro for data memory barrier.
218 */
219.macro  SMP_DMB
220#if ANDROID_SMP != 0
221    dmb
222#else
223    /* not SMP */
224#endif
225.endm
226
227/*
228 * Macro for data memory barrier (store/store variant).
229 */
230.macro  SMP_DMB_ST
231#if ANDROID_SMP != 0
232    dmb     st
233#else
234    /* not SMP */
235#endif
236.endm
237
238/* File: armv5te/entry.S */
239/*
240 * Copyright (C) 2008 The Android Open Source Project
241 *
242 * Licensed under the Apache License, Version 2.0 (the "License");
243 * you may not use this file except in compliance with the License.
244 * You may obtain a copy of the License at
245 *
246 *      http://www.apache.org/licenses/LICENSE-2.0
247 *
248 * Unless required by applicable law or agreed to in writing, software
249 * distributed under the License is distributed on an "AS IS" BASIS,
250 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
251 * See the License for the specific language governing permissions and
252 * limitations under the License.
253 */
254/*
255 * Interpreter entry point.
256 */
257
258/*
259 * We don't have formal stack frames, so gdb scans upward in the code
260 * to find the start of the function (a label with the %function type),
261 * and then looks at the next few instructions to figure out what
262 * got pushed onto the stack.  From this it figures out how to restore
263 * the registers, including PC, for the previous stack frame.  If gdb
264 * sees a non-function label, it stops scanning, so either we need to
265 * have nothing but assembler-local labels between the entry point and
266 * the break, or we need to fake it out.
267 *
268 * When this is defined, we add some stuff to make gdb less confused.
269 */
270#define ASSIST_DEBUGGER 1
271
272    .text
273    .align  2
274    .global dvmMterpStdRun
275    .type   dvmMterpStdRun, %function
276
277/*
278 * On entry:
279 *  r0  Thread* self
280 *
281 * The return comes via a call to dvmMterpStdBail().
282 */
283dvmMterpStdRun:
284#define MTERP_ENTRY1 \
285    .save {r4-r10,fp,lr}; \
286    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
287#define MTERP_ENTRY2 \
288    .pad    #4; \
289    sub     sp, sp, #4                  @ align 64
290
291    .fnstart
292    MTERP_ENTRY1
293    MTERP_ENTRY2
294
295    /* save stack pointer, add magic word for debuggerd */
296    str     sp, [r0, #offThread_bailPtr]  @ save SP for eventual return
297
298    /* set up "named" registers, figure out entry point */
299    mov     rSELF, r0                   @ set rSELF
300    LOAD_PC_FP_FROM_SELF()              @ load rPC and rFP from "thread"
301    ldr     rIBASE, [rSELF, #offThread_curHandlerTable] @ set rIBASE
302
303#if defined(WITH_JIT)
304.LentryInstr:
305    /* Entry is always a possible trace start */
306    ldr     r0, [rSELF, #offThread_pJitProfTable]
307    FETCH_INST()
308    mov     r1, #0                      @ prepare the value for the new state
309    str     r1, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
310    cmp     r0,#0                       @ is profiling disabled?
311#if !defined(WITH_SELF_VERIFICATION)
312    bne     common_updateProfile        @ profiling is enabled
313#else
314    ldr     r2, [rSELF, #offThread_shadowSpace] @ to find out the jit exit state
315    beq     1f                          @ profiling is disabled
316    ldr     r3, [r2, #offShadowSpace_jitExitState]  @ jit exit state
317    cmp     r3, #kSVSTraceSelect        @ hot trace following?
318    moveq   r2,#kJitTSelectRequestHot   @ ask for trace selection
319    beq     common_selectTrace          @ go build the trace
320    cmp     r3, #kSVSNoProfile          @ don't profile the next instruction?
321    beq     1f                          @ intrepret the next instruction
322    b       common_updateProfile        @ collect profiles
323#endif
3241:
325    GET_INST_OPCODE(ip)
326    GOTO_OPCODE(ip)
327#else
328    /* start executing the instruction at rPC */
329    FETCH_INST()                        @ load rINST from rPC
330    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
331    GOTO_OPCODE(ip)                     @ jump to next instruction
332#endif
333
334.Lbad_arg:
335    ldr     r0, strBadEntryPoint
336    @ r1 holds value of entryPoint
337    bl      printf
338    bl      dvmAbort
339    .fnend
340    .size   dvmMterpStdRun, .-dvmMterpStdRun
341
342
343    .global dvmMterpStdBail
344    .type   dvmMterpStdBail, %function
345
346/*
347 * Restore the stack pointer and PC from the save point established on entry.
348 * This is essentially the same as a longjmp, but should be cheaper.  The
349 * last instruction causes us to return to whoever called dvmMterpStdRun.
350 *
351 * We pushed some registers on the stack in dvmMterpStdRun, then saved
352 * SP and LR.  Here we restore SP, restore the registers, and then restore
353 * LR to PC.
354 *
355 * On entry:
356 *  r0  Thread* self
357 */
358dvmMterpStdBail:
359    ldr     sp, [r0, #offThread_bailPtr]    @ sp<- saved SP
360    add     sp, sp, #4                      @ un-align 64
361    ldmfd   sp!, {r4-r10,fp,pc}             @ restore 9 regs and return
362
363
364/*
365 * String references.
366 */
367strBadEntryPoint:
368    .word   .LstrBadEntryPoint
369
370
371    .global dvmAsmInstructionStart
372    .type   dvmAsmInstructionStart, %function
373dvmAsmInstructionStart = .L_OP_NOP
374    .text
375
376/* ------------------------------ */
377    .balign 64
378.L_OP_NOP: /* 0x00 */
379/* File: armv5te/OP_NOP.S */
380    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
381    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
382    GOTO_OPCODE(ip)                     @ execute it
383
384#ifdef ASSIST_DEBUGGER
385    /* insert fake function header to help gdb find the stack frame */
386    .type   dalvik_inst, %function
387dalvik_inst:
388    .fnstart
389    MTERP_ENTRY1
390    MTERP_ENTRY2
391    .fnend
392#endif
393
394/* ------------------------------ */
395    .balign 64
396.L_OP_MOVE: /* 0x01 */
397/* File: armv6t2/OP_MOVE.S */
398    /* for move, move-object, long-to-int */
399    /* op vA, vB */
400    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
401    ubfx    r0, rINST, #8, #4           @ r0<- A from 11:8
402    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
403    GET_VREG(r2, r1)                    @ r2<- fp[B]
404    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
405    SET_VREG(r2, r0)                    @ fp[A]<- r2
406    GOTO_OPCODE(ip)                     @ execute next instruction
407
408/* ------------------------------ */
409    .balign 64
410.L_OP_MOVE_FROM16: /* 0x02 */
411/* File: armv5te/OP_MOVE_FROM16.S */
412    /* for: move/from16, move-object/from16 */
413    /* op vAA, vBBBB */
414    FETCH(r1, 1)                        @ r1<- BBBB
415    mov     r0, rINST, lsr #8           @ r0<- AA
416    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
417    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
418    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
419    SET_VREG(r2, r0)                    @ fp[AA]<- r2
420    GOTO_OPCODE(ip)                     @ jump to next instruction
421
422/* ------------------------------ */
423    .balign 64
424.L_OP_MOVE_16: /* 0x03 */
425/* File: armv5te/OP_MOVE_16.S */
426    /* for: move/16, move-object/16 */
427    /* op vAAAA, vBBBB */
428    FETCH(r1, 2)                        @ r1<- BBBB
429    FETCH(r0, 1)                        @ r0<- AAAA
430    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
431    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
432    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
433    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
434    GOTO_OPCODE(ip)                     @ jump to next instruction
435
436/* ------------------------------ */
437    .balign 64
438.L_OP_MOVE_WIDE: /* 0x04 */
439/* File: armv6t2/OP_MOVE_WIDE.S */
440    /* move-wide vA, vB */
441    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
442    mov     r3, rINST, lsr #12          @ r3<- B
443    ubfx    r2, rINST, #8, #4           @ r2<- A
444    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
445    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
446    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
447    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
448    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
449    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
450    GOTO_OPCODE(ip)                     @ jump to next instruction
451
452/* ------------------------------ */
453    .balign 64
454.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
455/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
456    /* move-wide/from16 vAA, vBBBB */
457    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
458    FETCH(r3, 1)                        @ r3<- BBBB
459    mov     r2, rINST, lsr #8           @ r2<- AA
460    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
461    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
462    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
463    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
464    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
465    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
466    GOTO_OPCODE(ip)                     @ jump to next instruction
467
468/* ------------------------------ */
469    .balign 64
470.L_OP_MOVE_WIDE_16: /* 0x06 */
471/* File: armv5te/OP_MOVE_WIDE_16.S */
472    /* move-wide/16 vAAAA, vBBBB */
473    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
474    FETCH(r3, 2)                        @ r3<- BBBB
475    FETCH(r2, 1)                        @ r2<- AAAA
476    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
477    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
478    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
479    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
480    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
481    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
482    GOTO_OPCODE(ip)                     @ jump to next instruction
483
484/* ------------------------------ */
485    .balign 64
486.L_OP_MOVE_OBJECT: /* 0x07 */
487/* File: armv5te/OP_MOVE_OBJECT.S */
488/* File: armv5te/OP_MOVE.S */
489    /* for move, move-object, long-to-int */
490    /* op vA, vB */
491    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
492    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
493    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
494    GET_VREG(r2, r1)                    @ r2<- fp[B]
495    and     r0, r0, #15
496    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
497    SET_VREG(r2, r0)                    @ fp[A]<- r2
498    GOTO_OPCODE(ip)                     @ execute next instruction
499
500
501/* ------------------------------ */
502    .balign 64
503.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
504/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
505/* File: armv5te/OP_MOVE_FROM16.S */
506    /* for: move/from16, move-object/from16 */
507    /* op vAA, vBBBB */
508    FETCH(r1, 1)                        @ r1<- BBBB
509    mov     r0, rINST, lsr #8           @ r0<- AA
510    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
511    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
512    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
513    SET_VREG(r2, r0)                    @ fp[AA]<- r2
514    GOTO_OPCODE(ip)                     @ jump to next instruction
515
516
517/* ------------------------------ */
518    .balign 64
519.L_OP_MOVE_OBJECT_16: /* 0x09 */
520/* File: armv5te/OP_MOVE_OBJECT_16.S */
521/* File: armv5te/OP_MOVE_16.S */
522    /* for: move/16, move-object/16 */
523    /* op vAAAA, vBBBB */
524    FETCH(r1, 2)                        @ r1<- BBBB
525    FETCH(r0, 1)                        @ r0<- AAAA
526    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
527    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
528    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
529    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
530    GOTO_OPCODE(ip)                     @ jump to next instruction
531
532
533/* ------------------------------ */
534    .balign 64
535.L_OP_MOVE_RESULT: /* 0x0a */
536/* File: armv5te/OP_MOVE_RESULT.S */
537    /* for: move-result, move-result-object */
538    /* op vAA */
539    mov     r2, rINST, lsr #8           @ r2<- AA
540    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
541    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
542    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
543    SET_VREG(r0, r2)                    @ fp[AA]<- r0
544    GOTO_OPCODE(ip)                     @ jump to next instruction
545
546/* ------------------------------ */
547    .balign 64
548.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
549/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
550    /* move-result-wide vAA */
551    mov     r2, rINST, lsr #8           @ r2<- AA
552    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
553    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
554    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
555    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
556    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
557    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
558    GOTO_OPCODE(ip)                     @ jump to next instruction
559
560/* ------------------------------ */
561    .balign 64
562.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
563/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
564/* File: armv5te/OP_MOVE_RESULT.S */
565    /* for: move-result, move-result-object */
566    /* op vAA */
567    mov     r2, rINST, lsr #8           @ r2<- AA
568    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
569    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
570    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
571    SET_VREG(r0, r2)                    @ fp[AA]<- r0
572    GOTO_OPCODE(ip)                     @ jump to next instruction
573
574
575/* ------------------------------ */
576    .balign 64
577.L_OP_MOVE_EXCEPTION: /* 0x0d */
578/* File: armv5te/OP_MOVE_EXCEPTION.S */
579    /* move-exception vAA */
580    mov     r2, rINST, lsr #8           @ r2<- AA
581    ldr     r3, [rSELF, #offThread_exception]  @ r3<- dvmGetException bypass
582    mov     r1, #0                      @ r1<- 0
583    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
584    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
585    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
586    str     r1, [rSELF, #offThread_exception]  @ dvmClearException bypass
587    GOTO_OPCODE(ip)                     @ jump to next instruction
588
589/* ------------------------------ */
590    .balign 64
591.L_OP_RETURN_VOID: /* 0x0e */
592/* File: armv5te/OP_RETURN_VOID.S */
593    b       common_returnFromMethod
594
595/* ------------------------------ */
596    .balign 64
597.L_OP_RETURN: /* 0x0f */
598/* File: armv5te/OP_RETURN.S */
599    /*
600     * Return a 32-bit value.  Copies the return value into the "thread"
601     * structure, then jumps to the return handler.
602     *
603     * for: return, return-object
604     */
605    /* op vAA */
606    mov     r2, rINST, lsr #8           @ r2<- AA
607    GET_VREG(r0, r2)                    @ r0<- vAA
608    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
609    b       common_returnFromMethod
610
611/* ------------------------------ */
612    .balign 64
613.L_OP_RETURN_WIDE: /* 0x10 */
614/* File: armv5te/OP_RETURN_WIDE.S */
615    /*
616     * Return a 64-bit value.  Copies the return value into the "thread"
617     * structure, then jumps to the return handler.
618     */
619    /* return-wide vAA */
620    mov     r2, rINST, lsr #8           @ r2<- AA
621    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
622    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
623    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
624    stmia   r3, {r0-r1}                 @ retval<- r0/r1
625    b       common_returnFromMethod
626
627/* ------------------------------ */
628    .balign 64
629.L_OP_RETURN_OBJECT: /* 0x11 */
630/* File: armv5te/OP_RETURN_OBJECT.S */
631/* File: armv5te/OP_RETURN.S */
632    /*
633     * Return a 32-bit value.  Copies the return value into the "thread"
634     * structure, then jumps to the return handler.
635     *
636     * for: return, return-object
637     */
638    /* op vAA */
639    mov     r2, rINST, lsr #8           @ r2<- AA
640    GET_VREG(r0, r2)                    @ r0<- vAA
641    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
642    b       common_returnFromMethod
643
644
645/* ------------------------------ */
646    .balign 64
647.L_OP_CONST_4: /* 0x12 */
648/* File: armv6t2/OP_CONST_4.S */
649    /* const/4 vA, #+B */
650    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
651    ubfx    r0, rINST, #8, #4           @ r0<- A
652    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
653    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
654    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
655    SET_VREG(r1, r0)                    @ fp[A]<- r1
656    GOTO_OPCODE(ip)                     @ execute next instruction
657
658/* ------------------------------ */
659    .balign 64
660.L_OP_CONST_16: /* 0x13 */
661/* File: armv5te/OP_CONST_16.S */
662    /* const/16 vAA, #+BBBB */
663    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
664    mov     r3, rINST, lsr #8           @ r3<- AA
665    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
666    SET_VREG(r0, r3)                    @ vAA<- r0
667    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
668    GOTO_OPCODE(ip)                     @ jump to next instruction
669
670/* ------------------------------ */
671    .balign 64
672.L_OP_CONST: /* 0x14 */
673/* File: armv5te/OP_CONST.S */
674    /* const vAA, #+BBBBbbbb */
675    mov     r3, rINST, lsr #8           @ r3<- AA
676    FETCH(r0, 1)                        @ r0<- bbbb (low)
677    FETCH(r1, 2)                        @ r1<- BBBB (high)
678    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
679    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
680    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
681    SET_VREG(r0, r3)                    @ vAA<- r0
682    GOTO_OPCODE(ip)                     @ jump to next instruction
683
684/* ------------------------------ */
685    .balign 64
686.L_OP_CONST_HIGH16: /* 0x15 */
687/* File: armv5te/OP_CONST_HIGH16.S */
688    /* const/high16 vAA, #+BBBB0000 */
689    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
690    mov     r3, rINST, lsr #8           @ r3<- AA
691    mov     r0, r0, lsl #16             @ r0<- BBBB0000
692    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
693    SET_VREG(r0, r3)                    @ vAA<- r0
694    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
695    GOTO_OPCODE(ip)                     @ jump to next instruction
696
697/* ------------------------------ */
698    .balign 64
699.L_OP_CONST_WIDE_16: /* 0x16 */
700/* File: armv5te/OP_CONST_WIDE_16.S */
701    /* const-wide/16 vAA, #+BBBB */
702    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
703    mov     r3, rINST, lsr #8           @ r3<- AA
704    mov     r1, r0, asr #31             @ r1<- ssssssss
705    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
706    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
707    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
708    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
709    GOTO_OPCODE(ip)                     @ jump to next instruction
710
711/* ------------------------------ */
712    .balign 64
713.L_OP_CONST_WIDE_32: /* 0x17 */
714/* File: armv5te/OP_CONST_WIDE_32.S */
715    /* const-wide/32 vAA, #+BBBBbbbb */
716    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
717    mov     r3, rINST, lsr #8           @ r3<- AA
718    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
719    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
720    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
721    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
722    mov     r1, r0, asr #31             @ r1<- ssssssss
723    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
724    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
725    GOTO_OPCODE(ip)                     @ jump to next instruction
726
727/* ------------------------------ */
728    .balign 64
729.L_OP_CONST_WIDE: /* 0x18 */
730/* File: armv5te/OP_CONST_WIDE.S */
731    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
732    FETCH(r0, 1)                        @ r0<- bbbb (low)
733    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
734    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
735    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
736    FETCH(r3, 4)                        @ r3<- HHHH (high)
737    mov     r9, rINST, lsr #8           @ r9<- AA
738    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
739    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
740    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
741    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
742    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
743    GOTO_OPCODE(ip)                     @ jump to next instruction
744
745/* ------------------------------ */
746    .balign 64
747.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
748/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
749    /* const-wide/high16 vAA, #+BBBB000000000000 */
750    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
751    mov     r3, rINST, lsr #8           @ r3<- AA
752    mov     r0, #0                      @ r0<- 00000000
753    mov     r1, r1, lsl #16             @ r1<- BBBB0000
754    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
755    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
756    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
757    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
758    GOTO_OPCODE(ip)                     @ jump to next instruction
759
760/* ------------------------------ */
761    .balign 64
762.L_OP_CONST_STRING: /* 0x1a */
763/* File: armv5te/OP_CONST_STRING.S */
764    /* const/string vAA, String@BBBB */
765    FETCH(r1, 1)                        @ r1<- BBBB
766    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
767    mov     r9, rINST, lsr #8           @ r9<- AA
768    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
769    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
770    cmp     r0, #0                      @ not yet resolved?
771    beq     .LOP_CONST_STRING_resolve
772    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
773    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
774    SET_VREG(r0, r9)                    @ vAA<- r0
775    GOTO_OPCODE(ip)                     @ jump to next instruction
776
777/* ------------------------------ */
778    .balign 64
779.L_OP_CONST_STRING_JUMBO: /* 0x1b */
780/* File: armv5te/OP_CONST_STRING_JUMBO.S */
781    /* const/string vAA, String@BBBBBBBB */
782    FETCH(r0, 1)                        @ r0<- bbbb (low)
783    FETCH(r1, 2)                        @ r1<- BBBB (high)
784    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
785    mov     r9, rINST, lsr #8           @ r9<- AA
786    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
787    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
788    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
789    cmp     r0, #0
790    beq     .LOP_CONST_STRING_JUMBO_resolve
791    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
792    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
793    SET_VREG(r0, r9)                    @ vAA<- r0
794    GOTO_OPCODE(ip)                     @ jump to next instruction
795
796/* ------------------------------ */
797    .balign 64
798.L_OP_CONST_CLASS: /* 0x1c */
799/* File: armv5te/OP_CONST_CLASS.S */
800    /* const/class vAA, Class@BBBB */
801    FETCH(r1, 1)                        @ r1<- BBBB
802    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
803    mov     r9, rINST, lsr #8           @ r9<- AA
804    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
805    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
806    cmp     r0, #0                      @ not yet resolved?
807    beq     .LOP_CONST_CLASS_resolve
808    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
809    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
810    SET_VREG(r0, r9)                    @ vAA<- r0
811    GOTO_OPCODE(ip)                     @ jump to next instruction
812
813/* ------------------------------ */
814    .balign 64
815.L_OP_MONITOR_ENTER: /* 0x1d */
816/* File: armv5te/OP_MONITOR_ENTER.S */
817    /*
818     * Synchronize on an object.
819     */
820    /* monitor-enter vAA */
821    mov     r2, rINST, lsr #8           @ r2<- AA
822    GET_VREG(r1, r2)                    @ r1<- vAA (object)
823    mov     r0, rSELF                   @ r0<- self
824    cmp     r1, #0                      @ null object?
825    EXPORT_PC()                         @ need for precise GC
826    beq     common_errNullObject        @ null object, throw an exception
827    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
828    bl      dvmLockObject               @ call(self, obj)
829    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
830    GOTO_OPCODE(ip)                     @ jump to next instruction
831
832/* ------------------------------ */
833    .balign 64
834.L_OP_MONITOR_EXIT: /* 0x1e */
835/* File: armv5te/OP_MONITOR_EXIT.S */
836    /*
837     * Unlock an object.
838     *
839     * Exceptions that occur when unlocking a monitor need to appear as
840     * if they happened at the following instruction.  See the Dalvik
841     * instruction spec.
842     */
843    /* monitor-exit vAA */
844    mov     r2, rINST, lsr #8           @ r2<- AA
845    EXPORT_PC()                         @ before fetch: export the PC
846    GET_VREG(r1, r2)                    @ r1<- vAA (object)
847    cmp     r1, #0                      @ null object?
848    beq     1f                          @ yes
849    mov     r0, rSELF                   @ r0<- self
850    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
851    cmp     r0, #0                      @ failed?
852    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
853    beq     common_exceptionThrown      @ yes, exception is pending
854    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
855    GOTO_OPCODE(ip)                     @ jump to next instruction
8561:
857    FETCH_ADVANCE_INST(1)               @ advance before throw
858    b      common_errNullObject
859
860/* ------------------------------ */
861    .balign 64
862.L_OP_CHECK_CAST: /* 0x1f */
863/* File: armv5te/OP_CHECK_CAST.S */
864    /*
865     * Check to see if a cast from one class to another is allowed.
866     */
867    /* check-cast vAA, class@BBBB */
868    mov     r3, rINST, lsr #8           @ r3<- AA
869    FETCH(r2, 1)                        @ r2<- BBBB
870    GET_VREG(r9, r3)                    @ r9<- object
871    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
872    cmp     r9, #0                      @ is object null?
873    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
874    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
875    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
876    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
877    cmp     r1, #0                      @ have we resolved this before?
878    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
879.LOP_CHECK_CAST_resolved:
880    cmp     r0, r1                      @ same class (trivial success)?
881    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
882.LOP_CHECK_CAST_okay:
883    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
884    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
885    GOTO_OPCODE(ip)                     @ jump to next instruction
886
887/* ------------------------------ */
888    .balign 64
889.L_OP_INSTANCE_OF: /* 0x20 */
890/* File: armv5te/OP_INSTANCE_OF.S */
891    /*
892     * Check to see if an object reference is an instance of a class.
893     *
894     * Most common situation is a non-null object, being compared against
895     * an already-resolved class.
896     */
897    /* instance-of vA, vB, class@CCCC */
898    mov     r3, rINST, lsr #12          @ r3<- B
899    mov     r9, rINST, lsr #8           @ r9<- A+
900    GET_VREG(r0, r3)                    @ r0<- vB (object)
901    and     r9, r9, #15                 @ r9<- A
902    cmp     r0, #0                      @ is object null?
903    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
904    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
905    FETCH(r3, 1)                        @ r3<- CCCC
906    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
907    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
908    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
909    cmp     r1, #0                      @ have we resolved this before?
910    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
911.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
912    cmp     r0, r1                      @ same class (trivial success)?
913    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
914    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
915
916/* ------------------------------ */
917    .balign 64
918.L_OP_ARRAY_LENGTH: /* 0x21 */
919/* File: armv6t2/OP_ARRAY_LENGTH.S */
920    /*
921     * Return the length of an array.
922     */
923    mov     r1, rINST, lsr #12          @ r1<- B
924    ubfx    r2, rINST, #8, #4           @ r2<- A
925    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
926    cmp     r0, #0                      @ is object null?
927    beq     common_errNullObject        @ yup, fail
928    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
929    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
930    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
931    SET_VREG(r3, r2)                    @ vB<- length
932    GOTO_OPCODE(ip)                     @ jump to next instruction
933
934/* ------------------------------ */
935    .balign 64
936.L_OP_NEW_INSTANCE: /* 0x22 */
937/* File: armv5te/OP_NEW_INSTANCE.S */
938    /*
939     * Create a new instance of a class.
940     */
941    /* new-instance vAA, class@BBBB */
942    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
943    FETCH(r1, 1)                        @ r1<- BBBB
944    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
945    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
946#if defined(WITH_JIT)
947    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
948#endif
949    EXPORT_PC()                         @ req'd for init, resolve, alloc
950    cmp     r0, #0                      @ already resolved?
951    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
952.LOP_NEW_INSTANCE_resolved:   @ r0=class
953    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
954    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
955    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
956.LOP_NEW_INSTANCE_initialized: @ r0=class
957    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
958    bl      dvmAllocObject              @ r0<- new object
959    b       .LOP_NEW_INSTANCE_finish          @ continue
960
961/* ------------------------------ */
962    .balign 64
963.L_OP_NEW_ARRAY: /* 0x23 */
964/* File: armv5te/OP_NEW_ARRAY.S */
965    /*
966     * Allocate an array of objects, specified with the array class
967     * and a count.
968     *
969     * The verifier guarantees that this is an array class, so we don't
970     * check for it here.
971     */
972    /* new-array vA, vB, class@CCCC */
973    mov     r0, rINST, lsr #12          @ r0<- B
974    FETCH(r2, 1)                        @ r2<- CCCC
975    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
976    GET_VREG(r1, r0)                    @ r1<- vB (array length)
977    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
978    cmp     r1, #0                      @ check length
979    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
980    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
981    cmp     r0, #0                      @ already resolved?
982    EXPORT_PC()                         @ req'd for resolve, alloc
983    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
984    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
985
986/* ------------------------------ */
987    .balign 64
988.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
989/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
990    /*
991     * Create a new array with elements filled from registers.
992     *
993     * for: filled-new-array, filled-new-array/range
994     */
995    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
996    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
997    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
998    FETCH(r1, 1)                        @ r1<- BBBB
999    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1000    EXPORT_PC()                         @ need for resolve and alloc
1001    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1002    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1003    cmp     r0, #0                      @ already resolved?
1004    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
10058:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1006    mov     r2, #0                      @ r2<- false
1007    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1008    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1009    cmp     r0, #0                      @ got null?
1010    beq     common_exceptionThrown      @ yes, handle exception
1011    b       .LOP_FILLED_NEW_ARRAY_continue
1012
1013/* ------------------------------ */
1014    .balign 64
1015.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1016/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1017/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1018    /*
1019     * Create a new array with elements filled from registers.
1020     *
1021     * for: filled-new-array, filled-new-array/range
1022     */
1023    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1024    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1025    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
1026    FETCH(r1, 1)                        @ r1<- BBBB
1027    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1028    EXPORT_PC()                         @ need for resolve and alloc
1029    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1030    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1031    cmp     r0, #0                      @ already resolved?
1032    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
10338:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1034    mov     r2, #0                      @ r2<- false
1035    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1036    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1037    cmp     r0, #0                      @ got null?
1038    beq     common_exceptionThrown      @ yes, handle exception
1039    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1040
1041
1042/* ------------------------------ */
1043    .balign 64
1044.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1045/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1046    /* fill-array-data vAA, +BBBBBBBB */
1047    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1048    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1049    mov     r3, rINST, lsr #8           @ r3<- AA
1050    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1051    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1052    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1053    EXPORT_PC();
1054    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1055    cmp     r0, #0                      @ 0 means an exception is thrown
1056    beq     common_exceptionThrown      @ has exception
1057    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1058    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1059    GOTO_OPCODE(ip)                     @ jump to next instruction
1060
1061/* ------------------------------ */
1062    .balign 64
1063.L_OP_THROW: /* 0x27 */
1064/* File: armv5te/OP_THROW.S */
1065    /*
1066     * Throw an exception object in the current thread.
1067     */
1068    /* throw vAA */
1069    mov     r2, rINST, lsr #8           @ r2<- AA
1070    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1071    EXPORT_PC()                         @ exception handler can throw
1072    cmp     r1, #0                      @ null object?
1073    beq     common_errNullObject        @ yes, throw an NPE instead
1074    @ bypass dvmSetException, just store it
1075    str     r1, [rSELF, #offThread_exception]  @ thread->exception<- obj
1076    b       common_exceptionThrown
1077
1078/* ------------------------------ */
1079    .balign 64
1080.L_OP_GOTO: /* 0x28 */
1081/* File: armv5te/OP_GOTO.S */
1082    /*
1083     * Unconditional branch, 8-bit offset.
1084     *
1085     * The branch distance is a signed code-unit offset, which we need to
1086     * double to get a byte offset.
1087     */
1088    /* goto +AA */
1089    /* tuning: use sbfx for 6t2+ targets */
1090    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1091    movs    r1, r0, asr #24             @ r1<- ssssssAA (sign-extended)
1092    add     r2, r1, r1                  @ r2<- byte offset, set flags
1093       @ If backwards branch refresh rIBASE
1094    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1095    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1096#if defined(WITH_JIT)
1097    ldr     r0, [rSELF, #offThread_pJitProfTable]
1098    bmi     common_testUpdateProfile    @ (r0) check for trace hotness
1099#endif
1100    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1101    GOTO_OPCODE(ip)                     @ jump to next instruction
1102
1103/* ------------------------------ */
1104    .balign 64
1105.L_OP_GOTO_16: /* 0x29 */
1106/* File: armv5te/OP_GOTO_16.S */
1107    /*
1108     * Unconditional branch, 16-bit offset.
1109     *
1110     * The branch distance is a signed code-unit offset, which we need to
1111     * double to get a byte offset.
1112     */
1113    /* goto/16 +AAAA */
1114    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1115    adds    r1, r0, r0                  @ r1<- byte offset, flags set
1116    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1117    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1118#if defined(WITH_JIT)
1119    ldr     r0, [rSELF, #offThread_pJitProfTable]
1120    bmi     common_testUpdateProfile    @ (r0) hot trace head?
1121#endif
1122    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1123    GOTO_OPCODE(ip)                     @ jump to next instruction
1124
1125/* ------------------------------ */
1126    .balign 64
1127.L_OP_GOTO_32: /* 0x2a */
1128/* File: armv5te/OP_GOTO_32.S */
1129    /*
1130     * Unconditional branch, 32-bit offset.
1131     *
1132     * The branch distance is a signed code-unit offset, which we need to
1133     * double to get a byte offset.
1134     *
1135     * Unlike most opcodes, this one is allowed to branch to itself, so
1136     * our "backward branch" test must be "<=0" instead of "<0".  Because
1137     * we need the V bit set, we'll use an adds to convert from Dalvik
1138     * offset to byte offset.
1139     */
1140    /* goto/32 +AAAAAAAA */
1141    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1142    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1143    orr     r0, r0, r1, lsl #16         @ r0<- AAAAaaaa
1144    adds    r1, r0, r0                  @ r1<- byte offset
1145#if defined(WITH_JIT)
1146    ldr     r0, [rSELF, #offThread_pJitProfTable]
1147    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1148    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1149    ble     common_testUpdateProfile    @ (r0) hot trace head?
1150#else
1151    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1152    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1153#endif
1154    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1155    GOTO_OPCODE(ip)                     @ jump to next instruction
1156
1157/* ------------------------------ */
1158    .balign 64
1159.L_OP_PACKED_SWITCH: /* 0x2b */
1160/* File: armv5te/OP_PACKED_SWITCH.S */
1161    /*
1162     * Handle a packed-switch or sparse-switch instruction.  In both cases
1163     * we decode it and hand it off to a helper function.
1164     *
1165     * We don't really expect backward branches in a switch statement, but
1166     * they're perfectly legal, so we check for them here.
1167     *
1168     * When the JIT is present, all targets are considered treated as
1169     * a potential trace heads regardless of branch direction.
1170     *
1171     * for: packed-switch, sparse-switch
1172     */
1173    /* op vAA, +BBBB */
1174    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1175    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1176    mov     r3, rINST, lsr #8           @ r3<- AA
1177    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1178    GET_VREG(r1, r3)                    @ r1<- vAA
1179    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1180    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1181    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1182#if defined(WITH_JIT)
1183    ldr     r0, [rSELF, #offThread_pJitProfTable]
1184    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1185    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1186    cmp     r0, #0
1187    bne     common_updateProfile
1188#else
1189    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1190    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1191#endif
1192    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1193    GOTO_OPCODE(ip)                     @ jump to next instruction
1194
1195/* ------------------------------ */
1196    .balign 64
1197.L_OP_SPARSE_SWITCH: /* 0x2c */
1198/* File: armv5te/OP_SPARSE_SWITCH.S */
1199/* File: armv5te/OP_PACKED_SWITCH.S */
1200    /*
1201     * Handle a packed-switch or sparse-switch instruction.  In both cases
1202     * we decode it and hand it off to a helper function.
1203     *
1204     * We don't really expect backward branches in a switch statement, but
1205     * they're perfectly legal, so we check for them here.
1206     *
1207     * When the JIT is present, all targets are considered treated as
1208     * a potential trace heads regardless of branch direction.
1209     *
1210     * for: packed-switch, sparse-switch
1211     */
1212    /* op vAA, +BBBB */
1213    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1214    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1215    mov     r3, rINST, lsr #8           @ r3<- AA
1216    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1217    GET_VREG(r1, r3)                    @ r1<- vAA
1218    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1219    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1220    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1221#if defined(WITH_JIT)
1222    ldr     r0, [rSELF, #offThread_pJitProfTable]
1223    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1224    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1225    cmp     r0, #0
1226    bne     common_updateProfile
1227#else
1228    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1229    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1230#endif
1231    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1232    GOTO_OPCODE(ip)                     @ jump to next instruction
1233
1234
1235/* ------------------------------ */
1236    .balign 64
1237.L_OP_CMPL_FLOAT: /* 0x2d */
1238/* File: arm-vfp/OP_CMPL_FLOAT.S */
1239    /*
1240     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1241     * destination register based on the results of the comparison.
1242     *
1243     * int compare(x, y) {
1244     *     if (x == y) {
1245     *         return 0;
1246     *     } else if (x > y) {
1247     *         return 1;
1248     *     } else if (x < y) {
1249     *         return -1;
1250     *     } else {
1251     *         return -1;
1252     *     }
1253     * }
1254     */
1255    /* op vAA, vBB, vCC */
1256    FETCH(r0, 1)                        @ r0<- CCBB
1257    mov     r9, rINST, lsr #8           @ r9<- AA
1258    and     r2, r0, #255                @ r2<- BB
1259    mov     r3, r0, lsr #8              @ r3<- CC
1260    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1261    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1262    flds    s0, [r2]                    @ s0<- vBB
1263    flds    s1, [r3]                    @ s1<- vCC
1264    fcmpes  s0, s1                      @ compare (vBB, vCC)
1265    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1266    mvn     r0, #0                      @ r0<- -1 (default)
1267    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1268    fmstat                              @ export status flags
1269    movgt   r0, #1                      @ (greater than) r1<- 1
1270    moveq   r0, #0                      @ (equal) r1<- 0
1271    b       .LOP_CMPL_FLOAT_finish          @ argh
1272
1273
1274/* ------------------------------ */
1275    .balign 64
1276.L_OP_CMPG_FLOAT: /* 0x2e */
1277/* File: arm-vfp/OP_CMPG_FLOAT.S */
1278    /*
1279     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1280     * destination register based on the results of the comparison.
1281     *
1282     * int compare(x, y) {
1283     *     if (x == y) {
1284     *         return 0;
1285     *     } else if (x < y) {
1286     *         return -1;
1287     *     } else if (x > y) {
1288     *         return 1;
1289     *     } else {
1290     *         return 1;
1291     *     }
1292     * }
1293     */
1294    /* op vAA, vBB, vCC */
1295    FETCH(r0, 1)                        @ r0<- CCBB
1296    mov     r9, rINST, lsr #8           @ r9<- AA
1297    and     r2, r0, #255                @ r2<- BB
1298    mov     r3, r0, lsr #8              @ r3<- CC
1299    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1300    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1301    flds    s0, [r2]                    @ s0<- vBB
1302    flds    s1, [r3]                    @ s1<- vCC
1303    fcmpes  s0, s1                      @ compare (vBB, vCC)
1304    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1305    mov     r0, #1                      @ r0<- 1 (default)
1306    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1307    fmstat                              @ export status flags
1308    mvnmi   r0, #0                      @ (less than) r1<- -1
1309    moveq   r0, #0                      @ (equal) r1<- 0
1310    b       .LOP_CMPG_FLOAT_finish          @ argh
1311
1312
1313/* ------------------------------ */
1314    .balign 64
1315.L_OP_CMPL_DOUBLE: /* 0x2f */
1316/* File: arm-vfp/OP_CMPL_DOUBLE.S */
1317    /*
1318     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1319     * destination register based on the results of the comparison.
1320     *
1321     * int compare(x, y) {
1322     *     if (x == y) {
1323     *         return 0;
1324     *     } else if (x > y) {
1325     *         return 1;
1326     *     } else if (x < y) {
1327     *         return -1;
1328     *     } else {
1329     *         return -1;
1330     *     }
1331     * }
1332     */
1333    /* op vAA, vBB, vCC */
1334    FETCH(r0, 1)                        @ r0<- CCBB
1335    mov     r9, rINST, lsr #8           @ r9<- AA
1336    and     r2, r0, #255                @ r2<- BB
1337    mov     r3, r0, lsr #8              @ r3<- CC
1338    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1339    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1340    fldd    d0, [r2]                    @ d0<- vBB
1341    fldd    d1, [r3]                    @ d1<- vCC
1342    fcmped  d0, d1                      @ compare (vBB, vCC)
1343    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1344    mvn     r0, #0                      @ r0<- -1 (default)
1345    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1346    fmstat                              @ export status flags
1347    movgt   r0, #1                      @ (greater than) r1<- 1
1348    moveq   r0, #0                      @ (equal) r1<- 0
1349    b       .LOP_CMPL_DOUBLE_finish          @ argh
1350
1351
1352/* ------------------------------ */
1353    .balign 64
1354.L_OP_CMPG_DOUBLE: /* 0x30 */
1355/* File: arm-vfp/OP_CMPG_DOUBLE.S */
1356    /*
1357     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1358     * destination register based on the results of the comparison.
1359     *
1360     * int compare(x, y) {
1361     *     if (x == y) {
1362     *         return 0;
1363     *     } else if (x < y) {
1364     *         return -1;
1365     *     } else if (x > y) {
1366     *         return 1;
1367     *     } else {
1368     *         return 1;
1369     *     }
1370     * }
1371     */
1372    /* op vAA, vBB, vCC */
1373    FETCH(r0, 1)                        @ r0<- CCBB
1374    mov     r9, rINST, lsr #8           @ r9<- AA
1375    and     r2, r0, #255                @ r2<- BB
1376    mov     r3, r0, lsr #8              @ r3<- CC
1377    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1378    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1379    fldd    d0, [r2]                    @ d0<- vBB
1380    fldd    d1, [r3]                    @ d1<- vCC
1381    fcmped  d0, d1                      @ compare (vBB, vCC)
1382    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1383    mov     r0, #1                      @ r0<- 1 (default)
1384    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1385    fmstat                              @ export status flags
1386    mvnmi   r0, #0                      @ (less than) r1<- -1
1387    moveq   r0, #0                      @ (equal) r1<- 0
1388    b       .LOP_CMPG_DOUBLE_finish          @ argh
1389
1390
1391/* ------------------------------ */
1392    .balign 64
1393.L_OP_CMP_LONG: /* 0x31 */
1394/* File: armv5te/OP_CMP_LONG.S */
1395    /*
1396     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1397     * register based on the results of the comparison.
1398     *
1399     * We load the full values with LDM, but in practice many values could
1400     * be resolved by only looking at the high word.  This could be made
1401     * faster or slower by splitting the LDM into a pair of LDRs.
1402     *
1403     * If we just wanted to set condition flags, we could do this:
1404     *  subs    ip, r0, r2
1405     *  sbcs    ip, r1, r3
1406     *  subeqs  ip, r0, r2
1407     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1408     * integer value, which we can do with 2 conditional mov/mvn instructions
1409     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1410     * us a constant 5-cycle path plus a branch at the end to the
1411     * instruction epilogue code.  The multi-compare approach below needs
1412     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1413     * in the worst case (the 64-bit values are equal).
1414     */
1415    /* cmp-long vAA, vBB, vCC */
1416    FETCH(r0, 1)                        @ r0<- CCBB
1417    mov     r9, rINST, lsr #8           @ r9<- AA
1418    and     r2, r0, #255                @ r2<- BB
1419    mov     r3, r0, lsr #8              @ r3<- CC
1420    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1421    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1422    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1423    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1424    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1425    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1426    bgt     .LOP_CMP_LONG_greater
1427    subs    r1, r0, r2                  @ r1<- r0 - r2
1428    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1429    bne     .LOP_CMP_LONG_less
1430    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1431
1432/* ------------------------------ */
1433    .balign 64
1434.L_OP_IF_EQ: /* 0x32 */
1435/* File: armv6t2/OP_IF_EQ.S */
1436/* File: armv6t2/bincmp.S */
1437    /*
1438     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1439     * fragment that specifies the *reverse* comparison to perform, e.g.
1440     * for "if-le" you would use "gt".
1441     *
1442     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1443     */
1444    /* if-cmp vA, vB, +CCCC */
1445    mov     r1, rINST, lsr #12          @ r1<- B
1446    ubfx    r0, rINST, #8, #4           @ r0<- A
1447    GET_VREG(r3, r1)                    @ r3<- vB
1448    GET_VREG(r2, r0)                    @ r2<- vA
1449    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1450    cmp     r2, r3                      @ compare (vA, vB)
1451    movne r1, #2                 @ r1<- BYTE branch dist for not-taken
1452    adds    r2, r1, r1                  @ convert to bytes, check sign
1453    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1454#if defined(WITH_JIT)
1455    ldr     r0, [rSELF, #offThread_pJitProfTable]
1456    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1457    cmp     r0, #0
1458    bne     common_updateProfile
1459#else
1460    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1461#endif
1462    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1463    GOTO_OPCODE(ip)                     @ jump to next instruction
1464
1465
1466/* ------------------------------ */
1467    .balign 64
1468.L_OP_IF_NE: /* 0x33 */
1469/* File: armv6t2/OP_IF_NE.S */
1470/* File: armv6t2/bincmp.S */
1471    /*
1472     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1473     * fragment that specifies the *reverse* comparison to perform, e.g.
1474     * for "if-le" you would use "gt".
1475     *
1476     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1477     */
1478    /* if-cmp vA, vB, +CCCC */
1479    mov     r1, rINST, lsr #12          @ r1<- B
1480    ubfx    r0, rINST, #8, #4           @ r0<- A
1481    GET_VREG(r3, r1)                    @ r3<- vB
1482    GET_VREG(r2, r0)                    @ r2<- vA
1483    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1484    cmp     r2, r3                      @ compare (vA, vB)
1485    moveq r1, #2                 @ r1<- BYTE branch dist for not-taken
1486    adds    r2, r1, r1                  @ convert to bytes, check sign
1487    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1488#if defined(WITH_JIT)
1489    ldr     r0, [rSELF, #offThread_pJitProfTable]
1490    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1491    cmp     r0, #0
1492    bne     common_updateProfile
1493#else
1494    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1495#endif
1496    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1497    GOTO_OPCODE(ip)                     @ jump to next instruction
1498
1499
1500/* ------------------------------ */
1501    .balign 64
1502.L_OP_IF_LT: /* 0x34 */
1503/* File: armv6t2/OP_IF_LT.S */
1504/* File: armv6t2/bincmp.S */
1505    /*
1506     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1507     * fragment that specifies the *reverse* comparison to perform, e.g.
1508     * for "if-le" you would use "gt".
1509     *
1510     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1511     */
1512    /* if-cmp vA, vB, +CCCC */
1513    mov     r1, rINST, lsr #12          @ r1<- B
1514    ubfx    r0, rINST, #8, #4           @ r0<- A
1515    GET_VREG(r3, r1)                    @ r3<- vB
1516    GET_VREG(r2, r0)                    @ r2<- vA
1517    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1518    cmp     r2, r3                      @ compare (vA, vB)
1519    movge r1, #2                 @ r1<- BYTE branch dist for not-taken
1520    adds    r2, r1, r1                  @ convert to bytes, check sign
1521    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1522#if defined(WITH_JIT)
1523    ldr     r0, [rSELF, #offThread_pJitProfTable]
1524    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1525    cmp     r0, #0
1526    bne     common_updateProfile
1527#else
1528    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1529#endif
1530    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1531    GOTO_OPCODE(ip)                     @ jump to next instruction
1532
1533
1534/* ------------------------------ */
1535    .balign 64
1536.L_OP_IF_GE: /* 0x35 */
1537/* File: armv6t2/OP_IF_GE.S */
1538/* File: armv6t2/bincmp.S */
1539    /*
1540     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1541     * fragment that specifies the *reverse* comparison to perform, e.g.
1542     * for "if-le" you would use "gt".
1543     *
1544     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1545     */
1546    /* if-cmp vA, vB, +CCCC */
1547    mov     r1, rINST, lsr #12          @ r1<- B
1548    ubfx    r0, rINST, #8, #4           @ r0<- A
1549    GET_VREG(r3, r1)                    @ r3<- vB
1550    GET_VREG(r2, r0)                    @ r2<- vA
1551    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1552    cmp     r2, r3                      @ compare (vA, vB)
1553    movlt r1, #2                 @ r1<- BYTE branch dist for not-taken
1554    adds    r2, r1, r1                  @ convert to bytes, check sign
1555    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1556#if defined(WITH_JIT)
1557    ldr     r0, [rSELF, #offThread_pJitProfTable]
1558    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1559    cmp     r0, #0
1560    bne     common_updateProfile
1561#else
1562    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1563#endif
1564    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1565    GOTO_OPCODE(ip)                     @ jump to next instruction
1566
1567
1568/* ------------------------------ */
1569    .balign 64
1570.L_OP_IF_GT: /* 0x36 */
1571/* File: armv6t2/OP_IF_GT.S */
1572/* File: armv6t2/bincmp.S */
1573    /*
1574     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1575     * fragment that specifies the *reverse* comparison to perform, e.g.
1576     * for "if-le" you would use "gt".
1577     *
1578     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1579     */
1580    /* if-cmp vA, vB, +CCCC */
1581    mov     r1, rINST, lsr #12          @ r1<- B
1582    ubfx    r0, rINST, #8, #4           @ r0<- A
1583    GET_VREG(r3, r1)                    @ r3<- vB
1584    GET_VREG(r2, r0)                    @ r2<- vA
1585    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1586    cmp     r2, r3                      @ compare (vA, vB)
1587    movle r1, #2                 @ r1<- BYTE branch dist for not-taken
1588    adds    r2, r1, r1                  @ convert to bytes, check sign
1589    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1590#if defined(WITH_JIT)
1591    ldr     r0, [rSELF, #offThread_pJitProfTable]
1592    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1593    cmp     r0, #0
1594    bne     common_updateProfile
1595#else
1596    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1597#endif
1598    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1599    GOTO_OPCODE(ip)                     @ jump to next instruction
1600
1601
1602/* ------------------------------ */
1603    .balign 64
1604.L_OP_IF_LE: /* 0x37 */
1605/* File: armv6t2/OP_IF_LE.S */
1606/* File: armv6t2/bincmp.S */
1607    /*
1608     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1609     * fragment that specifies the *reverse* comparison to perform, e.g.
1610     * for "if-le" you would use "gt".
1611     *
1612     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1613     */
1614    /* if-cmp vA, vB, +CCCC */
1615    mov     r1, rINST, lsr #12          @ r1<- B
1616    ubfx    r0, rINST, #8, #4           @ r0<- A
1617    GET_VREG(r3, r1)                    @ r3<- vB
1618    GET_VREG(r2, r0)                    @ r2<- vA
1619    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1620    cmp     r2, r3                      @ compare (vA, vB)
1621    movgt r1, #2                 @ r1<- BYTE branch dist for not-taken
1622    adds    r2, r1, r1                  @ convert to bytes, check sign
1623    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1624#if defined(WITH_JIT)
1625    ldr     r0, [rSELF, #offThread_pJitProfTable]
1626    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1627    cmp     r0, #0
1628    bne     common_updateProfile
1629#else
1630    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1631#endif
1632    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1633    GOTO_OPCODE(ip)                     @ jump to next instruction
1634
1635
1636/* ------------------------------ */
1637    .balign 64
1638.L_OP_IF_EQZ: /* 0x38 */
1639/* File: armv5te/OP_IF_EQZ.S */
1640/* File: armv5te/zcmp.S */
1641    /*
1642     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1643     * fragment that specifies the *reverse* comparison to perform, e.g.
1644     * for "if-le" you would use "gt".
1645     *
1646     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1647     */
1648    /* if-cmp vAA, +BBBB */
1649    mov     r0, rINST, lsr #8           @ r0<- AA
1650    GET_VREG(r2, r0)                    @ r2<- vAA
1651    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1652    cmp     r2, #0                      @ compare (vA, 0)
1653    movne r1, #2                 @ r1<- inst branch dist for not-taken
1654    adds    r1, r1, r1                  @ convert to bytes & set flags
1655    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1656#if defined(WITH_JIT)
1657    ldr     r0, [rSELF, #offThread_pJitProfTable]
1658    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1659    cmp     r0,#0
1660    bne     common_updateProfile        @ test for JIT off at target
1661#else
1662    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1663#endif
1664    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1665    GOTO_OPCODE(ip)                     @ jump to next instruction
1666
1667
1668/* ------------------------------ */
1669    .balign 64
1670.L_OP_IF_NEZ: /* 0x39 */
1671/* File: armv5te/OP_IF_NEZ.S */
1672/* File: armv5te/zcmp.S */
1673    /*
1674     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1675     * fragment that specifies the *reverse* comparison to perform, e.g.
1676     * for "if-le" you would use "gt".
1677     *
1678     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1679     */
1680    /* if-cmp vAA, +BBBB */
1681    mov     r0, rINST, lsr #8           @ r0<- AA
1682    GET_VREG(r2, r0)                    @ r2<- vAA
1683    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1684    cmp     r2, #0                      @ compare (vA, 0)
1685    moveq r1, #2                 @ r1<- inst branch dist for not-taken
1686    adds    r1, r1, r1                  @ convert to bytes & set flags
1687    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1688#if defined(WITH_JIT)
1689    ldr     r0, [rSELF, #offThread_pJitProfTable]
1690    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1691    cmp     r0,#0
1692    bne     common_updateProfile        @ test for JIT off at target
1693#else
1694    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1695#endif
1696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1697    GOTO_OPCODE(ip)                     @ jump to next instruction
1698
1699
1700/* ------------------------------ */
1701    .balign 64
1702.L_OP_IF_LTZ: /* 0x3a */
1703/* File: armv5te/OP_IF_LTZ.S */
1704/* File: armv5te/zcmp.S */
1705    /*
1706     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1707     * fragment that specifies the *reverse* comparison to perform, e.g.
1708     * for "if-le" you would use "gt".
1709     *
1710     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1711     */
1712    /* if-cmp vAA, +BBBB */
1713    mov     r0, rINST, lsr #8           @ r0<- AA
1714    GET_VREG(r2, r0)                    @ r2<- vAA
1715    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1716    cmp     r2, #0                      @ compare (vA, 0)
1717    movge r1, #2                 @ r1<- inst branch dist for not-taken
1718    adds    r1, r1, r1                  @ convert to bytes & set flags
1719    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1720#if defined(WITH_JIT)
1721    ldr     r0, [rSELF, #offThread_pJitProfTable]
1722    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1723    cmp     r0,#0
1724    bne     common_updateProfile        @ test for JIT off at target
1725#else
1726    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1727#endif
1728    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1729    GOTO_OPCODE(ip)                     @ jump to next instruction
1730
1731
1732/* ------------------------------ */
1733    .balign 64
1734.L_OP_IF_GEZ: /* 0x3b */
1735/* File: armv5te/OP_IF_GEZ.S */
1736/* File: armv5te/zcmp.S */
1737    /*
1738     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1739     * fragment that specifies the *reverse* comparison to perform, e.g.
1740     * for "if-le" you would use "gt".
1741     *
1742     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1743     */
1744    /* if-cmp vAA, +BBBB */
1745    mov     r0, rINST, lsr #8           @ r0<- AA
1746    GET_VREG(r2, r0)                    @ r2<- vAA
1747    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1748    cmp     r2, #0                      @ compare (vA, 0)
1749    movlt r1, #2                 @ r1<- inst branch dist for not-taken
1750    adds    r1, r1, r1                  @ convert to bytes & set flags
1751    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1752#if defined(WITH_JIT)
1753    ldr     r0, [rSELF, #offThread_pJitProfTable]
1754    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1755    cmp     r0,#0
1756    bne     common_updateProfile        @ test for JIT off at target
1757#else
1758    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1759#endif
1760    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1761    GOTO_OPCODE(ip)                     @ jump to next instruction
1762
1763
1764/* ------------------------------ */
1765    .balign 64
1766.L_OP_IF_GTZ: /* 0x3c */
1767/* File: armv5te/OP_IF_GTZ.S */
1768/* File: armv5te/zcmp.S */
1769    /*
1770     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1771     * fragment that specifies the *reverse* comparison to perform, e.g.
1772     * for "if-le" you would use "gt".
1773     *
1774     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1775     */
1776    /* if-cmp vAA, +BBBB */
1777    mov     r0, rINST, lsr #8           @ r0<- AA
1778    GET_VREG(r2, r0)                    @ r2<- vAA
1779    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1780    cmp     r2, #0                      @ compare (vA, 0)
1781    movle r1, #2                 @ r1<- inst branch dist for not-taken
1782    adds    r1, r1, r1                  @ convert to bytes & set flags
1783    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1784#if defined(WITH_JIT)
1785    ldr     r0, [rSELF, #offThread_pJitProfTable]
1786    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1787    cmp     r0,#0
1788    bne     common_updateProfile        @ test for JIT off at target
1789#else
1790    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1791#endif
1792    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1793    GOTO_OPCODE(ip)                     @ jump to next instruction
1794
1795
1796/* ------------------------------ */
1797    .balign 64
1798.L_OP_IF_LEZ: /* 0x3d */
1799/* File: armv5te/OP_IF_LEZ.S */
1800/* File: armv5te/zcmp.S */
1801    /*
1802     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1803     * fragment that specifies the *reverse* comparison to perform, e.g.
1804     * for "if-le" you would use "gt".
1805     *
1806     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1807     */
1808    /* if-cmp vAA, +BBBB */
1809    mov     r0, rINST, lsr #8           @ r0<- AA
1810    GET_VREG(r2, r0)                    @ r2<- vAA
1811    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1812    cmp     r2, #0                      @ compare (vA, 0)
1813    movgt r1, #2                 @ r1<- inst branch dist for not-taken
1814    adds    r1, r1, r1                  @ convert to bytes & set flags
1815    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1816#if defined(WITH_JIT)
1817    ldr     r0, [rSELF, #offThread_pJitProfTable]
1818    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1819    cmp     r0,#0
1820    bne     common_updateProfile        @ test for JIT off at target
1821#else
1822    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1823#endif
1824    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1825    GOTO_OPCODE(ip)                     @ jump to next instruction
1826
1827
1828/* ------------------------------ */
1829    .balign 64
1830.L_OP_UNUSED_3E: /* 0x3e */
1831/* File: armv5te/OP_UNUSED_3E.S */
1832/* File: armv5te/unused.S */
1833    bl      common_abort
1834
1835
1836/* ------------------------------ */
1837    .balign 64
1838.L_OP_UNUSED_3F: /* 0x3f */
1839/* File: armv5te/OP_UNUSED_3F.S */
1840/* File: armv5te/unused.S */
1841    bl      common_abort
1842
1843
1844/* ------------------------------ */
1845    .balign 64
1846.L_OP_UNUSED_40: /* 0x40 */
1847/* File: armv5te/OP_UNUSED_40.S */
1848/* File: armv5te/unused.S */
1849    bl      common_abort
1850
1851
1852/* ------------------------------ */
1853    .balign 64
1854.L_OP_UNUSED_41: /* 0x41 */
1855/* File: armv5te/OP_UNUSED_41.S */
1856/* File: armv5te/unused.S */
1857    bl      common_abort
1858
1859
1860/* ------------------------------ */
1861    .balign 64
1862.L_OP_UNUSED_42: /* 0x42 */
1863/* File: armv5te/OP_UNUSED_42.S */
1864/* File: armv5te/unused.S */
1865    bl      common_abort
1866
1867
1868/* ------------------------------ */
1869    .balign 64
1870.L_OP_UNUSED_43: /* 0x43 */
1871/* File: armv5te/OP_UNUSED_43.S */
1872/* File: armv5te/unused.S */
1873    bl      common_abort
1874
1875
1876/* ------------------------------ */
1877    .balign 64
1878.L_OP_AGET: /* 0x44 */
1879/* File: armv5te/OP_AGET.S */
1880    /*
1881     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1882     *
1883     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1884     * instructions.  We use a pair of FETCH_Bs instead.
1885     *
1886     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1887     */
1888    /* op vAA, vBB, vCC */
1889    FETCH_B(r2, 1, 0)                   @ r2<- BB
1890    mov     r9, rINST, lsr #8           @ r9<- AA
1891    FETCH_B(r3, 1, 1)                   @ r3<- CC
1892    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1893    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1894    cmp     r0, #0                      @ null array object?
1895    beq     common_errNullObject        @ yes, bail
1896    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1897    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1898    cmp     r1, r3                      @ compare unsigned index, length
1899    bcs     common_errArrayIndex        @ index >= length, bail
1900    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1901    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1902    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1903    SET_VREG(r2, r9)                    @ vAA<- r2
1904    GOTO_OPCODE(ip)                     @ jump to next instruction
1905
1906/* ------------------------------ */
1907    .balign 64
1908.L_OP_AGET_WIDE: /* 0x45 */
1909/* File: armv5te/OP_AGET_WIDE.S */
1910    /*
1911     * Array get, 64 bits.  vAA <- vBB[vCC].
1912     *
1913     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
1914     */
1915    /* aget-wide vAA, vBB, vCC */
1916    FETCH(r0, 1)                        @ r0<- CCBB
1917    mov     r9, rINST, lsr #8           @ r9<- AA
1918    and     r2, r0, #255                @ r2<- BB
1919    mov     r3, r0, lsr #8              @ r3<- CC
1920    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1921    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1922    cmp     r0, #0                      @ null array object?
1923    beq     common_errNullObject        @ yes, bail
1924    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1925    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
1926    cmp     r1, r3                      @ compare unsigned index, length
1927    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
1928    b       common_errArrayIndex        @ index >= length, bail
1929    @ May want to swap the order of these two branches depending on how the
1930    @ branch prediction (if any) handles conditional forward branches vs.
1931    @ unconditional forward branches.
1932
1933/* ------------------------------ */
1934    .balign 64
1935.L_OP_AGET_OBJECT: /* 0x46 */
1936/* File: armv5te/OP_AGET_OBJECT.S */
1937/* File: armv5te/OP_AGET.S */
1938    /*
1939     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1940     *
1941     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1942     * instructions.  We use a pair of FETCH_Bs instead.
1943     *
1944     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1945     */
1946    /* op vAA, vBB, vCC */
1947    FETCH_B(r2, 1, 0)                   @ r2<- BB
1948    mov     r9, rINST, lsr #8           @ r9<- AA
1949    FETCH_B(r3, 1, 1)                   @ r3<- CC
1950    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1951    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1952    cmp     r0, #0                      @ null array object?
1953    beq     common_errNullObject        @ yes, bail
1954    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1955    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1956    cmp     r1, r3                      @ compare unsigned index, length
1957    bcs     common_errArrayIndex        @ index >= length, bail
1958    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1959    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1960    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1961    SET_VREG(r2, r9)                    @ vAA<- r2
1962    GOTO_OPCODE(ip)                     @ jump to next instruction
1963
1964
1965/* ------------------------------ */
1966    .balign 64
1967.L_OP_AGET_BOOLEAN: /* 0x47 */
1968/* File: armv5te/OP_AGET_BOOLEAN.S */
1969/* File: armv5te/OP_AGET.S */
1970    /*
1971     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1972     *
1973     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1974     * instructions.  We use a pair of FETCH_Bs instead.
1975     *
1976     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1977     */
1978    /* op vAA, vBB, vCC */
1979    FETCH_B(r2, 1, 0)                   @ r2<- BB
1980    mov     r9, rINST, lsr #8           @ r9<- AA
1981    FETCH_B(r3, 1, 1)                   @ r3<- CC
1982    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1983    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1984    cmp     r0, #0                      @ null array object?
1985    beq     common_errNullObject        @ yes, bail
1986    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1987    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
1988    cmp     r1, r3                      @ compare unsigned index, length
1989    bcs     common_errArrayIndex        @ index >= length, bail
1990    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1991    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1992    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1993    SET_VREG(r2, r9)                    @ vAA<- r2
1994    GOTO_OPCODE(ip)                     @ jump to next instruction
1995
1996
1997/* ------------------------------ */
1998    .balign 64
1999.L_OP_AGET_BYTE: /* 0x48 */
2000/* File: armv5te/OP_AGET_BYTE.S */
2001/* File: armv5te/OP_AGET.S */
2002    /*
2003     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2004     *
2005     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2006     * instructions.  We use a pair of FETCH_Bs instead.
2007     *
2008     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2009     */
2010    /* op vAA, vBB, vCC */
2011    FETCH_B(r2, 1, 0)                   @ r2<- BB
2012    mov     r9, rINST, lsr #8           @ r9<- AA
2013    FETCH_B(r3, 1, 1)                   @ r3<- CC
2014    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2015    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2016    cmp     r0, #0                      @ null array object?
2017    beq     common_errNullObject        @ yes, bail
2018    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2019    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2020    cmp     r1, r3                      @ compare unsigned index, length
2021    bcs     common_errArrayIndex        @ index >= length, bail
2022    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2023    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2024    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2025    SET_VREG(r2, r9)                    @ vAA<- r2
2026    GOTO_OPCODE(ip)                     @ jump to next instruction
2027
2028
2029/* ------------------------------ */
2030    .balign 64
2031.L_OP_AGET_CHAR: /* 0x49 */
2032/* File: armv5te/OP_AGET_CHAR.S */
2033/* File: armv5te/OP_AGET.S */
2034    /*
2035     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2036     *
2037     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2038     * instructions.  We use a pair of FETCH_Bs instead.
2039     *
2040     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2041     */
2042    /* op vAA, vBB, vCC */
2043    FETCH_B(r2, 1, 0)                   @ r2<- BB
2044    mov     r9, rINST, lsr #8           @ r9<- AA
2045    FETCH_B(r3, 1, 1)                   @ r3<- CC
2046    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2047    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2048    cmp     r0, #0                      @ null array object?
2049    beq     common_errNullObject        @ yes, bail
2050    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2051    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2052    cmp     r1, r3                      @ compare unsigned index, length
2053    bcs     common_errArrayIndex        @ index >= length, bail
2054    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2055    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2056    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2057    SET_VREG(r2, r9)                    @ vAA<- r2
2058    GOTO_OPCODE(ip)                     @ jump to next instruction
2059
2060
2061/* ------------------------------ */
2062    .balign 64
2063.L_OP_AGET_SHORT: /* 0x4a */
2064/* File: armv5te/OP_AGET_SHORT.S */
2065/* File: armv5te/OP_AGET.S */
2066    /*
2067     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2068     *
2069     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2070     * instructions.  We use a pair of FETCH_Bs instead.
2071     *
2072     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2073     */
2074    /* op vAA, vBB, vCC */
2075    FETCH_B(r2, 1, 0)                   @ r2<- BB
2076    mov     r9, rINST, lsr #8           @ r9<- AA
2077    FETCH_B(r3, 1, 1)                   @ r3<- CC
2078    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2079    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2080    cmp     r0, #0                      @ null array object?
2081    beq     common_errNullObject        @ yes, bail
2082    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2083    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2084    cmp     r1, r3                      @ compare unsigned index, length
2085    bcs     common_errArrayIndex        @ index >= length, bail
2086    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2087    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2088    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2089    SET_VREG(r2, r9)                    @ vAA<- r2
2090    GOTO_OPCODE(ip)                     @ jump to next instruction
2091
2092
2093/* ------------------------------ */
2094    .balign 64
2095.L_OP_APUT: /* 0x4b */
2096/* File: armv5te/OP_APUT.S */
2097    /*
2098     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2099     *
2100     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2101     * instructions.  We use a pair of FETCH_Bs instead.
2102     *
2103     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2104     */
2105    /* op vAA, vBB, vCC */
2106    FETCH_B(r2, 1, 0)                   @ r2<- BB
2107    mov     r9, rINST, lsr #8           @ r9<- AA
2108    FETCH_B(r3, 1, 1)                   @ r3<- CC
2109    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2110    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2111    cmp     r0, #0                      @ null array object?
2112    beq     common_errNullObject        @ yes, bail
2113    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2114    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2115    cmp     r1, r3                      @ compare unsigned index, length
2116    bcs     common_errArrayIndex        @ index >= length, bail
2117    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2118    GET_VREG(r2, r9)                    @ r2<- vAA
2119    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2120    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2121    GOTO_OPCODE(ip)                     @ jump to next instruction
2122
2123/* ------------------------------ */
2124    .balign 64
2125.L_OP_APUT_WIDE: /* 0x4c */
2126/* File: armv5te/OP_APUT_WIDE.S */
2127    /*
2128     * Array put, 64 bits.  vBB[vCC] <- vAA.
2129     *
2130     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2131     */
2132    /* aput-wide vAA, vBB, vCC */
2133    FETCH(r0, 1)                        @ r0<- CCBB
2134    mov     r9, rINST, lsr #8           @ r9<- AA
2135    and     r2, r0, #255                @ r2<- BB
2136    mov     r3, r0, lsr #8              @ r3<- CC
2137    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2138    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2139    cmp     r0, #0                      @ null array object?
2140    beq     common_errNullObject        @ yes, bail
2141    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2142    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2143    cmp     r1, r3                      @ compare unsigned index, length
2144    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2145    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2146    b       common_errArrayIndex        @ index >= length, bail
2147    @ May want to swap the order of these two branches depending on how the
2148    @ branch prediction (if any) handles conditional forward branches vs.
2149    @ unconditional forward branches.
2150
2151/* ------------------------------ */
2152    .balign 64
2153.L_OP_APUT_OBJECT: /* 0x4d */
2154/* File: armv5te/OP_APUT_OBJECT.S */
2155    /*
2156     * Store an object into an array.  vBB[vCC] <- vAA.
2157     */
2158    /* op vAA, vBB, vCC */
2159    FETCH(r0, 1)                        @ r0<- CCBB
2160    mov     r9, rINST, lsr #8           @ r9<- AA
2161    and     r2, r0, #255                @ r2<- BB
2162    mov     r3, r0, lsr #8              @ r3<- CC
2163    GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
2164    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2165    cmp     rINST, #0                   @ null array object?
2166    GET_VREG(r9, r9)                    @ r9<- vAA
2167    beq     common_errNullObject        @ yes, bail
2168    ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
2169    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
2170    cmp     r1, r3                      @ compare unsigned index, length
2171    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2172    b       common_errArrayIndex        @ index >= length, bail
2173
2174
2175/* ------------------------------ */
2176    .balign 64
2177.L_OP_APUT_BOOLEAN: /* 0x4e */
2178/* File: armv5te/OP_APUT_BOOLEAN.S */
2179/* File: armv5te/OP_APUT.S */
2180    /*
2181     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2182     *
2183     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2184     * instructions.  We use a pair of FETCH_Bs instead.
2185     *
2186     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2187     */
2188    /* op vAA, vBB, vCC */
2189    FETCH_B(r2, 1, 0)                   @ r2<- BB
2190    mov     r9, rINST, lsr #8           @ r9<- AA
2191    FETCH_B(r3, 1, 1)                   @ r3<- CC
2192    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2193    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2194    cmp     r0, #0                      @ null array object?
2195    beq     common_errNullObject        @ yes, bail
2196    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2197    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2198    cmp     r1, r3                      @ compare unsigned index, length
2199    bcs     common_errArrayIndex        @ index >= length, bail
2200    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2201    GET_VREG(r2, r9)                    @ r2<- vAA
2202    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2203    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2204    GOTO_OPCODE(ip)                     @ jump to next instruction
2205
2206
2207/* ------------------------------ */
2208    .balign 64
2209.L_OP_APUT_BYTE: /* 0x4f */
2210/* File: armv5te/OP_APUT_BYTE.S */
2211/* File: armv5te/OP_APUT.S */
2212    /*
2213     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2214     *
2215     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2216     * instructions.  We use a pair of FETCH_Bs instead.
2217     *
2218     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2219     */
2220    /* op vAA, vBB, vCC */
2221    FETCH_B(r2, 1, 0)                   @ r2<- BB
2222    mov     r9, rINST, lsr #8           @ r9<- AA
2223    FETCH_B(r3, 1, 1)                   @ r3<- CC
2224    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2225    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2226    cmp     r0, #0                      @ null array object?
2227    beq     common_errNullObject        @ yes, bail
2228    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2229    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2230    cmp     r1, r3                      @ compare unsigned index, length
2231    bcs     common_errArrayIndex        @ index >= length, bail
2232    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2233    GET_VREG(r2, r9)                    @ r2<- vAA
2234    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2235    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2236    GOTO_OPCODE(ip)                     @ jump to next instruction
2237
2238
2239/* ------------------------------ */
2240    .balign 64
2241.L_OP_APUT_CHAR: /* 0x50 */
2242/* File: armv5te/OP_APUT_CHAR.S */
2243/* File: armv5te/OP_APUT.S */
2244    /*
2245     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2246     *
2247     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2248     * instructions.  We use a pair of FETCH_Bs instead.
2249     *
2250     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2251     */
2252    /* op vAA, vBB, vCC */
2253    FETCH_B(r2, 1, 0)                   @ r2<- BB
2254    mov     r9, rINST, lsr #8           @ r9<- AA
2255    FETCH_B(r3, 1, 1)                   @ r3<- CC
2256    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2257    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2258    cmp     r0, #0                      @ null array object?
2259    beq     common_errNullObject        @ yes, bail
2260    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2261    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2262    cmp     r1, r3                      @ compare unsigned index, length
2263    bcs     common_errArrayIndex        @ index >= length, bail
2264    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2265    GET_VREG(r2, r9)                    @ r2<- vAA
2266    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2267    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2268    GOTO_OPCODE(ip)                     @ jump to next instruction
2269
2270
2271/* ------------------------------ */
2272    .balign 64
2273.L_OP_APUT_SHORT: /* 0x51 */
2274/* File: armv5te/OP_APUT_SHORT.S */
2275/* File: armv5te/OP_APUT.S */
2276    /*
2277     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2278     *
2279     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2280     * instructions.  We use a pair of FETCH_Bs instead.
2281     *
2282     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2283     */
2284    /* op vAA, vBB, vCC */
2285    FETCH_B(r2, 1, 0)                   @ r2<- BB
2286    mov     r9, rINST, lsr #8           @ r9<- AA
2287    FETCH_B(r3, 1, 1)                   @ r3<- CC
2288    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2289    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2290    cmp     r0, #0                      @ null array object?
2291    beq     common_errNullObject        @ yes, bail
2292    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2293    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2294    cmp     r1, r3                      @ compare unsigned index, length
2295    bcs     common_errArrayIndex        @ index >= length, bail
2296    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2297    GET_VREG(r2, r9)                    @ r2<- vAA
2298    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2299    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2300    GOTO_OPCODE(ip)                     @ jump to next instruction
2301
2302
2303/* ------------------------------ */
2304    .balign 64
2305.L_OP_IGET: /* 0x52 */
2306/* File: armv6t2/OP_IGET.S */
2307    /*
2308     * General 32-bit instance field get.
2309     *
2310     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2311     */
2312    /* op vA, vB, field@CCCC */
2313    mov     r0, rINST, lsr #12          @ r0<- B
2314    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2315    FETCH(r1, 1)                        @ r1<- field ref CCCC
2316    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2317    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2318    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2319    cmp     r0, #0                      @ is resolved entry null?
2320    bne     .LOP_IGET_finish          @ no, already resolved
23218:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2322    EXPORT_PC()                         @ resolve() could throw
2323    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2324    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2325    cmp     r0, #0
2326    bne     .LOP_IGET_finish
2327    b       common_exceptionThrown
2328
2329/* ------------------------------ */
2330    .balign 64
2331.L_OP_IGET_WIDE: /* 0x53 */
2332/* File: armv6t2/OP_IGET_WIDE.S */
2333    /*
2334     * Wide 32-bit instance field get.
2335     */
2336    /* iget-wide vA, vB, field@CCCC */
2337    mov     r0, rINST, lsr #12          @ r0<- B
2338    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2339    FETCH(r1, 1)                        @ r1<- field ref CCCC
2340    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2341    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2342    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2343    cmp     r0, #0                      @ is resolved entry null?
2344    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
23458:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2346    EXPORT_PC()                         @ resolve() could throw
2347    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2348    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2349    cmp     r0, #0
2350    bne     .LOP_IGET_WIDE_finish
2351    b       common_exceptionThrown
2352
2353/* ------------------------------ */
2354    .balign 64
2355.L_OP_IGET_OBJECT: /* 0x54 */
2356/* File: armv5te/OP_IGET_OBJECT.S */
2357/* File: armv5te/OP_IGET.S */
2358    /*
2359     * General 32-bit instance field get.
2360     *
2361     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2362     */
2363    /* op vA, vB, field@CCCC */
2364    mov     r0, rINST, lsr #12          @ r0<- B
2365    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2366    FETCH(r1, 1)                        @ r1<- field ref CCCC
2367    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2368    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2369    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2370    cmp     r0, #0                      @ is resolved entry null?
2371    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
23728:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2373    EXPORT_PC()                         @ resolve() could throw
2374    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2375    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2376    cmp     r0, #0
2377    bne     .LOP_IGET_OBJECT_finish
2378    b       common_exceptionThrown
2379
2380
2381/* ------------------------------ */
2382    .balign 64
2383.L_OP_IGET_BOOLEAN: /* 0x55 */
2384/* File: armv5te/OP_IGET_BOOLEAN.S */
2385@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2386/* File: armv5te/OP_IGET.S */
2387    /*
2388     * General 32-bit instance field get.
2389     *
2390     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2391     */
2392    /* op vA, vB, field@CCCC */
2393    mov     r0, rINST, lsr #12          @ r0<- B
2394    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2395    FETCH(r1, 1)                        @ r1<- field ref CCCC
2396    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2397    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2398    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2399    cmp     r0, #0                      @ is resolved entry null?
2400    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
24018:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2402    EXPORT_PC()                         @ resolve() could throw
2403    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2404    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2405    cmp     r0, #0
2406    bne     .LOP_IGET_BOOLEAN_finish
2407    b       common_exceptionThrown
2408
2409
2410/* ------------------------------ */
2411    .balign 64
2412.L_OP_IGET_BYTE: /* 0x56 */
2413/* File: armv5te/OP_IGET_BYTE.S */
2414@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2415/* File: armv5te/OP_IGET.S */
2416    /*
2417     * General 32-bit instance field get.
2418     *
2419     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2420     */
2421    /* op vA, vB, field@CCCC */
2422    mov     r0, rINST, lsr #12          @ r0<- B
2423    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2424    FETCH(r1, 1)                        @ r1<- field ref CCCC
2425    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2426    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2427    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2428    cmp     r0, #0                      @ is resolved entry null?
2429    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
24308:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2431    EXPORT_PC()                         @ resolve() could throw
2432    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2433    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2434    cmp     r0, #0
2435    bne     .LOP_IGET_BYTE_finish
2436    b       common_exceptionThrown
2437
2438
2439/* ------------------------------ */
2440    .balign 64
2441.L_OP_IGET_CHAR: /* 0x57 */
2442/* File: armv5te/OP_IGET_CHAR.S */
2443@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2444/* File: armv5te/OP_IGET.S */
2445    /*
2446     * General 32-bit instance field get.
2447     *
2448     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2449     */
2450    /* op vA, vB, field@CCCC */
2451    mov     r0, rINST, lsr #12          @ r0<- B
2452    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2453    FETCH(r1, 1)                        @ r1<- field ref CCCC
2454    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2455    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2456    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2457    cmp     r0, #0                      @ is resolved entry null?
2458    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
24598:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2460    EXPORT_PC()                         @ resolve() could throw
2461    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2462    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2463    cmp     r0, #0
2464    bne     .LOP_IGET_CHAR_finish
2465    b       common_exceptionThrown
2466
2467
2468/* ------------------------------ */
2469    .balign 64
2470.L_OP_IGET_SHORT: /* 0x58 */
2471/* File: armv5te/OP_IGET_SHORT.S */
2472@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2473/* File: armv5te/OP_IGET.S */
2474    /*
2475     * General 32-bit instance field get.
2476     *
2477     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2478     */
2479    /* op vA, vB, field@CCCC */
2480    mov     r0, rINST, lsr #12          @ r0<- B
2481    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2482    FETCH(r1, 1)                        @ r1<- field ref CCCC
2483    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2484    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2485    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2486    cmp     r0, #0                      @ is resolved entry null?
2487    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
24888:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2489    EXPORT_PC()                         @ resolve() could throw
2490    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2491    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2492    cmp     r0, #0
2493    bne     .LOP_IGET_SHORT_finish
2494    b       common_exceptionThrown
2495
2496
2497/* ------------------------------ */
2498    .balign 64
2499.L_OP_IPUT: /* 0x59 */
2500/* File: armv6t2/OP_IPUT.S */
2501    /*
2502     * General 32-bit instance field put.
2503     *
2504     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2505     */
2506    /* op vA, vB, field@CCCC */
2507    mov     r0, rINST, lsr #12          @ r0<- B
2508    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2509    FETCH(r1, 1)                        @ r1<- field ref CCCC
2510    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2511    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2512    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2513    cmp     r0, #0                      @ is resolved entry null?
2514    bne     .LOP_IPUT_finish          @ no, already resolved
25158:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2516    EXPORT_PC()                         @ resolve() could throw
2517    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2518    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2519    cmp     r0, #0                      @ success?
2520    bne     .LOP_IPUT_finish          @ yes, finish up
2521    b       common_exceptionThrown
2522
2523/* ------------------------------ */
2524    .balign 64
2525.L_OP_IPUT_WIDE: /* 0x5a */
2526/* File: armv6t2/OP_IPUT_WIDE.S */
2527    /* iput-wide vA, vB, field@CCCC */
2528    mov     r0, rINST, lsr #12          @ r0<- B
2529    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2530    FETCH(r1, 1)                        @ r1<- field ref CCCC
2531    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2532    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2533    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2534    cmp     r0, #0                      @ is resolved entry null?
2535    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
25368:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2537    EXPORT_PC()                         @ resolve() could throw
2538    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2539    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2540    cmp     r0, #0                      @ success?
2541    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2542    b       common_exceptionThrown
2543
2544/* ------------------------------ */
2545    .balign 64
2546.L_OP_IPUT_OBJECT: /* 0x5b */
2547/* File: armv5te/OP_IPUT_OBJECT.S */
2548    /*
2549     * 32-bit instance field put.
2550     *
2551     * for: iput-object, iput-object-volatile
2552     */
2553    /* op vA, vB, field@CCCC */
2554    mov     r0, rINST, lsr #12          @ r0<- B
2555    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2556    FETCH(r1, 1)                        @ r1<- field ref CCCC
2557    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2558    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2559    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2560    cmp     r0, #0                      @ is resolved entry null?
2561    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
25628:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2563    EXPORT_PC()                         @ resolve() could throw
2564    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2565    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2566    cmp     r0, #0                      @ success?
2567    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2568    b       common_exceptionThrown
2569
2570/* ------------------------------ */
2571    .balign 64
2572.L_OP_IPUT_BOOLEAN: /* 0x5c */
2573/* File: armv5te/OP_IPUT_BOOLEAN.S */
2574@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2575/* File: armv5te/OP_IPUT.S */
2576    /*
2577     * General 32-bit instance field put.
2578     *
2579     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2580     */
2581    /* op vA, vB, field@CCCC */
2582    mov     r0, rINST, lsr #12          @ r0<- B
2583    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2584    FETCH(r1, 1)                        @ r1<- field ref CCCC
2585    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2586    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2587    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2588    cmp     r0, #0                      @ is resolved entry null?
2589    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
25908:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2591    EXPORT_PC()                         @ resolve() could throw
2592    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2593    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2594    cmp     r0, #0                      @ success?
2595    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2596    b       common_exceptionThrown
2597
2598
2599/* ------------------------------ */
2600    .balign 64
2601.L_OP_IPUT_BYTE: /* 0x5d */
2602/* File: armv5te/OP_IPUT_BYTE.S */
2603@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2604/* File: armv5te/OP_IPUT.S */
2605    /*
2606     * General 32-bit instance field put.
2607     *
2608     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2609     */
2610    /* op vA, vB, field@CCCC */
2611    mov     r0, rINST, lsr #12          @ r0<- B
2612    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2613    FETCH(r1, 1)                        @ r1<- field ref CCCC
2614    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2615    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2616    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2617    cmp     r0, #0                      @ is resolved entry null?
2618    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
26198:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2620    EXPORT_PC()                         @ resolve() could throw
2621    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2622    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2623    cmp     r0, #0                      @ success?
2624    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2625    b       common_exceptionThrown
2626
2627
2628/* ------------------------------ */
2629    .balign 64
2630.L_OP_IPUT_CHAR: /* 0x5e */
2631/* File: armv5te/OP_IPUT_CHAR.S */
2632@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2633/* File: armv5te/OP_IPUT.S */
2634    /*
2635     * General 32-bit instance field put.
2636     *
2637     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2638     */
2639    /* op vA, vB, field@CCCC */
2640    mov     r0, rINST, lsr #12          @ r0<- B
2641    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2642    FETCH(r1, 1)                        @ r1<- field ref CCCC
2643    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2644    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2645    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2646    cmp     r0, #0                      @ is resolved entry null?
2647    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
26488:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2649    EXPORT_PC()                         @ resolve() could throw
2650    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2651    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2652    cmp     r0, #0                      @ success?
2653    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2654    b       common_exceptionThrown
2655
2656
2657/* ------------------------------ */
2658    .balign 64
2659.L_OP_IPUT_SHORT: /* 0x5f */
2660/* File: armv5te/OP_IPUT_SHORT.S */
2661@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2662/* File: armv5te/OP_IPUT.S */
2663    /*
2664     * General 32-bit instance field put.
2665     *
2666     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2667     */
2668    /* op vA, vB, field@CCCC */
2669    mov     r0, rINST, lsr #12          @ r0<- B
2670    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2671    FETCH(r1, 1)                        @ r1<- field ref CCCC
2672    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2673    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2674    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2675    cmp     r0, #0                      @ is resolved entry null?
2676    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
26778:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2678    EXPORT_PC()                         @ resolve() could throw
2679    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2680    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2681    cmp     r0, #0                      @ success?
2682    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2683    b       common_exceptionThrown
2684
2685
2686/* ------------------------------ */
2687    .balign 64
2688.L_OP_SGET: /* 0x60 */
2689/* File: armv5te/OP_SGET.S */
2690    /*
2691     * General 32-bit SGET handler.
2692     *
2693     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2694     */
2695    /* op vAA, field@BBBB */
2696    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2697    FETCH(r1, 1)                        @ r1<- field ref BBBB
2698    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2699    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2700    cmp     r0, #0                      @ is resolved entry null?
2701    beq     .LOP_SGET_resolve         @ yes, do resolve
2702.LOP_SGET_finish: @ field ptr in r0
2703    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2704    @ no-op                             @ acquiring load
2705    mov     r2, rINST, lsr #8           @ r2<- AA
2706    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2707    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2708    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2709    GOTO_OPCODE(ip)                     @ jump to next instruction
2710
2711/* ------------------------------ */
2712    .balign 64
2713.L_OP_SGET_WIDE: /* 0x61 */
2714/* File: armv5te/OP_SGET_WIDE.S */
2715    /*
2716     * 64-bit SGET handler.
2717     */
2718    /* sget-wide vAA, field@BBBB */
2719    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2720    FETCH(r1, 1)                        @ r1<- field ref BBBB
2721    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2722    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2723    cmp     r0, #0                      @ is resolved entry null?
2724    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2725.LOP_SGET_WIDE_finish:
2726    mov     r9, rINST, lsr #8           @ r9<- AA
2727    .if 0
2728    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2729    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
2730    .else
2731    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2732    .endif
2733    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2734    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2735    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2736    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2737    GOTO_OPCODE(ip)                     @ jump to next instruction
2738
2739/* ------------------------------ */
2740    .balign 64
2741.L_OP_SGET_OBJECT: /* 0x62 */
2742/* File: armv5te/OP_SGET_OBJECT.S */
2743/* File: armv5te/OP_SGET.S */
2744    /*
2745     * General 32-bit SGET handler.
2746     *
2747     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2748     */
2749    /* op vAA, field@BBBB */
2750    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2751    FETCH(r1, 1)                        @ r1<- field ref BBBB
2752    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2753    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2754    cmp     r0, #0                      @ is resolved entry null?
2755    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2756.LOP_SGET_OBJECT_finish: @ field ptr in r0
2757    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2758    @ no-op                             @ acquiring load
2759    mov     r2, rINST, lsr #8           @ r2<- AA
2760    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2761    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2762    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2763    GOTO_OPCODE(ip)                     @ jump to next instruction
2764
2765
2766/* ------------------------------ */
2767    .balign 64
2768.L_OP_SGET_BOOLEAN: /* 0x63 */
2769/* File: armv5te/OP_SGET_BOOLEAN.S */
2770/* File: armv5te/OP_SGET.S */
2771    /*
2772     * General 32-bit SGET handler.
2773     *
2774     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2775     */
2776    /* op vAA, field@BBBB */
2777    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2778    FETCH(r1, 1)                        @ r1<- field ref BBBB
2779    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2780    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2781    cmp     r0, #0                      @ is resolved entry null?
2782    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2783.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2784    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2785    @ no-op                             @ acquiring load
2786    mov     r2, rINST, lsr #8           @ r2<- AA
2787    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2788    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2789    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2790    GOTO_OPCODE(ip)                     @ jump to next instruction
2791
2792
2793/* ------------------------------ */
2794    .balign 64
2795.L_OP_SGET_BYTE: /* 0x64 */
2796/* File: armv5te/OP_SGET_BYTE.S */
2797/* File: armv5te/OP_SGET.S */
2798    /*
2799     * General 32-bit SGET handler.
2800     *
2801     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2802     */
2803    /* op vAA, field@BBBB */
2804    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2805    FETCH(r1, 1)                        @ r1<- field ref BBBB
2806    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2807    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2808    cmp     r0, #0                      @ is resolved entry null?
2809    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2810.LOP_SGET_BYTE_finish: @ field ptr in r0
2811    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2812    @ no-op                             @ acquiring load
2813    mov     r2, rINST, lsr #8           @ r2<- AA
2814    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2815    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2816    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2817    GOTO_OPCODE(ip)                     @ jump to next instruction
2818
2819
2820/* ------------------------------ */
2821    .balign 64
2822.L_OP_SGET_CHAR: /* 0x65 */
2823/* File: armv5te/OP_SGET_CHAR.S */
2824/* File: armv5te/OP_SGET.S */
2825    /*
2826     * General 32-bit SGET handler.
2827     *
2828     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2829     */
2830    /* op vAA, field@BBBB */
2831    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2832    FETCH(r1, 1)                        @ r1<- field ref BBBB
2833    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2834    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2835    cmp     r0, #0                      @ is resolved entry null?
2836    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2837.LOP_SGET_CHAR_finish: @ field ptr in r0
2838    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2839    @ no-op                             @ acquiring load
2840    mov     r2, rINST, lsr #8           @ r2<- AA
2841    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2842    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2844    GOTO_OPCODE(ip)                     @ jump to next instruction
2845
2846
2847/* ------------------------------ */
2848    .balign 64
2849.L_OP_SGET_SHORT: /* 0x66 */
2850/* File: armv5te/OP_SGET_SHORT.S */
2851/* File: armv5te/OP_SGET.S */
2852    /*
2853     * General 32-bit SGET handler.
2854     *
2855     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2856     */
2857    /* op vAA, field@BBBB */
2858    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2859    FETCH(r1, 1)                        @ r1<- field ref BBBB
2860    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2861    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2862    cmp     r0, #0                      @ is resolved entry null?
2863    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
2864.LOP_SGET_SHORT_finish: @ field ptr in r0
2865    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2866    @ no-op                             @ acquiring load
2867    mov     r2, rINST, lsr #8           @ r2<- AA
2868    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2869    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2870    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2871    GOTO_OPCODE(ip)                     @ jump to next instruction
2872
2873
2874/* ------------------------------ */
2875    .balign 64
2876.L_OP_SPUT: /* 0x67 */
2877/* File: armv5te/OP_SPUT.S */
2878    /*
2879     * General 32-bit SPUT handler.
2880     *
2881     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2882     */
2883    /* op vAA, field@BBBB */
2884    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2885    FETCH(r1, 1)                        @ r1<- field ref BBBB
2886    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2887    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2888    cmp     r0, #0                      @ is resolved entry null?
2889    beq     .LOP_SPUT_resolve         @ yes, do resolve
2890.LOP_SPUT_finish:   @ field ptr in r0
2891    mov     r2, rINST, lsr #8           @ r2<- AA
2892    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2893    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2894    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2895    @ no-op                        @ releasing store
2896    str     r1, [r0, #offStaticField_value] @ field<- vAA
2897    @ no-op
2898    GOTO_OPCODE(ip)                     @ jump to next instruction
2899
2900/* ------------------------------ */
2901    .balign 64
2902.L_OP_SPUT_WIDE: /* 0x68 */
2903/* File: armv5te/OP_SPUT_WIDE.S */
2904    /*
2905     * 64-bit SPUT handler.
2906     */
2907    /* sput-wide vAA, field@BBBB */
2908    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
2909    FETCH(r1, 1)                        @ r1<- field ref BBBB
2910    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2911    mov     r9, rINST, lsr #8           @ r9<- AA
2912    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
2913    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2914    cmp     r2, #0                      @ is resolved entry null?
2915    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
2916.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
2917    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2918    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
2919    GET_INST_OPCODE(r10)                @ extract opcode from rINST
2920    .if 0
2921    add     r2, r2, #offStaticField_value @ r2<- pointer to data
2922    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
2923    .else
2924    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
2925    .endif
2926    GOTO_OPCODE(r10)                    @ jump to next instruction
2927
2928/* ------------------------------ */
2929    .balign 64
2930.L_OP_SPUT_OBJECT: /* 0x69 */
2931/* File: armv5te/OP_SPUT_OBJECT.S */
2932    /*
2933     * 32-bit SPUT handler for objects
2934     *
2935     * for: sput-object, sput-object-volatile
2936     */
2937    /* op vAA, field@BBBB */
2938    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2939    FETCH(r1, 1)                        @ r1<- field ref BBBB
2940    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2941    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2942    cmp     r0, #0                      @ is resolved entry null?
2943    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
2944.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
2945    mov     r2, rINST, lsr #8           @ r2<- AA
2946    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2947    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2948    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
2949    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
2950    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2951    @ no-op                         @ releasing store
2952    b       .LOP_SPUT_OBJECT_end
2953
2954/* ------------------------------ */
2955    .balign 64
2956.L_OP_SPUT_BOOLEAN: /* 0x6a */
2957/* File: armv5te/OP_SPUT_BOOLEAN.S */
2958/* File: armv5te/OP_SPUT.S */
2959    /*
2960     * General 32-bit SPUT handler.
2961     *
2962     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2963     */
2964    /* op vAA, field@BBBB */
2965    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2966    FETCH(r1, 1)                        @ r1<- field ref BBBB
2967    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2968    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2969    cmp     r0, #0                      @ is resolved entry null?
2970    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
2971.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
2972    mov     r2, rINST, lsr #8           @ r2<- AA
2973    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2974    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2975    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2976    @ no-op                        @ releasing store
2977    str     r1, [r0, #offStaticField_value] @ field<- vAA
2978    @ no-op
2979    GOTO_OPCODE(ip)                     @ jump to next instruction
2980
2981
2982/* ------------------------------ */
2983    .balign 64
2984.L_OP_SPUT_BYTE: /* 0x6b */
2985/* File: armv5te/OP_SPUT_BYTE.S */
2986/* File: armv5te/OP_SPUT.S */
2987    /*
2988     * General 32-bit SPUT handler.
2989     *
2990     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2991     */
2992    /* op vAA, field@BBBB */
2993    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2994    FETCH(r1, 1)                        @ r1<- field ref BBBB
2995    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2996    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2997    cmp     r0, #0                      @ is resolved entry null?
2998    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
2999.LOP_SPUT_BYTE_finish:   @ field ptr in r0
3000    mov     r2, rINST, lsr #8           @ r2<- AA
3001    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3002    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3003    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3004    @ no-op                        @ releasing store
3005    str     r1, [r0, #offStaticField_value] @ field<- vAA
3006    @ no-op
3007    GOTO_OPCODE(ip)                     @ jump to next instruction
3008
3009
3010/* ------------------------------ */
3011    .balign 64
3012.L_OP_SPUT_CHAR: /* 0x6c */
3013/* File: armv5te/OP_SPUT_CHAR.S */
3014/* File: armv5te/OP_SPUT.S */
3015    /*
3016     * General 32-bit SPUT handler.
3017     *
3018     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3019     */
3020    /* op vAA, field@BBBB */
3021    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3022    FETCH(r1, 1)                        @ r1<- field ref BBBB
3023    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3024    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3025    cmp     r0, #0                      @ is resolved entry null?
3026    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3027.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3028    mov     r2, rINST, lsr #8           @ r2<- AA
3029    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3030    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3031    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3032    @ no-op                        @ releasing store
3033    str     r1, [r0, #offStaticField_value] @ field<- vAA
3034    @ no-op
3035    GOTO_OPCODE(ip)                     @ jump to next instruction
3036
3037
3038/* ------------------------------ */
3039    .balign 64
3040.L_OP_SPUT_SHORT: /* 0x6d */
3041/* File: armv5te/OP_SPUT_SHORT.S */
3042/* File: armv5te/OP_SPUT.S */
3043    /*
3044     * General 32-bit SPUT handler.
3045     *
3046     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3047     */
3048    /* op vAA, field@BBBB */
3049    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3050    FETCH(r1, 1)                        @ r1<- field ref BBBB
3051    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3052    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3053    cmp     r0, #0                      @ is resolved entry null?
3054    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3055.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3056    mov     r2, rINST, lsr #8           @ r2<- AA
3057    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3058    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3059    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3060    @ no-op                        @ releasing store
3061    str     r1, [r0, #offStaticField_value] @ field<- vAA
3062    @ no-op
3063    GOTO_OPCODE(ip)                     @ jump to next instruction
3064
3065
3066/* ------------------------------ */
3067    .balign 64
3068.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3069/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3070    /*
3071     * Handle a virtual method call.
3072     *
3073     * for: invoke-virtual, invoke-virtual/range
3074     */
3075    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3076    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3077    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3078    FETCH(r1, 1)                        @ r1<- BBBB
3079    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3080    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3081    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3082    .if     (!0)
3083    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3084    .endif
3085    cmp     r0, #0                      @ already resolved?
3086    EXPORT_PC()                         @ must export for invoke
3087    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3088    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3089    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3090    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3091    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3092    cmp     r0, #0                      @ got null?
3093    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3094    b       common_exceptionThrown      @ yes, handle exception
3095
3096/* ------------------------------ */
3097    .balign 64
3098.L_OP_INVOKE_SUPER: /* 0x6f */
3099/* File: armv5te/OP_INVOKE_SUPER.S */
3100    /*
3101     * Handle a "super" method call.
3102     *
3103     * for: invoke-super, invoke-super/range
3104     */
3105    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3106    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3107    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3108    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3109    .if     (!0)
3110    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3111    .endif
3112    FETCH(r1, 1)                        @ r1<- BBBB
3113    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3114    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3115    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3116    cmp     r9, #0                      @ null "this"?
3117    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3118    beq     common_errNullObject        @ null "this", throw exception
3119    cmp     r0, #0                      @ already resolved?
3120    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3121    EXPORT_PC()                         @ must export for invoke
3122    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3123    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3124
3125/* ------------------------------ */
3126    .balign 64
3127.L_OP_INVOKE_DIRECT: /* 0x70 */
3128/* File: armv5te/OP_INVOKE_DIRECT.S */
3129    /*
3130     * Handle a direct method call.
3131     *
3132     * (We could defer the "is 'this' pointer null" test to the common
3133     * method invocation code, and use a flag to indicate that static
3134     * calls don't count.  If we do this as part of copying the arguments
3135     * out we could avoiding loading the first arg twice.)
3136     *
3137     * for: invoke-direct, invoke-direct/range
3138     */
3139    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3140    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3141    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3142    FETCH(r1, 1)                        @ r1<- BBBB
3143    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3144    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3145    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3146    .if     (!0)
3147    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3148    .endif
3149    cmp     r0, #0                      @ already resolved?
3150    EXPORT_PC()                         @ must export for invoke
3151    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3152    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3153.LOP_INVOKE_DIRECT_finish:
3154    cmp     r9, #0                      @ null "this" ref?
3155    bne     common_invokeMethodNoRange   @ r0=method, r9="this"
3156    b       common_errNullObject        @ yes, throw exception
3157
3158/* ------------------------------ */
3159    .balign 64
3160.L_OP_INVOKE_STATIC: /* 0x71 */
3161/* File: armv5te/OP_INVOKE_STATIC.S */
3162    /*
3163     * Handle a static method call.
3164     *
3165     * for: invoke-static, invoke-static/range
3166     */
3167    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3168    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3169    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3170    FETCH(r1, 1)                        @ r1<- BBBB
3171    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3172    mov     r9, #0                      @ null "this" in delay slot
3173    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3174#if defined(WITH_JIT)
3175    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3176#endif
3177    cmp     r0, #0                      @ already resolved?
3178    EXPORT_PC()                         @ must export for invoke
3179    bne     common_invokeMethodNoRange @ yes, continue on
3180    b       .LOP_INVOKE_STATIC_resolve
3181
3182/* ------------------------------ */
3183    .balign 64
3184.L_OP_INVOKE_INTERFACE: /* 0x72 */
3185/* File: armv5te/OP_INVOKE_INTERFACE.S */
3186    /*
3187     * Handle an interface method call.
3188     *
3189     * for: invoke-interface, invoke-interface/range
3190     */
3191    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3192    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3193    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3194    FETCH(r1, 1)                        @ r1<- BBBB
3195    .if     (!0)
3196    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3197    .endif
3198    EXPORT_PC()                         @ must export for invoke
3199    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3200    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3201    cmp     r9, #0                      @ null obj?
3202    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3203    beq     common_errNullObject        @ yes, fail
3204    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3205    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3206    cmp     r0, #0                      @ failed?
3207    beq     common_exceptionThrown      @ yes, handle exception
3208    b       common_invokeMethodNoRange @ (r0=method, r9="this")
3209
3210/* ------------------------------ */
3211    .balign 64
3212.L_OP_UNUSED_73: /* 0x73 */
3213/* File: armv5te/OP_UNUSED_73.S */
3214/* File: armv5te/unused.S */
3215    bl      common_abort
3216
3217
3218/* ------------------------------ */
3219    .balign 64
3220.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3221/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3222/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3223    /*
3224     * Handle a virtual method call.
3225     *
3226     * for: invoke-virtual, invoke-virtual/range
3227     */
3228    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3229    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3230    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3231    FETCH(r1, 1)                        @ r1<- BBBB
3232    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3233    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3234    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3235    .if     (!1)
3236    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3237    .endif
3238    cmp     r0, #0                      @ already resolved?
3239    EXPORT_PC()                         @ must export for invoke
3240    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3241    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3242    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3243    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3244    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3245    cmp     r0, #0                      @ got null?
3246    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3247    b       common_exceptionThrown      @ yes, handle exception
3248
3249
3250/* ------------------------------ */
3251    .balign 64
3252.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3253/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3254/* File: armv5te/OP_INVOKE_SUPER.S */
3255    /*
3256     * Handle a "super" method call.
3257     *
3258     * for: invoke-super, invoke-super/range
3259     */
3260    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3261    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3262    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3263    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3264    .if     (!1)
3265    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3266    .endif
3267    FETCH(r1, 1)                        @ r1<- BBBB
3268    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3269    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3270    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3271    cmp     r9, #0                      @ null "this"?
3272    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3273    beq     common_errNullObject        @ null "this", throw exception
3274    cmp     r0, #0                      @ already resolved?
3275    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3276    EXPORT_PC()                         @ must export for invoke
3277    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3278    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3279
3280
3281/* ------------------------------ */
3282    .balign 64
3283.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3284/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3285/* File: armv5te/OP_INVOKE_DIRECT.S */
3286    /*
3287     * Handle a direct method call.
3288     *
3289     * (We could defer the "is 'this' pointer null" test to the common
3290     * method invocation code, and use a flag to indicate that static
3291     * calls don't count.  If we do this as part of copying the arguments
3292     * out we could avoiding loading the first arg twice.)
3293     *
3294     * for: invoke-direct, invoke-direct/range
3295     */
3296    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3297    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3298    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3299    FETCH(r1, 1)                        @ r1<- BBBB
3300    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3301    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3302    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3303    .if     (!1)
3304    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3305    .endif
3306    cmp     r0, #0                      @ already resolved?
3307    EXPORT_PC()                         @ must export for invoke
3308    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3309    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3310.LOP_INVOKE_DIRECT_RANGE_finish:
3311    cmp     r9, #0                      @ null "this" ref?
3312    bne     common_invokeMethodRange   @ r0=method, r9="this"
3313    b       common_errNullObject        @ yes, throw exception
3314
3315
3316/* ------------------------------ */
3317    .balign 64
3318.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3319/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3320/* File: armv5te/OP_INVOKE_STATIC.S */
3321    /*
3322     * Handle a static method call.
3323     *
3324     * for: invoke-static, invoke-static/range
3325     */
3326    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3327    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3328    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3329    FETCH(r1, 1)                        @ r1<- BBBB
3330    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3331    mov     r9, #0                      @ null "this" in delay slot
3332    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3333#if defined(WITH_JIT)
3334    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3335#endif
3336    cmp     r0, #0                      @ already resolved?
3337    EXPORT_PC()                         @ must export for invoke
3338    bne     common_invokeMethodRange @ yes, continue on
3339    b       .LOP_INVOKE_STATIC_RANGE_resolve
3340
3341
3342/* ------------------------------ */
3343    .balign 64
3344.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3345/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3346/* File: armv5te/OP_INVOKE_INTERFACE.S */
3347    /*
3348     * Handle an interface method call.
3349     *
3350     * for: invoke-interface, invoke-interface/range
3351     */
3352    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3353    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3354    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3355    FETCH(r1, 1)                        @ r1<- BBBB
3356    .if     (!1)
3357    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3358    .endif
3359    EXPORT_PC()                         @ must export for invoke
3360    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3361    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3362    cmp     r9, #0                      @ null obj?
3363    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3364    beq     common_errNullObject        @ yes, fail
3365    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3366    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3367    cmp     r0, #0                      @ failed?
3368    beq     common_exceptionThrown      @ yes, handle exception
3369    b       common_invokeMethodRange @ (r0=method, r9="this")
3370
3371
3372/* ------------------------------ */
3373    .balign 64
3374.L_OP_UNUSED_79: /* 0x79 */
3375/* File: armv5te/OP_UNUSED_79.S */
3376/* File: armv5te/unused.S */
3377    bl      common_abort
3378
3379
3380/* ------------------------------ */
3381    .balign 64
3382.L_OP_UNUSED_7A: /* 0x7a */
3383/* File: armv5te/OP_UNUSED_7A.S */
3384/* File: armv5te/unused.S */
3385    bl      common_abort
3386
3387
3388/* ------------------------------ */
3389    .balign 64
3390.L_OP_NEG_INT: /* 0x7b */
3391/* File: armv6t2/OP_NEG_INT.S */
3392/* File: armv6t2/unop.S */
3393    /*
3394     * Generic 32-bit unary operation.  Provide an "instr" line that
3395     * specifies an instruction that performs "result = op r0".
3396     * This could be an ARM instruction or a function call.
3397     *
3398     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3399     *      int-to-byte, int-to-char, int-to-short
3400     */
3401    /* unop vA, vB */
3402    mov     r3, rINST, lsr #12          @ r3<- B
3403    ubfx    r9, rINST, #8, #4           @ r9<- A
3404    GET_VREG(r0, r3)                    @ r0<- vB
3405                               @ optional op; may set condition codes
3406    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3407    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3408    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3409    SET_VREG(r0, r9)                    @ vAA<- r0
3410    GOTO_OPCODE(ip)                     @ jump to next instruction
3411    /* 8-9 instructions */
3412
3413
3414/* ------------------------------ */
3415    .balign 64
3416.L_OP_NOT_INT: /* 0x7c */
3417/* File: armv6t2/OP_NOT_INT.S */
3418/* File: armv6t2/unop.S */
3419    /*
3420     * Generic 32-bit unary operation.  Provide an "instr" line that
3421     * specifies an instruction that performs "result = op r0".
3422     * This could be an ARM instruction or a function call.
3423     *
3424     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3425     *      int-to-byte, int-to-char, int-to-short
3426     */
3427    /* unop vA, vB */
3428    mov     r3, rINST, lsr #12          @ r3<- B
3429    ubfx    r9, rINST, #8, #4           @ r9<- A
3430    GET_VREG(r0, r3)                    @ r0<- vB
3431                               @ optional op; may set condition codes
3432    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3433    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3434    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3435    SET_VREG(r0, r9)                    @ vAA<- r0
3436    GOTO_OPCODE(ip)                     @ jump to next instruction
3437    /* 8-9 instructions */
3438
3439
3440/* ------------------------------ */
3441    .balign 64
3442.L_OP_NEG_LONG: /* 0x7d */
3443/* File: armv6t2/OP_NEG_LONG.S */
3444/* File: armv6t2/unopWide.S */
3445    /*
3446     * Generic 64-bit unary operation.  Provide an "instr" line that
3447     * specifies an instruction that performs "result = op r0/r1".
3448     * This could be an ARM instruction or a function call.
3449     *
3450     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3451     */
3452    /* unop vA, vB */
3453    mov     r3, rINST, lsr #12          @ r3<- B
3454    ubfx    r9, rINST, #8, #4           @ r9<- A
3455    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3456    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3457    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3458    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3459    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3460    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3461    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3462    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3463    GOTO_OPCODE(ip)                     @ jump to next instruction
3464    /* 10-11 instructions */
3465
3466
3467/* ------------------------------ */
3468    .balign 64
3469.L_OP_NOT_LONG: /* 0x7e */
3470/* File: armv6t2/OP_NOT_LONG.S */
3471/* File: armv6t2/unopWide.S */
3472    /*
3473     * Generic 64-bit unary operation.  Provide an "instr" line that
3474     * specifies an instruction that performs "result = op r0/r1".
3475     * This could be an ARM instruction or a function call.
3476     *
3477     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3478     */
3479    /* unop vA, vB */
3480    mov     r3, rINST, lsr #12          @ r3<- B
3481    ubfx    r9, rINST, #8, #4           @ r9<- A
3482    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3483    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3484    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3485    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3486    mvn     r0, r0                           @ optional op; may set condition codes
3487    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3488    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3489    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3490    GOTO_OPCODE(ip)                     @ jump to next instruction
3491    /* 10-11 instructions */
3492
3493
3494/* ------------------------------ */
3495    .balign 64
3496.L_OP_NEG_FLOAT: /* 0x7f */
3497/* File: armv6t2/OP_NEG_FLOAT.S */
3498/* File: armv6t2/unop.S */
3499    /*
3500     * Generic 32-bit unary operation.  Provide an "instr" line that
3501     * specifies an instruction that performs "result = op r0".
3502     * This could be an ARM instruction or a function call.
3503     *
3504     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3505     *      int-to-byte, int-to-char, int-to-short
3506     */
3507    /* unop vA, vB */
3508    mov     r3, rINST, lsr #12          @ r3<- B
3509    ubfx    r9, rINST, #8, #4           @ r9<- A
3510    GET_VREG(r0, r3)                    @ r0<- vB
3511                               @ optional op; may set condition codes
3512    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3513    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3514    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3515    SET_VREG(r0, r9)                    @ vAA<- r0
3516    GOTO_OPCODE(ip)                     @ jump to next instruction
3517    /* 8-9 instructions */
3518
3519
3520/* ------------------------------ */
3521    .balign 64
3522.L_OP_NEG_DOUBLE: /* 0x80 */
3523/* File: armv6t2/OP_NEG_DOUBLE.S */
3524/* File: armv6t2/unopWide.S */
3525    /*
3526     * Generic 64-bit unary operation.  Provide an "instr" line that
3527     * specifies an instruction that performs "result = op r0/r1".
3528     * This could be an ARM instruction or a function call.
3529     *
3530     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3531     */
3532    /* unop vA, vB */
3533    mov     r3, rINST, lsr #12          @ r3<- B
3534    ubfx    r9, rINST, #8, #4           @ r9<- A
3535    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3536    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3537    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3538    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3539                               @ optional op; may set condition codes
3540    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3541    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3542    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3543    GOTO_OPCODE(ip)                     @ jump to next instruction
3544    /* 10-11 instructions */
3545
3546
3547/* ------------------------------ */
3548    .balign 64
3549.L_OP_INT_TO_LONG: /* 0x81 */
3550/* File: armv6t2/OP_INT_TO_LONG.S */
3551/* File: armv6t2/unopWider.S */
3552    /*
3553     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3554     * that specifies an instruction that performs "result = op r0", where
3555     * "result" is a 64-bit quantity in r0/r1.
3556     *
3557     * For: int-to-long, int-to-double, float-to-long, float-to-double
3558     */
3559    /* unop vA, vB */
3560    mov     r3, rINST, lsr #12          @ r3<- B
3561    ubfx    r9, rINST, #8, #4           @ r9<- A
3562    GET_VREG(r0, r3)                    @ r0<- vB
3563    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3564                               @ optional op; may set condition codes
3565    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3566    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3567    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3568    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3569    GOTO_OPCODE(ip)                     @ jump to next instruction
3570    /* 9-10 instructions */
3571
3572
3573/* ------------------------------ */
3574    .balign 64
3575.L_OP_INT_TO_FLOAT: /* 0x82 */
3576/* File: arm-vfp/OP_INT_TO_FLOAT.S */
3577/* File: arm-vfp/funop.S */
3578    /*
3579     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3580     * line that specifies an instruction that performs "s1 = op s0".
3581     *
3582     * for: int-to-float, float-to-int
3583     */
3584    /* unop vA, vB */
3585    mov     r3, rINST, lsr #12          @ r3<- B
3586    mov     r9, rINST, lsr #8           @ r9<- A+
3587    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3588    flds    s0, [r3]                    @ s0<- vB
3589    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3590    and     r9, r9, #15                 @ r9<- A
3591    fsitos  s1, s0                              @ s1<- op
3592    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3593    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3594    fsts    s1, [r9]                    @ vA<- s1
3595    GOTO_OPCODE(ip)                     @ jump to next instruction
3596
3597
3598/* ------------------------------ */
3599    .balign 64
3600.L_OP_INT_TO_DOUBLE: /* 0x83 */
3601/* File: arm-vfp/OP_INT_TO_DOUBLE.S */
3602/* File: arm-vfp/funopWider.S */
3603    /*
3604     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3605     * "instr" line that specifies an instruction that performs "d0 = op s0".
3606     *
3607     * For: int-to-double, float-to-double
3608     */
3609    /* unop vA, vB */
3610    mov     r3, rINST, lsr #12          @ r3<- B
3611    mov     r9, rINST, lsr #8           @ r9<- A+
3612    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3613    flds    s0, [r3]                    @ s0<- vB
3614    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3615    and     r9, r9, #15                 @ r9<- A
3616    fsitod  d0, s0                              @ d0<- op
3617    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3618    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3619    fstd    d0, [r9]                    @ vA<- d0
3620    GOTO_OPCODE(ip)                     @ jump to next instruction
3621
3622
3623/* ------------------------------ */
3624    .balign 64
3625.L_OP_LONG_TO_INT: /* 0x84 */
3626/* File: armv5te/OP_LONG_TO_INT.S */
3627/* we ignore the high word, making this equivalent to a 32-bit reg move */
3628/* File: armv5te/OP_MOVE.S */
3629    /* for move, move-object, long-to-int */
3630    /* op vA, vB */
3631    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3632    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3633    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3634    GET_VREG(r2, r1)                    @ r2<- fp[B]
3635    and     r0, r0, #15
3636    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3637    SET_VREG(r2, r0)                    @ fp[A]<- r2
3638    GOTO_OPCODE(ip)                     @ execute next instruction
3639
3640
3641/* ------------------------------ */
3642    .balign 64
3643.L_OP_LONG_TO_FLOAT: /* 0x85 */
3644/* File: armv6t2/OP_LONG_TO_FLOAT.S */
3645/* File: armv6t2/unopNarrower.S */
3646    /*
3647     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3648     * that specifies an instruction that performs "result = op r0/r1", where
3649     * "result" is a 32-bit quantity in r0.
3650     *
3651     * For: long-to-float, double-to-int, double-to-float
3652     *
3653     * (This would work for long-to-int, but that instruction is actually
3654     * an exact match for OP_MOVE.)
3655     */
3656    /* unop vA, vB */
3657    mov     r3, rINST, lsr #12          @ r3<- B
3658    ubfx    r9, rINST, #8, #4           @ r9<- A
3659    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3660    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3661    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3662                               @ optional op; may set condition codes
3663    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3664    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3665    SET_VREG(r0, r9)                    @ vA<- r0
3666    GOTO_OPCODE(ip)                     @ jump to next instruction
3667    /* 9-10 instructions */
3668
3669
3670/* ------------------------------ */
3671    .balign 64
3672.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3673/* File: armv6t2/OP_LONG_TO_DOUBLE.S */
3674/* File: armv6t2/unopWide.S */
3675    /*
3676     * Generic 64-bit unary operation.  Provide an "instr" line that
3677     * specifies an instruction that performs "result = op r0/r1".
3678     * This could be an ARM instruction or a function call.
3679     *
3680     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3681     */
3682    /* unop vA, vB */
3683    mov     r3, rINST, lsr #12          @ r3<- B
3684    ubfx    r9, rINST, #8, #4           @ r9<- A
3685    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3686    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3687    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3688    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3689                               @ optional op; may set condition codes
3690    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3691    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3692    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3693    GOTO_OPCODE(ip)                     @ jump to next instruction
3694    /* 10-11 instructions */
3695
3696
3697/* ------------------------------ */
3698    .balign 64
3699.L_OP_FLOAT_TO_INT: /* 0x87 */
3700/* File: arm-vfp/OP_FLOAT_TO_INT.S */
3701/* File: arm-vfp/funop.S */
3702    /*
3703     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3704     * line that specifies an instruction that performs "s1 = op s0".
3705     *
3706     * for: int-to-float, float-to-int
3707     */
3708    /* unop vA, vB */
3709    mov     r3, rINST, lsr #12          @ r3<- B
3710    mov     r9, rINST, lsr #8           @ r9<- A+
3711    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3712    flds    s0, [r3]                    @ s0<- vB
3713    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3714    and     r9, r9, #15                 @ r9<- A
3715    ftosizs s1, s0                              @ s1<- op
3716    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3717    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3718    fsts    s1, [r9]                    @ vA<- s1
3719    GOTO_OPCODE(ip)                     @ jump to next instruction
3720
3721
3722/* ------------------------------ */
3723    .balign 64
3724.L_OP_FLOAT_TO_LONG: /* 0x88 */
3725/* File: armv6t2/OP_FLOAT_TO_LONG.S */
3726@include "armv6t2/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3727/* File: armv6t2/unopWider.S */
3728    /*
3729     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3730     * that specifies an instruction that performs "result = op r0", where
3731     * "result" is a 64-bit quantity in r0/r1.
3732     *
3733     * For: int-to-long, int-to-double, float-to-long, float-to-double
3734     */
3735    /* unop vA, vB */
3736    mov     r3, rINST, lsr #12          @ r3<- B
3737    ubfx    r9, rINST, #8, #4           @ r9<- A
3738    GET_VREG(r0, r3)                    @ r0<- vB
3739    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3740                               @ optional op; may set condition codes
3741    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3742    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3743    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3744    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3745    GOTO_OPCODE(ip)                     @ jump to next instruction
3746    /* 9-10 instructions */
3747
3748
3749
3750/* ------------------------------ */
3751    .balign 64
3752.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3753/* File: arm-vfp/OP_FLOAT_TO_DOUBLE.S */
3754/* File: arm-vfp/funopWider.S */
3755    /*
3756     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3757     * "instr" line that specifies an instruction that performs "d0 = op s0".
3758     *
3759     * For: int-to-double, float-to-double
3760     */
3761    /* unop vA, vB */
3762    mov     r3, rINST, lsr #12          @ r3<- B
3763    mov     r9, rINST, lsr #8           @ r9<- A+
3764    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3765    flds    s0, [r3]                    @ s0<- vB
3766    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3767    and     r9, r9, #15                 @ r9<- A
3768    fcvtds  d0, s0                              @ d0<- op
3769    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3770    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3771    fstd    d0, [r9]                    @ vA<- d0
3772    GOTO_OPCODE(ip)                     @ jump to next instruction
3773
3774
3775/* ------------------------------ */
3776    .balign 64
3777.L_OP_DOUBLE_TO_INT: /* 0x8a */
3778/* File: arm-vfp/OP_DOUBLE_TO_INT.S */
3779/* File: arm-vfp/funopNarrower.S */
3780    /*
3781     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3782     * "instr" line that specifies an instruction that performs "s0 = op d0".
3783     *
3784     * For: double-to-int, double-to-float
3785     */
3786    /* unop vA, vB */
3787    mov     r3, rINST, lsr #12          @ r3<- B
3788    mov     r9, rINST, lsr #8           @ r9<- A+
3789    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3790    fldd    d0, [r3]                    @ d0<- vB
3791    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3792    and     r9, r9, #15                 @ r9<- A
3793    ftosizd  s0, d0                              @ s0<- op
3794    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3795    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3796    fsts    s0, [r9]                    @ vA<- s0
3797    GOTO_OPCODE(ip)                     @ jump to next instruction
3798
3799
3800/* ------------------------------ */
3801    .balign 64
3802.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3803/* File: armv6t2/OP_DOUBLE_TO_LONG.S */
3804@include "armv6t2/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
3805/* File: armv6t2/unopWide.S */
3806    /*
3807     * Generic 64-bit unary operation.  Provide an "instr" line that
3808     * specifies an instruction that performs "result = op r0/r1".
3809     * This could be an ARM instruction or a function call.
3810     *
3811     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3812     */
3813    /* unop vA, vB */
3814    mov     r3, rINST, lsr #12          @ r3<- B
3815    ubfx    r9, rINST, #8, #4           @ r9<- A
3816    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3817    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3818    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3819    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3820                               @ optional op; may set condition codes
3821    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
3822    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3823    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3824    GOTO_OPCODE(ip)                     @ jump to next instruction
3825    /* 10-11 instructions */
3826
3827
3828
3829/* ------------------------------ */
3830    .balign 64
3831.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3832/* File: arm-vfp/OP_DOUBLE_TO_FLOAT.S */
3833/* File: arm-vfp/funopNarrower.S */
3834    /*
3835     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3836     * "instr" line that specifies an instruction that performs "s0 = op d0".
3837     *
3838     * For: double-to-int, double-to-float
3839     */
3840    /* unop vA, vB */
3841    mov     r3, rINST, lsr #12          @ r3<- B
3842    mov     r9, rINST, lsr #8           @ r9<- A+
3843    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3844    fldd    d0, [r3]                    @ d0<- vB
3845    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3846    and     r9, r9, #15                 @ r9<- A
3847    fcvtsd  s0, d0                              @ s0<- op
3848    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3849    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3850    fsts    s0, [r9]                    @ vA<- s0
3851    GOTO_OPCODE(ip)                     @ jump to next instruction
3852
3853
3854/* ------------------------------ */
3855    .balign 64
3856.L_OP_INT_TO_BYTE: /* 0x8d */
3857/* File: armv6t2/OP_INT_TO_BYTE.S */
3858/* File: armv6t2/unop.S */
3859    /*
3860     * Generic 32-bit unary operation.  Provide an "instr" line that
3861     * specifies an instruction that performs "result = op r0".
3862     * This could be an ARM instruction or a function call.
3863     *
3864     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3865     *      int-to-byte, int-to-char, int-to-short
3866     */
3867    /* unop vA, vB */
3868    mov     r3, rINST, lsr #12          @ r3<- B
3869    ubfx    r9, rINST, #8, #4           @ r9<- A
3870    GET_VREG(r0, r3)                    @ r0<- vB
3871                               @ optional op; may set condition codes
3872    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3873    sxtb    r0, r0                              @ r0<- op, r0-r3 changed
3874    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3875    SET_VREG(r0, r9)                    @ vAA<- r0
3876    GOTO_OPCODE(ip)                     @ jump to next instruction
3877    /* 8-9 instructions */
3878
3879
3880/* ------------------------------ */
3881    .balign 64
3882.L_OP_INT_TO_CHAR: /* 0x8e */
3883/* File: armv6t2/OP_INT_TO_CHAR.S */
3884/* File: armv6t2/unop.S */
3885    /*
3886     * Generic 32-bit unary operation.  Provide an "instr" line that
3887     * specifies an instruction that performs "result = op r0".
3888     * This could be an ARM instruction or a function call.
3889     *
3890     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3891     *      int-to-byte, int-to-char, int-to-short
3892     */
3893    /* unop vA, vB */
3894    mov     r3, rINST, lsr #12          @ r3<- B
3895    ubfx    r9, rINST, #8, #4           @ r9<- A
3896    GET_VREG(r0, r3)                    @ r0<- vB
3897                               @ optional op; may set condition codes
3898    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3899    uxth    r0, r0                              @ r0<- op, r0-r3 changed
3900    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3901    SET_VREG(r0, r9)                    @ vAA<- r0
3902    GOTO_OPCODE(ip)                     @ jump to next instruction
3903    /* 8-9 instructions */
3904
3905
3906/* ------------------------------ */
3907    .balign 64
3908.L_OP_INT_TO_SHORT: /* 0x8f */
3909/* File: armv6t2/OP_INT_TO_SHORT.S */
3910/* File: armv6t2/unop.S */
3911    /*
3912     * Generic 32-bit unary operation.  Provide an "instr" line that
3913     * specifies an instruction that performs "result = op r0".
3914     * This could be an ARM instruction or a function call.
3915     *
3916     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3917     *      int-to-byte, int-to-char, int-to-short
3918     */
3919    /* unop vA, vB */
3920    mov     r3, rINST, lsr #12          @ r3<- B
3921    ubfx    r9, rINST, #8, #4           @ r9<- A
3922    GET_VREG(r0, r3)                    @ r0<- vB
3923                               @ optional op; may set condition codes
3924    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3925    sxth    r0, r0                              @ r0<- op, r0-r3 changed
3926    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3927    SET_VREG(r0, r9)                    @ vAA<- r0
3928    GOTO_OPCODE(ip)                     @ jump to next instruction
3929    /* 8-9 instructions */
3930
3931
3932/* ------------------------------ */
3933    .balign 64
3934.L_OP_ADD_INT: /* 0x90 */
3935/* File: armv5te/OP_ADD_INT.S */
3936/* File: armv5te/binop.S */
3937    /*
3938     * Generic 32-bit binary operation.  Provide an "instr" line that
3939     * specifies an instruction that performs "result = r0 op r1".
3940     * This could be an ARM instruction or a function call.  (If the result
3941     * comes back in a register other than r0, you can override "result".)
3942     *
3943     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3944     * vCC (r1).  Useful for integer division and modulus.  Note that we
3945     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3946     * handles it correctly.
3947     *
3948     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3949     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3950     *      mul-float, div-float, rem-float
3951     */
3952    /* binop vAA, vBB, vCC */
3953    FETCH(r0, 1)                        @ r0<- CCBB
3954    mov     r9, rINST, lsr #8           @ r9<- AA
3955    mov     r3, r0, lsr #8              @ r3<- CC
3956    and     r2, r0, #255                @ r2<- BB
3957    GET_VREG(r1, r3)                    @ r1<- vCC
3958    GET_VREG(r0, r2)                    @ r0<- vBB
3959    .if 0
3960    cmp     r1, #0                      @ is second operand zero?
3961    beq     common_errDivideByZero
3962    .endif
3963
3964    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3965                               @ optional op; may set condition codes
3966    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
3967    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3968    SET_VREG(r0, r9)               @ vAA<- r0
3969    GOTO_OPCODE(ip)                     @ jump to next instruction
3970    /* 11-14 instructions */
3971
3972
3973/* ------------------------------ */
3974    .balign 64
3975.L_OP_SUB_INT: /* 0x91 */
3976/* File: armv5te/OP_SUB_INT.S */
3977/* File: armv5te/binop.S */
3978    /*
3979     * Generic 32-bit binary operation.  Provide an "instr" line that
3980     * specifies an instruction that performs "result = r0 op r1".
3981     * This could be an ARM instruction or a function call.  (If the result
3982     * comes back in a register other than r0, you can override "result".)
3983     *
3984     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3985     * vCC (r1).  Useful for integer division and modulus.  Note that we
3986     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3987     * handles it correctly.
3988     *
3989     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3990     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3991     *      mul-float, div-float, rem-float
3992     */
3993    /* binop vAA, vBB, vCC */
3994    FETCH(r0, 1)                        @ r0<- CCBB
3995    mov     r9, rINST, lsr #8           @ r9<- AA
3996    mov     r3, r0, lsr #8              @ r3<- CC
3997    and     r2, r0, #255                @ r2<- BB
3998    GET_VREG(r1, r3)                    @ r1<- vCC
3999    GET_VREG(r0, r2)                    @ r0<- vBB
4000    .if 0
4001    cmp     r1, #0                      @ is second operand zero?
4002    beq     common_errDivideByZero
4003    .endif
4004
4005    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4006                               @ optional op; may set condition codes
4007    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4008    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4009    SET_VREG(r0, r9)               @ vAA<- r0
4010    GOTO_OPCODE(ip)                     @ jump to next instruction
4011    /* 11-14 instructions */
4012
4013
4014/* ------------------------------ */
4015    .balign 64
4016.L_OP_MUL_INT: /* 0x92 */
4017/* File: armv5te/OP_MUL_INT.S */
4018/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4019/* File: armv5te/binop.S */
4020    /*
4021     * Generic 32-bit binary operation.  Provide an "instr" line that
4022     * specifies an instruction that performs "result = r0 op r1".
4023     * This could be an ARM instruction or a function call.  (If the result
4024     * comes back in a register other than r0, you can override "result".)
4025     *
4026     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4027     * vCC (r1).  Useful for integer division and modulus.  Note that we
4028     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4029     * handles it correctly.
4030     *
4031     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4032     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4033     *      mul-float, div-float, rem-float
4034     */
4035    /* binop vAA, vBB, vCC */
4036    FETCH(r0, 1)                        @ r0<- CCBB
4037    mov     r9, rINST, lsr #8           @ r9<- AA
4038    mov     r3, r0, lsr #8              @ r3<- CC
4039    and     r2, r0, #255                @ r2<- BB
4040    GET_VREG(r1, r3)                    @ r1<- vCC
4041    GET_VREG(r0, r2)                    @ r0<- vBB
4042    .if 0
4043    cmp     r1, #0                      @ is second operand zero?
4044    beq     common_errDivideByZero
4045    .endif
4046
4047    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4048                               @ optional op; may set condition codes
4049    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4050    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4051    SET_VREG(r0, r9)               @ vAA<- r0
4052    GOTO_OPCODE(ip)                     @ jump to next instruction
4053    /* 11-14 instructions */
4054
4055
4056/* ------------------------------ */
4057    .balign 64
4058.L_OP_DIV_INT: /* 0x93 */
4059/* File: armv5te/OP_DIV_INT.S */
4060/* File: armv5te/binop.S */
4061    /*
4062     * Generic 32-bit binary operation.  Provide an "instr" line that
4063     * specifies an instruction that performs "result = r0 op r1".
4064     * This could be an ARM instruction or a function call.  (If the result
4065     * comes back in a register other than r0, you can override "result".)
4066     *
4067     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4068     * vCC (r1).  Useful for integer division and modulus.  Note that we
4069     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4070     * handles it correctly.
4071     *
4072     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4073     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4074     *      mul-float, div-float, rem-float
4075     */
4076    /* binop vAA, vBB, vCC */
4077    FETCH(r0, 1)                        @ r0<- CCBB
4078    mov     r9, rINST, lsr #8           @ r9<- AA
4079    mov     r3, r0, lsr #8              @ r3<- CC
4080    and     r2, r0, #255                @ r2<- BB
4081    GET_VREG(r1, r3)                    @ r1<- vCC
4082    GET_VREG(r0, r2)                    @ r0<- vBB
4083    .if 1
4084    cmp     r1, #0                      @ is second operand zero?
4085    beq     common_errDivideByZero
4086    .endif
4087
4088    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4089                               @ optional op; may set condition codes
4090    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4091    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4092    SET_VREG(r0, r9)               @ vAA<- r0
4093    GOTO_OPCODE(ip)                     @ jump to next instruction
4094    /* 11-14 instructions */
4095
4096
4097/* ------------------------------ */
4098    .balign 64
4099.L_OP_REM_INT: /* 0x94 */
4100/* File: armv5te/OP_REM_INT.S */
4101/* idivmod returns quotient in r0 and remainder in r1 */
4102/* File: armv5te/binop.S */
4103    /*
4104     * Generic 32-bit binary operation.  Provide an "instr" line that
4105     * specifies an instruction that performs "result = r0 op r1".
4106     * This could be an ARM instruction or a function call.  (If the result
4107     * comes back in a register other than r0, you can override "result".)
4108     *
4109     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4110     * vCC (r1).  Useful for integer division and modulus.  Note that we
4111     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4112     * handles it correctly.
4113     *
4114     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4115     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4116     *      mul-float, div-float, rem-float
4117     */
4118    /* binop vAA, vBB, vCC */
4119    FETCH(r0, 1)                        @ r0<- CCBB
4120    mov     r9, rINST, lsr #8           @ r9<- AA
4121    mov     r3, r0, lsr #8              @ r3<- CC
4122    and     r2, r0, #255                @ r2<- BB
4123    GET_VREG(r1, r3)                    @ r1<- vCC
4124    GET_VREG(r0, r2)                    @ r0<- vBB
4125    .if 1
4126    cmp     r1, #0                      @ is second operand zero?
4127    beq     common_errDivideByZero
4128    .endif
4129
4130    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4131                               @ optional op; may set condition codes
4132    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4133    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4134    SET_VREG(r1, r9)               @ vAA<- r1
4135    GOTO_OPCODE(ip)                     @ jump to next instruction
4136    /* 11-14 instructions */
4137
4138
4139/* ------------------------------ */
4140    .balign 64
4141.L_OP_AND_INT: /* 0x95 */
4142/* File: armv5te/OP_AND_INT.S */
4143/* File: armv5te/binop.S */
4144    /*
4145     * Generic 32-bit binary operation.  Provide an "instr" line that
4146     * specifies an instruction that performs "result = r0 op r1".
4147     * This could be an ARM instruction or a function call.  (If the result
4148     * comes back in a register other than r0, you can override "result".)
4149     *
4150     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4151     * vCC (r1).  Useful for integer division and modulus.  Note that we
4152     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4153     * handles it correctly.
4154     *
4155     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4156     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4157     *      mul-float, div-float, rem-float
4158     */
4159    /* binop vAA, vBB, vCC */
4160    FETCH(r0, 1)                        @ r0<- CCBB
4161    mov     r9, rINST, lsr #8           @ r9<- AA
4162    mov     r3, r0, lsr #8              @ r3<- CC
4163    and     r2, r0, #255                @ r2<- BB
4164    GET_VREG(r1, r3)                    @ r1<- vCC
4165    GET_VREG(r0, r2)                    @ r0<- vBB
4166    .if 0
4167    cmp     r1, #0                      @ is second operand zero?
4168    beq     common_errDivideByZero
4169    .endif
4170
4171    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4172                               @ optional op; may set condition codes
4173    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4174    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4175    SET_VREG(r0, r9)               @ vAA<- r0
4176    GOTO_OPCODE(ip)                     @ jump to next instruction
4177    /* 11-14 instructions */
4178
4179
4180/* ------------------------------ */
4181    .balign 64
4182.L_OP_OR_INT: /* 0x96 */
4183/* File: armv5te/OP_OR_INT.S */
4184/* File: armv5te/binop.S */
4185    /*
4186     * Generic 32-bit binary operation.  Provide an "instr" line that
4187     * specifies an instruction that performs "result = r0 op r1".
4188     * This could be an ARM instruction or a function call.  (If the result
4189     * comes back in a register other than r0, you can override "result".)
4190     *
4191     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4192     * vCC (r1).  Useful for integer division and modulus.  Note that we
4193     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4194     * handles it correctly.
4195     *
4196     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4197     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4198     *      mul-float, div-float, rem-float
4199     */
4200    /* binop vAA, vBB, vCC */
4201    FETCH(r0, 1)                        @ r0<- CCBB
4202    mov     r9, rINST, lsr #8           @ r9<- AA
4203    mov     r3, r0, lsr #8              @ r3<- CC
4204    and     r2, r0, #255                @ r2<- BB
4205    GET_VREG(r1, r3)                    @ r1<- vCC
4206    GET_VREG(r0, r2)                    @ r0<- vBB
4207    .if 0
4208    cmp     r1, #0                      @ is second operand zero?
4209    beq     common_errDivideByZero
4210    .endif
4211
4212    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4213                               @ optional op; may set condition codes
4214    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4215    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4216    SET_VREG(r0, r9)               @ vAA<- r0
4217    GOTO_OPCODE(ip)                     @ jump to next instruction
4218    /* 11-14 instructions */
4219
4220
4221/* ------------------------------ */
4222    .balign 64
4223.L_OP_XOR_INT: /* 0x97 */
4224/* File: armv5te/OP_XOR_INT.S */
4225/* File: armv5te/binop.S */
4226    /*
4227     * Generic 32-bit binary operation.  Provide an "instr" line that
4228     * specifies an instruction that performs "result = r0 op r1".
4229     * This could be an ARM instruction or a function call.  (If the result
4230     * comes back in a register other than r0, you can override "result".)
4231     *
4232     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4233     * vCC (r1).  Useful for integer division and modulus.  Note that we
4234     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4235     * handles it correctly.
4236     *
4237     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4238     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4239     *      mul-float, div-float, rem-float
4240     */
4241    /* binop vAA, vBB, vCC */
4242    FETCH(r0, 1)                        @ r0<- CCBB
4243    mov     r9, rINST, lsr #8           @ r9<- AA
4244    mov     r3, r0, lsr #8              @ r3<- CC
4245    and     r2, r0, #255                @ r2<- BB
4246    GET_VREG(r1, r3)                    @ r1<- vCC
4247    GET_VREG(r0, r2)                    @ r0<- vBB
4248    .if 0
4249    cmp     r1, #0                      @ is second operand zero?
4250    beq     common_errDivideByZero
4251    .endif
4252
4253    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4254                               @ optional op; may set condition codes
4255    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4256    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4257    SET_VREG(r0, r9)               @ vAA<- r0
4258    GOTO_OPCODE(ip)                     @ jump to next instruction
4259    /* 11-14 instructions */
4260
4261
4262/* ------------------------------ */
4263    .balign 64
4264.L_OP_SHL_INT: /* 0x98 */
4265/* File: armv5te/OP_SHL_INT.S */
4266/* File: armv5te/binop.S */
4267    /*
4268     * Generic 32-bit binary operation.  Provide an "instr" line that
4269     * specifies an instruction that performs "result = r0 op r1".
4270     * This could be an ARM instruction or a function call.  (If the result
4271     * comes back in a register other than r0, you can override "result".)
4272     *
4273     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4274     * vCC (r1).  Useful for integer division and modulus.  Note that we
4275     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4276     * handles it correctly.
4277     *
4278     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4279     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4280     *      mul-float, div-float, rem-float
4281     */
4282    /* binop vAA, vBB, vCC */
4283    FETCH(r0, 1)                        @ r0<- CCBB
4284    mov     r9, rINST, lsr #8           @ r9<- AA
4285    mov     r3, r0, lsr #8              @ r3<- CC
4286    and     r2, r0, #255                @ r2<- BB
4287    GET_VREG(r1, r3)                    @ r1<- vCC
4288    GET_VREG(r0, r2)                    @ r0<- vBB
4289    .if 0
4290    cmp     r1, #0                      @ is second operand zero?
4291    beq     common_errDivideByZero
4292    .endif
4293
4294    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4295    and     r1, r1, #31                           @ optional op; may set condition codes
4296    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4297    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4298    SET_VREG(r0, r9)               @ vAA<- r0
4299    GOTO_OPCODE(ip)                     @ jump to next instruction
4300    /* 11-14 instructions */
4301
4302
4303/* ------------------------------ */
4304    .balign 64
4305.L_OP_SHR_INT: /* 0x99 */
4306/* File: armv5te/OP_SHR_INT.S */
4307/* File: armv5te/binop.S */
4308    /*
4309     * Generic 32-bit binary operation.  Provide an "instr" line that
4310     * specifies an instruction that performs "result = r0 op r1".
4311     * This could be an ARM instruction or a function call.  (If the result
4312     * comes back in a register other than r0, you can override "result".)
4313     *
4314     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4315     * vCC (r1).  Useful for integer division and modulus.  Note that we
4316     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4317     * handles it correctly.
4318     *
4319     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4320     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4321     *      mul-float, div-float, rem-float
4322     */
4323    /* binop vAA, vBB, vCC */
4324    FETCH(r0, 1)                        @ r0<- CCBB
4325    mov     r9, rINST, lsr #8           @ r9<- AA
4326    mov     r3, r0, lsr #8              @ r3<- CC
4327    and     r2, r0, #255                @ r2<- BB
4328    GET_VREG(r1, r3)                    @ r1<- vCC
4329    GET_VREG(r0, r2)                    @ r0<- vBB
4330    .if 0
4331    cmp     r1, #0                      @ is second operand zero?
4332    beq     common_errDivideByZero
4333    .endif
4334
4335    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4336    and     r1, r1, #31                           @ optional op; may set condition codes
4337    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4338    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4339    SET_VREG(r0, r9)               @ vAA<- r0
4340    GOTO_OPCODE(ip)                     @ jump to next instruction
4341    /* 11-14 instructions */
4342
4343
4344/* ------------------------------ */
4345    .balign 64
4346.L_OP_USHR_INT: /* 0x9a */
4347/* File: armv5te/OP_USHR_INT.S */
4348/* File: armv5te/binop.S */
4349    /*
4350     * Generic 32-bit binary operation.  Provide an "instr" line that
4351     * specifies an instruction that performs "result = r0 op r1".
4352     * This could be an ARM instruction or a function call.  (If the result
4353     * comes back in a register other than r0, you can override "result".)
4354     *
4355     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4356     * vCC (r1).  Useful for integer division and modulus.  Note that we
4357     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4358     * handles it correctly.
4359     *
4360     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4361     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4362     *      mul-float, div-float, rem-float
4363     */
4364    /* binop vAA, vBB, vCC */
4365    FETCH(r0, 1)                        @ r0<- CCBB
4366    mov     r9, rINST, lsr #8           @ r9<- AA
4367    mov     r3, r0, lsr #8              @ r3<- CC
4368    and     r2, r0, #255                @ r2<- BB
4369    GET_VREG(r1, r3)                    @ r1<- vCC
4370    GET_VREG(r0, r2)                    @ r0<- vBB
4371    .if 0
4372    cmp     r1, #0                      @ is second operand zero?
4373    beq     common_errDivideByZero
4374    .endif
4375
4376    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4377    and     r1, r1, #31                           @ optional op; may set condition codes
4378    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4379    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4380    SET_VREG(r0, r9)               @ vAA<- r0
4381    GOTO_OPCODE(ip)                     @ jump to next instruction
4382    /* 11-14 instructions */
4383
4384
4385/* ------------------------------ */
4386    .balign 64
4387.L_OP_ADD_LONG: /* 0x9b */
4388/* File: armv5te/OP_ADD_LONG.S */
4389/* File: armv5te/binopWide.S */
4390    /*
4391     * Generic 64-bit binary operation.  Provide an "instr" line that
4392     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4393     * This could be an ARM instruction or a function call.  (If the result
4394     * comes back in a register other than r0, you can override "result".)
4395     *
4396     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4397     * vCC (r1).  Useful for integer division and modulus.
4398     *
4399     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4400     *      xor-long, add-double, sub-double, mul-double, div-double,
4401     *      rem-double
4402     *
4403     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4404     */
4405    /* binop vAA, vBB, vCC */
4406    FETCH(r0, 1)                        @ r0<- CCBB
4407    mov     r9, rINST, lsr #8           @ r9<- AA
4408    and     r2, r0, #255                @ r2<- BB
4409    mov     r3, r0, lsr #8              @ r3<- CC
4410    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4411    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4412    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4413    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4414    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4415    .if 0
4416    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4417    beq     common_errDivideByZero
4418    .endif
4419    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4420
4421    adds    r0, r0, r2                           @ optional op; may set condition codes
4422    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4423    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4424    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4425    GOTO_OPCODE(ip)                     @ jump to next instruction
4426    /* 14-17 instructions */
4427
4428
4429/* ------------------------------ */
4430    .balign 64
4431.L_OP_SUB_LONG: /* 0x9c */
4432/* File: armv5te/OP_SUB_LONG.S */
4433/* File: armv5te/binopWide.S */
4434    /*
4435     * Generic 64-bit binary operation.  Provide an "instr" line that
4436     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4437     * This could be an ARM instruction or a function call.  (If the result
4438     * comes back in a register other than r0, you can override "result".)
4439     *
4440     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4441     * vCC (r1).  Useful for integer division and modulus.
4442     *
4443     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4444     *      xor-long, add-double, sub-double, mul-double, div-double,
4445     *      rem-double
4446     *
4447     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4448     */
4449    /* binop vAA, vBB, vCC */
4450    FETCH(r0, 1)                        @ r0<- CCBB
4451    mov     r9, rINST, lsr #8           @ r9<- AA
4452    and     r2, r0, #255                @ r2<- BB
4453    mov     r3, r0, lsr #8              @ r3<- CC
4454    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4455    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4456    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4457    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4458    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4459    .if 0
4460    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4461    beq     common_errDivideByZero
4462    .endif
4463    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4464
4465    subs    r0, r0, r2                           @ optional op; may set condition codes
4466    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4467    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4468    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4469    GOTO_OPCODE(ip)                     @ jump to next instruction
4470    /* 14-17 instructions */
4471
4472
4473/* ------------------------------ */
4474    .balign 64
4475.L_OP_MUL_LONG: /* 0x9d */
4476/* File: armv5te/OP_MUL_LONG.S */
4477    /*
4478     * Signed 64-bit integer multiply.
4479     *
4480     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4481     *        WX
4482     *      x YZ
4483     *  --------
4484     *     ZW ZX
4485     *  YW YX
4486     *
4487     * The low word of the result holds ZX, the high word holds
4488     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4489     * it doesn't fit in the low 64 bits.
4490     *
4491     * Unlike most ARM math operations, multiply instructions have
4492     * restrictions on using the same register more than once (Rd and Rm
4493     * cannot be the same).
4494     */
4495    /* mul-long vAA, vBB, vCC */
4496    FETCH(r0, 1)                        @ r0<- CCBB
4497    and     r2, r0, #255                @ r2<- BB
4498    mov     r3, r0, lsr #8              @ r3<- CC
4499    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4500    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4501    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4502    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4503    mul     ip, r2, r1                  @  ip<- ZxW
4504    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4505    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4506    mov     r0, rINST, lsr #8           @ r0<- AA
4507    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4508    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4509    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4510    b       .LOP_MUL_LONG_finish
4511
4512/* ------------------------------ */
4513    .balign 64
4514.L_OP_DIV_LONG: /* 0x9e */
4515/* File: armv5te/OP_DIV_LONG.S */
4516/* File: armv5te/binopWide.S */
4517    /*
4518     * Generic 64-bit binary operation.  Provide an "instr" line that
4519     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4520     * This could be an ARM instruction or a function call.  (If the result
4521     * comes back in a register other than r0, you can override "result".)
4522     *
4523     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4524     * vCC (r1).  Useful for integer division and modulus.
4525     *
4526     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4527     *      xor-long, add-double, sub-double, mul-double, div-double,
4528     *      rem-double
4529     *
4530     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4531     */
4532    /* binop vAA, vBB, vCC */
4533    FETCH(r0, 1)                        @ r0<- CCBB
4534    mov     r9, rINST, lsr #8           @ r9<- AA
4535    and     r2, r0, #255                @ r2<- BB
4536    mov     r3, r0, lsr #8              @ r3<- CC
4537    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4538    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4539    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4540    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4541    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4542    .if 1
4543    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4544    beq     common_errDivideByZero
4545    .endif
4546    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4547
4548                               @ optional op; may set condition codes
4549    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4550    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4551    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4552    GOTO_OPCODE(ip)                     @ jump to next instruction
4553    /* 14-17 instructions */
4554
4555
4556/* ------------------------------ */
4557    .balign 64
4558.L_OP_REM_LONG: /* 0x9f */
4559/* File: armv5te/OP_REM_LONG.S */
4560/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4561/* File: armv5te/binopWide.S */
4562    /*
4563     * Generic 64-bit binary operation.  Provide an "instr" line that
4564     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4565     * This could be an ARM instruction or a function call.  (If the result
4566     * comes back in a register other than r0, you can override "result".)
4567     *
4568     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4569     * vCC (r1).  Useful for integer division and modulus.
4570     *
4571     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4572     *      xor-long, add-double, sub-double, mul-double, div-double,
4573     *      rem-double
4574     *
4575     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4576     */
4577    /* binop vAA, vBB, vCC */
4578    FETCH(r0, 1)                        @ r0<- CCBB
4579    mov     r9, rINST, lsr #8           @ r9<- AA
4580    and     r2, r0, #255                @ r2<- BB
4581    mov     r3, r0, lsr #8              @ r3<- CC
4582    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4583    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4584    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4585    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4586    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4587    .if 1
4588    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4589    beq     common_errDivideByZero
4590    .endif
4591    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4592
4593                               @ optional op; may set condition codes
4594    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4595    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4596    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4597    GOTO_OPCODE(ip)                     @ jump to next instruction
4598    /* 14-17 instructions */
4599
4600
4601/* ------------------------------ */
4602    .balign 64
4603.L_OP_AND_LONG: /* 0xa0 */
4604/* File: armv5te/OP_AND_LONG.S */
4605/* File: armv5te/binopWide.S */
4606    /*
4607     * Generic 64-bit binary operation.  Provide an "instr" line that
4608     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4609     * This could be an ARM instruction or a function call.  (If the result
4610     * comes back in a register other than r0, you can override "result".)
4611     *
4612     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4613     * vCC (r1).  Useful for integer division and modulus.
4614     *
4615     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4616     *      xor-long, add-double, sub-double, mul-double, div-double,
4617     *      rem-double
4618     *
4619     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4620     */
4621    /* binop vAA, vBB, vCC */
4622    FETCH(r0, 1)                        @ r0<- CCBB
4623    mov     r9, rINST, lsr #8           @ r9<- AA
4624    and     r2, r0, #255                @ r2<- BB
4625    mov     r3, r0, lsr #8              @ r3<- CC
4626    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4627    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4628    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4629    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4630    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4631    .if 0
4632    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4633    beq     common_errDivideByZero
4634    .endif
4635    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4636
4637    and     r0, r0, r2                           @ optional op; may set condition codes
4638    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4639    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4640    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4641    GOTO_OPCODE(ip)                     @ jump to next instruction
4642    /* 14-17 instructions */
4643
4644
4645/* ------------------------------ */
4646    .balign 64
4647.L_OP_OR_LONG: /* 0xa1 */
4648/* File: armv5te/OP_OR_LONG.S */
4649/* File: armv5te/binopWide.S */
4650    /*
4651     * Generic 64-bit binary operation.  Provide an "instr" line that
4652     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4653     * This could be an ARM instruction or a function call.  (If the result
4654     * comes back in a register other than r0, you can override "result".)
4655     *
4656     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4657     * vCC (r1).  Useful for integer division and modulus.
4658     *
4659     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4660     *      xor-long, add-double, sub-double, mul-double, div-double,
4661     *      rem-double
4662     *
4663     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4664     */
4665    /* binop vAA, vBB, vCC */
4666    FETCH(r0, 1)                        @ r0<- CCBB
4667    mov     r9, rINST, lsr #8           @ r9<- AA
4668    and     r2, r0, #255                @ r2<- BB
4669    mov     r3, r0, lsr #8              @ r3<- CC
4670    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4671    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4672    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4673    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4674    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4675    .if 0
4676    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4677    beq     common_errDivideByZero
4678    .endif
4679    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4680
4681    orr     r0, r0, r2                           @ optional op; may set condition codes
4682    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4683    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4684    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4685    GOTO_OPCODE(ip)                     @ jump to next instruction
4686    /* 14-17 instructions */
4687
4688
4689/* ------------------------------ */
4690    .balign 64
4691.L_OP_XOR_LONG: /* 0xa2 */
4692/* File: armv5te/OP_XOR_LONG.S */
4693/* File: armv5te/binopWide.S */
4694    /*
4695     * Generic 64-bit binary operation.  Provide an "instr" line that
4696     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4697     * This could be an ARM instruction or a function call.  (If the result
4698     * comes back in a register other than r0, you can override "result".)
4699     *
4700     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4701     * vCC (r1).  Useful for integer division and modulus.
4702     *
4703     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4704     *      xor-long, add-double, sub-double, mul-double, div-double,
4705     *      rem-double
4706     *
4707     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4708     */
4709    /* binop vAA, vBB, vCC */
4710    FETCH(r0, 1)                        @ r0<- CCBB
4711    mov     r9, rINST, lsr #8           @ r9<- AA
4712    and     r2, r0, #255                @ r2<- BB
4713    mov     r3, r0, lsr #8              @ r3<- CC
4714    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4715    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4716    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4717    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4718    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4719    .if 0
4720    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4721    beq     common_errDivideByZero
4722    .endif
4723    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4724
4725    eor     r0, r0, r2                           @ optional op; may set condition codes
4726    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4727    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4728    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4729    GOTO_OPCODE(ip)                     @ jump to next instruction
4730    /* 14-17 instructions */
4731
4732
4733/* ------------------------------ */
4734    .balign 64
4735.L_OP_SHL_LONG: /* 0xa3 */
4736/* File: armv5te/OP_SHL_LONG.S */
4737    /*
4738     * Long integer shift.  This is different from the generic 32/64-bit
4739     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4740     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4741     * 6 bits of the shift distance.
4742     */
4743    /* shl-long vAA, vBB, vCC */
4744    FETCH(r0, 1)                        @ r0<- CCBB
4745    mov     r9, rINST, lsr #8           @ r9<- AA
4746    and     r3, r0, #255                @ r3<- BB
4747    mov     r0, r0, lsr #8              @ r0<- CC
4748    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4749    GET_VREG(r2, r0)                    @ r2<- vCC
4750    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4751    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4752    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4753
4754    mov     r1, r1, asl r2              @  r1<- r1 << r2
4755    rsb     r3, r2, #32                 @  r3<- 32 - r2
4756    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
4757    subs    ip, r2, #32                 @  ip<- r2 - 32
4758    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
4759    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4760    b       .LOP_SHL_LONG_finish
4761
4762/* ------------------------------ */
4763    .balign 64
4764.L_OP_SHR_LONG: /* 0xa4 */
4765/* File: armv5te/OP_SHR_LONG.S */
4766    /*
4767     * Long integer shift.  This is different from the generic 32/64-bit
4768     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4769     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4770     * 6 bits of the shift distance.
4771     */
4772    /* shr-long vAA, vBB, vCC */
4773    FETCH(r0, 1)                        @ r0<- CCBB
4774    mov     r9, rINST, lsr #8           @ r9<- AA
4775    and     r3, r0, #255                @ r3<- BB
4776    mov     r0, r0, lsr #8              @ r0<- CC
4777    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4778    GET_VREG(r2, r0)                    @ r2<- vCC
4779    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4780    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4781    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4782
4783    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4784    rsb     r3, r2, #32                 @  r3<- 32 - r2
4785    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4786    subs    ip, r2, #32                 @  ip<- r2 - 32
4787    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
4788    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4789    b       .LOP_SHR_LONG_finish
4790
4791/* ------------------------------ */
4792    .balign 64
4793.L_OP_USHR_LONG: /* 0xa5 */
4794/* File: armv5te/OP_USHR_LONG.S */
4795    /*
4796     * Long integer shift.  This is different from the generic 32/64-bit
4797     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4798     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4799     * 6 bits of the shift distance.
4800     */
4801    /* ushr-long vAA, vBB, vCC */
4802    FETCH(r0, 1)                        @ r0<- CCBB
4803    mov     r9, rINST, lsr #8           @ r9<- AA
4804    and     r3, r0, #255                @ r3<- BB
4805    mov     r0, r0, lsr #8              @ r0<- CC
4806    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4807    GET_VREG(r2, r0)                    @ r2<- vCC
4808    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4809    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4810    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4811
4812    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4813    rsb     r3, r2, #32                 @  r3<- 32 - r2
4814    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4815    subs    ip, r2, #32                 @  ip<- r2 - 32
4816    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
4817    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4818    b       .LOP_USHR_LONG_finish
4819
4820/* ------------------------------ */
4821    .balign 64
4822.L_OP_ADD_FLOAT: /* 0xa6 */
4823/* File: arm-vfp/OP_ADD_FLOAT.S */
4824/* File: arm-vfp/fbinop.S */
4825    /*
4826     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4827     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4828     * use the "softfp" ABI, this must be an instruction, not a function call.
4829     *
4830     * For: add-float, sub-float, mul-float, div-float
4831     */
4832    /* floatop vAA, vBB, vCC */
4833    FETCH(r0, 1)                        @ r0<- CCBB
4834    mov     r9, rINST, lsr #8           @ r9<- AA
4835    mov     r3, r0, lsr #8              @ r3<- CC
4836    and     r2, r0, #255                @ r2<- BB
4837    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4838    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4839    flds    s1, [r3]                    @ s1<- vCC
4840    flds    s0, [r2]                    @ s0<- vBB
4841
4842    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4843    fadds   s2, s0, s1                              @ s2<- op
4844    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4845    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4846    fsts    s2, [r9]                    @ vAA<- s2
4847    GOTO_OPCODE(ip)                     @ jump to next instruction
4848
4849
4850/* ------------------------------ */
4851    .balign 64
4852.L_OP_SUB_FLOAT: /* 0xa7 */
4853/* File: arm-vfp/OP_SUB_FLOAT.S */
4854/* File: arm-vfp/fbinop.S */
4855    /*
4856     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4857     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4858     * use the "softfp" ABI, this must be an instruction, not a function call.
4859     *
4860     * For: add-float, sub-float, mul-float, div-float
4861     */
4862    /* floatop vAA, vBB, vCC */
4863    FETCH(r0, 1)                        @ r0<- CCBB
4864    mov     r9, rINST, lsr #8           @ r9<- AA
4865    mov     r3, r0, lsr #8              @ r3<- CC
4866    and     r2, r0, #255                @ r2<- BB
4867    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4868    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4869    flds    s1, [r3]                    @ s1<- vCC
4870    flds    s0, [r2]                    @ s0<- vBB
4871
4872    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4873    fsubs   s2, s0, s1                              @ s2<- op
4874    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4875    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4876    fsts    s2, [r9]                    @ vAA<- s2
4877    GOTO_OPCODE(ip)                     @ jump to next instruction
4878
4879
4880/* ------------------------------ */
4881    .balign 64
4882.L_OP_MUL_FLOAT: /* 0xa8 */
4883/* File: arm-vfp/OP_MUL_FLOAT.S */
4884/* File: arm-vfp/fbinop.S */
4885    /*
4886     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4887     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4888     * use the "softfp" ABI, this must be an instruction, not a function call.
4889     *
4890     * For: add-float, sub-float, mul-float, div-float
4891     */
4892    /* floatop vAA, vBB, vCC */
4893    FETCH(r0, 1)                        @ r0<- CCBB
4894    mov     r9, rINST, lsr #8           @ r9<- AA
4895    mov     r3, r0, lsr #8              @ r3<- CC
4896    and     r2, r0, #255                @ r2<- BB
4897    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4898    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4899    flds    s1, [r3]                    @ s1<- vCC
4900    flds    s0, [r2]                    @ s0<- vBB
4901
4902    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4903    fmuls   s2, s0, s1                              @ s2<- op
4904    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4905    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4906    fsts    s2, [r9]                    @ vAA<- s2
4907    GOTO_OPCODE(ip)                     @ jump to next instruction
4908
4909
4910/* ------------------------------ */
4911    .balign 64
4912.L_OP_DIV_FLOAT: /* 0xa9 */
4913/* File: arm-vfp/OP_DIV_FLOAT.S */
4914/* File: arm-vfp/fbinop.S */
4915    /*
4916     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4917     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4918     * use the "softfp" ABI, this must be an instruction, not a function call.
4919     *
4920     * For: add-float, sub-float, mul-float, div-float
4921     */
4922    /* floatop vAA, vBB, vCC */
4923    FETCH(r0, 1)                        @ r0<- CCBB
4924    mov     r9, rINST, lsr #8           @ r9<- AA
4925    mov     r3, r0, lsr #8              @ r3<- CC
4926    and     r2, r0, #255                @ r2<- BB
4927    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4928    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4929    flds    s1, [r3]                    @ s1<- vCC
4930    flds    s0, [r2]                    @ s0<- vBB
4931
4932    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4933    fdivs   s2, s0, s1                              @ s2<- op
4934    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4935    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4936    fsts    s2, [r9]                    @ vAA<- s2
4937    GOTO_OPCODE(ip)                     @ jump to next instruction
4938
4939
4940/* ------------------------------ */
4941    .balign 64
4942.L_OP_REM_FLOAT: /* 0xaa */
4943/* File: armv5te/OP_REM_FLOAT.S */
4944/* EABI doesn't define a float remainder function, but libm does */
4945/* File: armv5te/binop.S */
4946    /*
4947     * Generic 32-bit binary operation.  Provide an "instr" line that
4948     * specifies an instruction that performs "result = r0 op r1".
4949     * This could be an ARM instruction or a function call.  (If the result
4950     * comes back in a register other than r0, you can override "result".)
4951     *
4952     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4953     * vCC (r1).  Useful for integer division and modulus.  Note that we
4954     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4955     * handles it correctly.
4956     *
4957     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4958     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4959     *      mul-float, div-float, rem-float
4960     */
4961    /* binop vAA, vBB, vCC */
4962    FETCH(r0, 1)                        @ r0<- CCBB
4963    mov     r9, rINST, lsr #8           @ r9<- AA
4964    mov     r3, r0, lsr #8              @ r3<- CC
4965    and     r2, r0, #255                @ r2<- BB
4966    GET_VREG(r1, r3)                    @ r1<- vCC
4967    GET_VREG(r0, r2)                    @ r0<- vBB
4968    .if 0
4969    cmp     r1, #0                      @ is second operand zero?
4970    beq     common_errDivideByZero
4971    .endif
4972
4973    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4974                               @ optional op; may set condition codes
4975    bl      fmodf                              @ r0<- op, r0-r3 changed
4976    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4977    SET_VREG(r0, r9)               @ vAA<- r0
4978    GOTO_OPCODE(ip)                     @ jump to next instruction
4979    /* 11-14 instructions */
4980
4981
4982/* ------------------------------ */
4983    .balign 64
4984.L_OP_ADD_DOUBLE: /* 0xab */
4985/* File: arm-vfp/OP_ADD_DOUBLE.S */
4986/* File: arm-vfp/fbinopWide.S */
4987    /*
4988     * Generic 64-bit double-precision floating point binary operation.
4989     * Provide an "instr" line that specifies an instruction that performs
4990     * "d2 = d0 op d1".
4991     *
4992     * for: add-double, sub-double, mul-double, div-double
4993     */
4994    /* doubleop vAA, vBB, vCC */
4995    FETCH(r0, 1)                        @ r0<- CCBB
4996    mov     r9, rINST, lsr #8           @ r9<- AA
4997    mov     r3, r0, lsr #8              @ r3<- CC
4998    and     r2, r0, #255                @ r2<- BB
4999    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5000    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5001    fldd    d1, [r3]                    @ d1<- vCC
5002    fldd    d0, [r2]                    @ d0<- vBB
5003
5004    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5005    faddd   d2, d0, d1                              @ s2<- op
5006    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5007    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5008    fstd    d2, [r9]                    @ vAA<- d2
5009    GOTO_OPCODE(ip)                     @ jump to next instruction
5010
5011
5012/* ------------------------------ */
5013    .balign 64
5014.L_OP_SUB_DOUBLE: /* 0xac */
5015/* File: arm-vfp/OP_SUB_DOUBLE.S */
5016/* File: arm-vfp/fbinopWide.S */
5017    /*
5018     * Generic 64-bit double-precision floating point binary operation.
5019     * Provide an "instr" line that specifies an instruction that performs
5020     * "d2 = d0 op d1".
5021     *
5022     * for: add-double, sub-double, mul-double, div-double
5023     */
5024    /* doubleop vAA, vBB, vCC */
5025    FETCH(r0, 1)                        @ r0<- CCBB
5026    mov     r9, rINST, lsr #8           @ r9<- AA
5027    mov     r3, r0, lsr #8              @ r3<- CC
5028    and     r2, r0, #255                @ r2<- BB
5029    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5030    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5031    fldd    d1, [r3]                    @ d1<- vCC
5032    fldd    d0, [r2]                    @ d0<- vBB
5033
5034    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5035    fsubd   d2, d0, d1                              @ s2<- op
5036    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5037    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5038    fstd    d2, [r9]                    @ vAA<- d2
5039    GOTO_OPCODE(ip)                     @ jump to next instruction
5040
5041
5042/* ------------------------------ */
5043    .balign 64
5044.L_OP_MUL_DOUBLE: /* 0xad */
5045/* File: arm-vfp/OP_MUL_DOUBLE.S */
5046/* File: arm-vfp/fbinopWide.S */
5047    /*
5048     * Generic 64-bit double-precision floating point binary operation.
5049     * Provide an "instr" line that specifies an instruction that performs
5050     * "d2 = d0 op d1".
5051     *
5052     * for: add-double, sub-double, mul-double, div-double
5053     */
5054    /* doubleop vAA, vBB, vCC */
5055    FETCH(r0, 1)                        @ r0<- CCBB
5056    mov     r9, rINST, lsr #8           @ r9<- AA
5057    mov     r3, r0, lsr #8              @ r3<- CC
5058    and     r2, r0, #255                @ r2<- BB
5059    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5060    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5061    fldd    d1, [r3]                    @ d1<- vCC
5062    fldd    d0, [r2]                    @ d0<- vBB
5063
5064    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5065    fmuld   d2, d0, d1                              @ s2<- op
5066    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5067    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5068    fstd    d2, [r9]                    @ vAA<- d2
5069    GOTO_OPCODE(ip)                     @ jump to next instruction
5070
5071
5072/* ------------------------------ */
5073    .balign 64
5074.L_OP_DIV_DOUBLE: /* 0xae */
5075/* File: arm-vfp/OP_DIV_DOUBLE.S */
5076/* File: arm-vfp/fbinopWide.S */
5077    /*
5078     * Generic 64-bit double-precision floating point binary operation.
5079     * Provide an "instr" line that specifies an instruction that performs
5080     * "d2 = d0 op d1".
5081     *
5082     * for: add-double, sub-double, mul-double, div-double
5083     */
5084    /* doubleop vAA, vBB, vCC */
5085    FETCH(r0, 1)                        @ r0<- CCBB
5086    mov     r9, rINST, lsr #8           @ r9<- AA
5087    mov     r3, r0, lsr #8              @ r3<- CC
5088    and     r2, r0, #255                @ r2<- BB
5089    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5090    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5091    fldd    d1, [r3]                    @ d1<- vCC
5092    fldd    d0, [r2]                    @ d0<- vBB
5093
5094    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5095    fdivd   d2, d0, d1                              @ s2<- op
5096    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5097    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5098    fstd    d2, [r9]                    @ vAA<- d2
5099    GOTO_OPCODE(ip)                     @ jump to next instruction
5100
5101
5102/* ------------------------------ */
5103    .balign 64
5104.L_OP_REM_DOUBLE: /* 0xaf */
5105/* File: armv5te/OP_REM_DOUBLE.S */
5106/* EABI doesn't define a double remainder function, but libm does */
5107/* File: armv5te/binopWide.S */
5108    /*
5109     * Generic 64-bit binary operation.  Provide an "instr" line that
5110     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5111     * This could be an ARM instruction or a function call.  (If the result
5112     * comes back in a register other than r0, you can override "result".)
5113     *
5114     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5115     * vCC (r1).  Useful for integer division and modulus.
5116     *
5117     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5118     *      xor-long, add-double, sub-double, mul-double, div-double,
5119     *      rem-double
5120     *
5121     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5122     */
5123    /* binop vAA, vBB, vCC */
5124    FETCH(r0, 1)                        @ r0<- CCBB
5125    mov     r9, rINST, lsr #8           @ r9<- AA
5126    and     r2, r0, #255                @ r2<- BB
5127    mov     r3, r0, lsr #8              @ r3<- CC
5128    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5129    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5130    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5131    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5132    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5133    .if 0
5134    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5135    beq     common_errDivideByZero
5136    .endif
5137    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5138
5139                               @ optional op; may set condition codes
5140    bl      fmod                              @ result<- op, r0-r3 changed
5141    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5142    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5143    GOTO_OPCODE(ip)                     @ jump to next instruction
5144    /* 14-17 instructions */
5145
5146
5147/* ------------------------------ */
5148    .balign 64
5149.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5150/* File: armv6t2/OP_ADD_INT_2ADDR.S */
5151/* File: armv6t2/binop2addr.S */
5152    /*
5153     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5154     * that specifies an instruction that performs "result = r0 op r1".
5155     * This could be an ARM instruction or a function call.  (If the result
5156     * comes back in a register other than r0, you can override "result".)
5157     *
5158     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5159     * vCC (r1).  Useful for integer division and modulus.
5160     *
5161     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5162     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5163     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5164     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5165     */
5166    /* binop/2addr vA, vB */
5167    mov     r3, rINST, lsr #12          @ r3<- B
5168    ubfx    r9, rINST, #8, #4           @ r9<- A
5169    GET_VREG(r1, r3)                    @ r1<- vB
5170    GET_VREG(r0, r9)                    @ r0<- vA
5171    .if 0
5172    cmp     r1, #0                      @ is second operand zero?
5173    beq     common_errDivideByZero
5174    .endif
5175    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5176
5177                               @ optional op; may set condition codes
5178    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5179    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5180    SET_VREG(r0, r9)               @ vAA<- r0
5181    GOTO_OPCODE(ip)                     @ jump to next instruction
5182    /* 10-13 instructions */
5183
5184
5185/* ------------------------------ */
5186    .balign 64
5187.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5188/* File: armv6t2/OP_SUB_INT_2ADDR.S */
5189/* File: armv6t2/binop2addr.S */
5190    /*
5191     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5192     * that specifies an instruction that performs "result = r0 op r1".
5193     * This could be an ARM instruction or a function call.  (If the result
5194     * comes back in a register other than r0, you can override "result".)
5195     *
5196     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5197     * vCC (r1).  Useful for integer division and modulus.
5198     *
5199     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5200     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5201     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5202     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5203     */
5204    /* binop/2addr vA, vB */
5205    mov     r3, rINST, lsr #12          @ r3<- B
5206    ubfx    r9, rINST, #8, #4           @ r9<- A
5207    GET_VREG(r1, r3)                    @ r1<- vB
5208    GET_VREG(r0, r9)                    @ r0<- vA
5209    .if 0
5210    cmp     r1, #0                      @ is second operand zero?
5211    beq     common_errDivideByZero
5212    .endif
5213    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5214
5215                               @ optional op; may set condition codes
5216    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5217    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5218    SET_VREG(r0, r9)               @ vAA<- r0
5219    GOTO_OPCODE(ip)                     @ jump to next instruction
5220    /* 10-13 instructions */
5221
5222
5223/* ------------------------------ */
5224    .balign 64
5225.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5226/* File: armv6t2/OP_MUL_INT_2ADDR.S */
5227/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5228/* File: armv6t2/binop2addr.S */
5229    /*
5230     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5231     * that specifies an instruction that performs "result = r0 op r1".
5232     * This could be an ARM instruction or a function call.  (If the result
5233     * comes back in a register other than r0, you can override "result".)
5234     *
5235     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5236     * vCC (r1).  Useful for integer division and modulus.
5237     *
5238     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5239     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5240     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5241     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5242     */
5243    /* binop/2addr vA, vB */
5244    mov     r3, rINST, lsr #12          @ r3<- B
5245    ubfx    r9, rINST, #8, #4           @ r9<- A
5246    GET_VREG(r1, r3)                    @ r1<- vB
5247    GET_VREG(r0, r9)                    @ r0<- vA
5248    .if 0
5249    cmp     r1, #0                      @ is second operand zero?
5250    beq     common_errDivideByZero
5251    .endif
5252    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5253
5254                               @ optional op; may set condition codes
5255    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5256    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5257    SET_VREG(r0, r9)               @ vAA<- r0
5258    GOTO_OPCODE(ip)                     @ jump to next instruction
5259    /* 10-13 instructions */
5260
5261
5262/* ------------------------------ */
5263    .balign 64
5264.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5265/* File: armv6t2/OP_DIV_INT_2ADDR.S */
5266/* File: armv6t2/binop2addr.S */
5267    /*
5268     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5269     * that specifies an instruction that performs "result = r0 op r1".
5270     * This could be an ARM instruction or a function call.  (If the result
5271     * comes back in a register other than r0, you can override "result".)
5272     *
5273     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5274     * vCC (r1).  Useful for integer division and modulus.
5275     *
5276     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5277     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5278     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5279     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5280     */
5281    /* binop/2addr vA, vB */
5282    mov     r3, rINST, lsr #12          @ r3<- B
5283    ubfx    r9, rINST, #8, #4           @ r9<- A
5284    GET_VREG(r1, r3)                    @ r1<- vB
5285    GET_VREG(r0, r9)                    @ r0<- vA
5286    .if 1
5287    cmp     r1, #0                      @ is second operand zero?
5288    beq     common_errDivideByZero
5289    .endif
5290    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5291
5292                               @ optional op; may set condition codes
5293    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5294    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5295    SET_VREG(r0, r9)               @ vAA<- r0
5296    GOTO_OPCODE(ip)                     @ jump to next instruction
5297    /* 10-13 instructions */
5298
5299
5300/* ------------------------------ */
5301    .balign 64
5302.L_OP_REM_INT_2ADDR: /* 0xb4 */
5303/* File: armv6t2/OP_REM_INT_2ADDR.S */
5304/* idivmod returns quotient in r0 and remainder in r1 */
5305/* File: armv6t2/binop2addr.S */
5306    /*
5307     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5308     * that specifies an instruction that performs "result = r0 op r1".
5309     * This could be an ARM instruction or a function call.  (If the result
5310     * comes back in a register other than r0, you can override "result".)
5311     *
5312     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5313     * vCC (r1).  Useful for integer division and modulus.
5314     *
5315     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5316     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5317     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5318     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5319     */
5320    /* binop/2addr vA, vB */
5321    mov     r3, rINST, lsr #12          @ r3<- B
5322    ubfx    r9, rINST, #8, #4           @ r9<- A
5323    GET_VREG(r1, r3)                    @ r1<- vB
5324    GET_VREG(r0, r9)                    @ r0<- vA
5325    .if 1
5326    cmp     r1, #0                      @ is second operand zero?
5327    beq     common_errDivideByZero
5328    .endif
5329    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5330
5331                               @ optional op; may set condition codes
5332    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5333    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5334    SET_VREG(r1, r9)               @ vAA<- r1
5335    GOTO_OPCODE(ip)                     @ jump to next instruction
5336    /* 10-13 instructions */
5337
5338
5339/* ------------------------------ */
5340    .balign 64
5341.L_OP_AND_INT_2ADDR: /* 0xb5 */
5342/* File: armv6t2/OP_AND_INT_2ADDR.S */
5343/* File: armv6t2/binop2addr.S */
5344    /*
5345     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5346     * that specifies an instruction that performs "result = r0 op r1".
5347     * This could be an ARM instruction or a function call.  (If the result
5348     * comes back in a register other than r0, you can override "result".)
5349     *
5350     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5351     * vCC (r1).  Useful for integer division and modulus.
5352     *
5353     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5354     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5355     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5356     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5357     */
5358    /* binop/2addr vA, vB */
5359    mov     r3, rINST, lsr #12          @ r3<- B
5360    ubfx    r9, rINST, #8, #4           @ r9<- A
5361    GET_VREG(r1, r3)                    @ r1<- vB
5362    GET_VREG(r0, r9)                    @ r0<- vA
5363    .if 0
5364    cmp     r1, #0                      @ is second operand zero?
5365    beq     common_errDivideByZero
5366    .endif
5367    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5368
5369                               @ optional op; may set condition codes
5370    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5371    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5372    SET_VREG(r0, r9)               @ vAA<- r0
5373    GOTO_OPCODE(ip)                     @ jump to next instruction
5374    /* 10-13 instructions */
5375
5376
5377/* ------------------------------ */
5378    .balign 64
5379.L_OP_OR_INT_2ADDR: /* 0xb6 */
5380/* File: armv6t2/OP_OR_INT_2ADDR.S */
5381/* File: armv6t2/binop2addr.S */
5382    /*
5383     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5384     * that specifies an instruction that performs "result = r0 op r1".
5385     * This could be an ARM instruction or a function call.  (If the result
5386     * comes back in a register other than r0, you can override "result".)
5387     *
5388     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5389     * vCC (r1).  Useful for integer division and modulus.
5390     *
5391     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5392     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5393     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5394     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5395     */
5396    /* binop/2addr vA, vB */
5397    mov     r3, rINST, lsr #12          @ r3<- B
5398    ubfx    r9, rINST, #8, #4           @ r9<- A
5399    GET_VREG(r1, r3)                    @ r1<- vB
5400    GET_VREG(r0, r9)                    @ r0<- vA
5401    .if 0
5402    cmp     r1, #0                      @ is second operand zero?
5403    beq     common_errDivideByZero
5404    .endif
5405    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5406
5407                               @ optional op; may set condition codes
5408    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5409    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5410    SET_VREG(r0, r9)               @ vAA<- r0
5411    GOTO_OPCODE(ip)                     @ jump to next instruction
5412    /* 10-13 instructions */
5413
5414
5415/* ------------------------------ */
5416    .balign 64
5417.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5418/* File: armv6t2/OP_XOR_INT_2ADDR.S */
5419/* File: armv6t2/binop2addr.S */
5420    /*
5421     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5422     * that specifies an instruction that performs "result = r0 op r1".
5423     * This could be an ARM instruction or a function call.  (If the result
5424     * comes back in a register other than r0, you can override "result".)
5425     *
5426     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5427     * vCC (r1).  Useful for integer division and modulus.
5428     *
5429     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5430     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5431     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5432     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5433     */
5434    /* binop/2addr vA, vB */
5435    mov     r3, rINST, lsr #12          @ r3<- B
5436    ubfx    r9, rINST, #8, #4           @ r9<- A
5437    GET_VREG(r1, r3)                    @ r1<- vB
5438    GET_VREG(r0, r9)                    @ r0<- vA
5439    .if 0
5440    cmp     r1, #0                      @ is second operand zero?
5441    beq     common_errDivideByZero
5442    .endif
5443    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5444
5445                               @ optional op; may set condition codes
5446    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5447    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5448    SET_VREG(r0, r9)               @ vAA<- r0
5449    GOTO_OPCODE(ip)                     @ jump to next instruction
5450    /* 10-13 instructions */
5451
5452
5453/* ------------------------------ */
5454    .balign 64
5455.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5456/* File: armv6t2/OP_SHL_INT_2ADDR.S */
5457/* File: armv6t2/binop2addr.S */
5458    /*
5459     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5460     * that specifies an instruction that performs "result = r0 op r1".
5461     * This could be an ARM instruction or a function call.  (If the result
5462     * comes back in a register other than r0, you can override "result".)
5463     *
5464     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5465     * vCC (r1).  Useful for integer division and modulus.
5466     *
5467     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5468     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5469     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5470     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5471     */
5472    /* binop/2addr vA, vB */
5473    mov     r3, rINST, lsr #12          @ r3<- B
5474    ubfx    r9, rINST, #8, #4           @ r9<- A
5475    GET_VREG(r1, r3)                    @ r1<- vB
5476    GET_VREG(r0, r9)                    @ r0<- vA
5477    .if 0
5478    cmp     r1, #0                      @ is second operand zero?
5479    beq     common_errDivideByZero
5480    .endif
5481    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5482
5483    and     r1, r1, #31                           @ optional op; may set condition codes
5484    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5485    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5486    SET_VREG(r0, r9)               @ vAA<- r0
5487    GOTO_OPCODE(ip)                     @ jump to next instruction
5488    /* 10-13 instructions */
5489
5490
5491/* ------------------------------ */
5492    .balign 64
5493.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5494/* File: armv6t2/OP_SHR_INT_2ADDR.S */
5495/* File: armv6t2/binop2addr.S */
5496    /*
5497     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5498     * that specifies an instruction that performs "result = r0 op r1".
5499     * This could be an ARM instruction or a function call.  (If the result
5500     * comes back in a register other than r0, you can override "result".)
5501     *
5502     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5503     * vCC (r1).  Useful for integer division and modulus.
5504     *
5505     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5506     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5507     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5508     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5509     */
5510    /* binop/2addr vA, vB */
5511    mov     r3, rINST, lsr #12          @ r3<- B
5512    ubfx    r9, rINST, #8, #4           @ r9<- A
5513    GET_VREG(r1, r3)                    @ r1<- vB
5514    GET_VREG(r0, r9)                    @ r0<- vA
5515    .if 0
5516    cmp     r1, #0                      @ is second operand zero?
5517    beq     common_errDivideByZero
5518    .endif
5519    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5520
5521    and     r1, r1, #31                           @ optional op; may set condition codes
5522    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5523    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5524    SET_VREG(r0, r9)               @ vAA<- r0
5525    GOTO_OPCODE(ip)                     @ jump to next instruction
5526    /* 10-13 instructions */
5527
5528
5529/* ------------------------------ */
5530    .balign 64
5531.L_OP_USHR_INT_2ADDR: /* 0xba */
5532/* File: armv6t2/OP_USHR_INT_2ADDR.S */
5533/* File: armv6t2/binop2addr.S */
5534    /*
5535     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5536     * that specifies an instruction that performs "result = r0 op r1".
5537     * This could be an ARM instruction or a function call.  (If the result
5538     * comes back in a register other than r0, you can override "result".)
5539     *
5540     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5541     * vCC (r1).  Useful for integer division and modulus.
5542     *
5543     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5544     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5545     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5546     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5547     */
5548    /* binop/2addr vA, vB */
5549    mov     r3, rINST, lsr #12          @ r3<- B
5550    ubfx    r9, rINST, #8, #4           @ r9<- A
5551    GET_VREG(r1, r3)                    @ r1<- vB
5552    GET_VREG(r0, r9)                    @ r0<- vA
5553    .if 0
5554    cmp     r1, #0                      @ is second operand zero?
5555    beq     common_errDivideByZero
5556    .endif
5557    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5558
5559    and     r1, r1, #31                           @ optional op; may set condition codes
5560    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5561    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5562    SET_VREG(r0, r9)               @ vAA<- r0
5563    GOTO_OPCODE(ip)                     @ jump to next instruction
5564    /* 10-13 instructions */
5565
5566
5567/* ------------------------------ */
5568    .balign 64
5569.L_OP_ADD_LONG_2ADDR: /* 0xbb */
5570/* File: armv6t2/OP_ADD_LONG_2ADDR.S */
5571/* File: armv6t2/binopWide2addr.S */
5572    /*
5573     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5574     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5575     * This could be an ARM instruction or a function call.  (If the result
5576     * comes back in a register other than r0, you can override "result".)
5577     *
5578     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5579     * vCC (r1).  Useful for integer division and modulus.
5580     *
5581     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5582     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5583     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5584     *      rem-double/2addr
5585     */
5586    /* binop/2addr vA, vB */
5587    mov     r1, rINST, lsr #12          @ r1<- B
5588    ubfx    r9, rINST, #8, #4           @ r9<- A
5589    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5590    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5591    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5592    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5593    .if 0
5594    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5595    beq     common_errDivideByZero
5596    .endif
5597    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5598
5599    adds    r0, r0, r2                           @ optional op; may set condition codes
5600    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5601    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5602    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5603    GOTO_OPCODE(ip)                     @ jump to next instruction
5604    /* 12-15 instructions */
5605
5606
5607/* ------------------------------ */
5608    .balign 64
5609.L_OP_SUB_LONG_2ADDR: /* 0xbc */
5610/* File: armv6t2/OP_SUB_LONG_2ADDR.S */
5611/* File: armv6t2/binopWide2addr.S */
5612    /*
5613     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5614     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5615     * This could be an ARM instruction or a function call.  (If the result
5616     * comes back in a register other than r0, you can override "result".)
5617     *
5618     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5619     * vCC (r1).  Useful for integer division and modulus.
5620     *
5621     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5622     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5623     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5624     *      rem-double/2addr
5625     */
5626    /* binop/2addr vA, vB */
5627    mov     r1, rINST, lsr #12          @ r1<- B
5628    ubfx    r9, rINST, #8, #4           @ r9<- A
5629    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5630    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5631    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5632    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5633    .if 0
5634    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5635    beq     common_errDivideByZero
5636    .endif
5637    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5638
5639    subs    r0, r0, r2                           @ optional op; may set condition codes
5640    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5641    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5642    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5643    GOTO_OPCODE(ip)                     @ jump to next instruction
5644    /* 12-15 instructions */
5645
5646
5647/* ------------------------------ */
5648    .balign 64
5649.L_OP_MUL_LONG_2ADDR: /* 0xbd */
5650/* File: armv6t2/OP_MUL_LONG_2ADDR.S */
5651    /*
5652     * Signed 64-bit integer multiply, "/2addr" version.
5653     *
5654     * See OP_MUL_LONG for an explanation.
5655     *
5656     * We get a little tight on registers, so to avoid looking up &fp[A]
5657     * again we stuff it into rINST.
5658     */
5659    /* mul-long/2addr vA, vB */
5660    mov     r1, rINST, lsr #12          @ r1<- B
5661    ubfx    r9, rINST, #8, #4           @ r9<- A
5662    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5663    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
5664    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5665    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
5666    mul     ip, r2, r1                  @  ip<- ZxW
5667    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
5668    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
5669    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
5670    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5671    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
5672    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5673    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
5674    GOTO_OPCODE(ip)                     @ jump to next instruction
5675
5676/* ------------------------------ */
5677    .balign 64
5678.L_OP_DIV_LONG_2ADDR: /* 0xbe */
5679/* File: armv6t2/OP_DIV_LONG_2ADDR.S */
5680/* File: armv6t2/binopWide2addr.S */
5681    /*
5682     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5683     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5684     * This could be an ARM instruction or a function call.  (If the result
5685     * comes back in a register other than r0, you can override "result".)
5686     *
5687     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5688     * vCC (r1).  Useful for integer division and modulus.
5689     *
5690     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5691     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5692     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5693     *      rem-double/2addr
5694     */
5695    /* binop/2addr vA, vB */
5696    mov     r1, rINST, lsr #12          @ r1<- B
5697    ubfx    r9, rINST, #8, #4           @ r9<- A
5698    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5699    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5700    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5701    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5702    .if 1
5703    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5704    beq     common_errDivideByZero
5705    .endif
5706    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5707
5708                               @ optional op; may set condition codes
5709    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5710    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5711    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5712    GOTO_OPCODE(ip)                     @ jump to next instruction
5713    /* 12-15 instructions */
5714
5715
5716/* ------------------------------ */
5717    .balign 64
5718.L_OP_REM_LONG_2ADDR: /* 0xbf */
5719/* File: armv6t2/OP_REM_LONG_2ADDR.S */
5720/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5721/* File: armv6t2/binopWide2addr.S */
5722    /*
5723     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5724     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5725     * This could be an ARM instruction or a function call.  (If the result
5726     * comes back in a register other than r0, you can override "result".)
5727     *
5728     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5729     * vCC (r1).  Useful for integer division and modulus.
5730     *
5731     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5732     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5733     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5734     *      rem-double/2addr
5735     */
5736    /* binop/2addr vA, vB */
5737    mov     r1, rINST, lsr #12          @ r1<- B
5738    ubfx    r9, rINST, #8, #4           @ r9<- A
5739    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5740    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5741    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5742    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5743    .if 1
5744    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5745    beq     common_errDivideByZero
5746    .endif
5747    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5748
5749                               @ optional op; may set condition codes
5750    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5751    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5752    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
5753    GOTO_OPCODE(ip)                     @ jump to next instruction
5754    /* 12-15 instructions */
5755
5756
5757/* ------------------------------ */
5758    .balign 64
5759.L_OP_AND_LONG_2ADDR: /* 0xc0 */
5760/* File: armv6t2/OP_AND_LONG_2ADDR.S */
5761/* File: armv6t2/binopWide2addr.S */
5762    /*
5763     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5764     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5765     * This could be an ARM instruction or a function call.  (If the result
5766     * comes back in a register other than r0, you can override "result".)
5767     *
5768     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5769     * vCC (r1).  Useful for integer division and modulus.
5770     *
5771     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5772     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5773     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5774     *      rem-double/2addr
5775     */
5776    /* binop/2addr vA, vB */
5777    mov     r1, rINST, lsr #12          @ r1<- B
5778    ubfx    r9, rINST, #8, #4           @ r9<- A
5779    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5780    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5781    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5782    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5783    .if 0
5784    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5785    beq     common_errDivideByZero
5786    .endif
5787    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5788
5789    and     r0, r0, r2                           @ optional op; may set condition codes
5790    and     r1, r1, r3                              @ result<- op, r0-r3 changed
5791    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5792    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5793    GOTO_OPCODE(ip)                     @ jump to next instruction
5794    /* 12-15 instructions */
5795
5796
5797/* ------------------------------ */
5798    .balign 64
5799.L_OP_OR_LONG_2ADDR: /* 0xc1 */
5800/* File: armv6t2/OP_OR_LONG_2ADDR.S */
5801/* File: armv6t2/binopWide2addr.S */
5802    /*
5803     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5804     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5805     * This could be an ARM instruction or a function call.  (If the result
5806     * comes back in a register other than r0, you can override "result".)
5807     *
5808     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5809     * vCC (r1).  Useful for integer division and modulus.
5810     *
5811     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5812     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5813     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5814     *      rem-double/2addr
5815     */
5816    /* binop/2addr vA, vB */
5817    mov     r1, rINST, lsr #12          @ r1<- B
5818    ubfx    r9, rINST, #8, #4           @ r9<- A
5819    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5820    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5821    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5822    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5823    .if 0
5824    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5825    beq     common_errDivideByZero
5826    .endif
5827    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5828
5829    orr     r0, r0, r2                           @ optional op; may set condition codes
5830    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
5831    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5832    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5833    GOTO_OPCODE(ip)                     @ jump to next instruction
5834    /* 12-15 instructions */
5835
5836
5837/* ------------------------------ */
5838    .balign 64
5839.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
5840/* File: armv6t2/OP_XOR_LONG_2ADDR.S */
5841/* File: armv6t2/binopWide2addr.S */
5842    /*
5843     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5844     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5845     * This could be an ARM instruction or a function call.  (If the result
5846     * comes back in a register other than r0, you can override "result".)
5847     *
5848     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5849     * vCC (r1).  Useful for integer division and modulus.
5850     *
5851     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5852     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5853     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5854     *      rem-double/2addr
5855     */
5856    /* binop/2addr vA, vB */
5857    mov     r1, rINST, lsr #12          @ r1<- B
5858    ubfx    r9, rINST, #8, #4           @ r9<- A
5859    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5860    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5861    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5862    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5863    .if 0
5864    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5865    beq     common_errDivideByZero
5866    .endif
5867    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5868
5869    eor     r0, r0, r2                           @ optional op; may set condition codes
5870    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
5871    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5872    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5873    GOTO_OPCODE(ip)                     @ jump to next instruction
5874    /* 12-15 instructions */
5875
5876
5877/* ------------------------------ */
5878    .balign 64
5879.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
5880/* File: armv6t2/OP_SHL_LONG_2ADDR.S */
5881    /*
5882     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5883     * 32-bit shift distance.
5884     */
5885    /* shl-long/2addr vA, vB */
5886    mov     r3, rINST, lsr #12          @ r3<- B
5887    ubfx    r9, rINST, #8, #4           @ r9<- A
5888    GET_VREG(r2, r3)                    @ r2<- vB
5889    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5890    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5891    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5892
5893    mov     r1, r1, asl r2              @  r1<- r1 << r2
5894    rsb     r3, r2, #32                 @  r3<- 32 - r2
5895    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
5896    subs    ip, r2, #32                 @  ip<- r2 - 32
5897    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5898    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
5899    mov     r0, r0, asl r2              @  r0<- r0 << r2
5900    b       .LOP_SHL_LONG_2ADDR_finish
5901
5902/* ------------------------------ */
5903    .balign 64
5904.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
5905/* File: armv6t2/OP_SHR_LONG_2ADDR.S */
5906    /*
5907     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5908     * 32-bit shift distance.
5909     */
5910    /* shr-long/2addr vA, vB */
5911    mov     r3, rINST, lsr #12          @ r3<- B
5912    ubfx    r9, rINST, #8, #4           @ r9<- A
5913    GET_VREG(r2, r3)                    @ r2<- vB
5914    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5915    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5916    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5917
5918    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5919    rsb     r3, r2, #32                 @  r3<- 32 - r2
5920    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5921    subs    ip, r2, #32                 @  ip<- r2 - 32
5922    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5923    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
5924    mov     r1, r1, asr r2              @  r1<- r1 >> r2
5925    b       .LOP_SHR_LONG_2ADDR_finish
5926
5927/* ------------------------------ */
5928    .balign 64
5929.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
5930/* File: armv6t2/OP_USHR_LONG_2ADDR.S */
5931    /*
5932     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5933     * 32-bit shift distance.
5934     */
5935    /* ushr-long/2addr vA, vB */
5936    mov     r3, rINST, lsr #12          @ r3<- B
5937    ubfx    r9, rINST, #8, #4           @ r9<- A
5938    GET_VREG(r2, r3)                    @ r2<- vB
5939    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5940    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5941    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5942
5943    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5944    rsb     r3, r2, #32                 @  r3<- 32 - r2
5945    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5946    subs    ip, r2, #32                 @  ip<- r2 - 32
5947    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5948    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
5949    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
5950    b       .LOP_USHR_LONG_2ADDR_finish
5951
5952/* ------------------------------ */
5953    .balign 64
5954.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
5955/* File: arm-vfp/OP_ADD_FLOAT_2ADDR.S */
5956/* File: arm-vfp/fbinop2addr.S */
5957    /*
5958     * Generic 32-bit floating point "/2addr" binary operation.  Provide
5959     * an "instr" line that specifies an instruction that performs
5960     * "s2 = s0 op s1".
5961     *
5962     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5963     */
5964    /* binop/2addr vA, vB */
5965    mov     r3, rINST, lsr #12          @ r3<- B
5966    mov     r9, rINST, lsr #8           @ r9<- A+
5967    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
5968    and     r9, r9, #15                 @ r9<- A
5969    flds    s1, [r3]                    @ s1<- vB
5970    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
5971    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5972    flds    s0, [r9]                    @ s0<- vA
5973
5974    fadds   s2, s0, s1                              @ s2<- op
5975    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5976    fsts    s2, [r9]                    @ vAA<- s2
5977    GOTO_OPCODE(ip)                     @ jump to next instruction
5978
5979
5980/* ------------------------------ */
5981    .balign 64
5982.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
5983/* File: arm-vfp/OP_SUB_FLOAT_2ADDR.S */
5984/* File: arm-vfp/fbinop2addr.S */
5985    /*
5986     * Generic 32-bit floating point "/2addr" binary operation.  Provide
5987     * an "instr" line that specifies an instruction that performs
5988     * "s2 = s0 op s1".
5989     *
5990     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5991     */
5992    /* binop/2addr vA, vB */
5993    mov     r3, rINST, lsr #12          @ r3<- B
5994    mov     r9, rINST, lsr #8           @ r9<- A+
5995    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
5996    and     r9, r9, #15                 @ r9<- A
5997    flds    s1, [r3]                    @ s1<- vB
5998    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
5999    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6000    flds    s0, [r9]                    @ s0<- vA
6001
6002    fsubs   s2, s0, s1                              @ s2<- op
6003    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6004    fsts    s2, [r9]                    @ vAA<- s2
6005    GOTO_OPCODE(ip)                     @ jump to next instruction
6006
6007
6008/* ------------------------------ */
6009    .balign 64
6010.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6011/* File: arm-vfp/OP_MUL_FLOAT_2ADDR.S */
6012/* File: arm-vfp/fbinop2addr.S */
6013    /*
6014     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6015     * an "instr" line that specifies an instruction that performs
6016     * "s2 = s0 op s1".
6017     *
6018     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6019     */
6020    /* binop/2addr vA, vB */
6021    mov     r3, rINST, lsr #12          @ r3<- B
6022    mov     r9, rINST, lsr #8           @ r9<- A+
6023    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6024    and     r9, r9, #15                 @ r9<- A
6025    flds    s1, [r3]                    @ s1<- vB
6026    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6027    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6028    flds    s0, [r9]                    @ s0<- vA
6029
6030    fmuls   s2, s0, s1                              @ s2<- op
6031    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6032    fsts    s2, [r9]                    @ vAA<- s2
6033    GOTO_OPCODE(ip)                     @ jump to next instruction
6034
6035
6036/* ------------------------------ */
6037    .balign 64
6038.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6039/* File: arm-vfp/OP_DIV_FLOAT_2ADDR.S */
6040/* File: arm-vfp/fbinop2addr.S */
6041    /*
6042     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6043     * an "instr" line that specifies an instruction that performs
6044     * "s2 = s0 op s1".
6045     *
6046     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6047     */
6048    /* binop/2addr vA, vB */
6049    mov     r3, rINST, lsr #12          @ r3<- B
6050    mov     r9, rINST, lsr #8           @ r9<- A+
6051    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6052    and     r9, r9, #15                 @ r9<- A
6053    flds    s1, [r3]                    @ s1<- vB
6054    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6055    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6056    flds    s0, [r9]                    @ s0<- vA
6057
6058    fdivs   s2, s0, s1                              @ s2<- op
6059    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6060    fsts    s2, [r9]                    @ vAA<- s2
6061    GOTO_OPCODE(ip)                     @ jump to next instruction
6062
6063
6064/* ------------------------------ */
6065    .balign 64
6066.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6067/* File: armv6t2/OP_REM_FLOAT_2ADDR.S */
6068/* EABI doesn't define a float remainder function, but libm does */
6069/* File: armv6t2/binop2addr.S */
6070    /*
6071     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6072     * that specifies an instruction that performs "result = r0 op r1".
6073     * This could be an ARM instruction or a function call.  (If the result
6074     * comes back in a register other than r0, you can override "result".)
6075     *
6076     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6077     * vCC (r1).  Useful for integer division and modulus.
6078     *
6079     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6080     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6081     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6082     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6083     */
6084    /* binop/2addr vA, vB */
6085    mov     r3, rINST, lsr #12          @ r3<- B
6086    ubfx    r9, rINST, #8, #4           @ r9<- A
6087    GET_VREG(r1, r3)                    @ r1<- vB
6088    GET_VREG(r0, r9)                    @ r0<- vA
6089    .if 0
6090    cmp     r1, #0                      @ is second operand zero?
6091    beq     common_errDivideByZero
6092    .endif
6093    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6094
6095                               @ optional op; may set condition codes
6096    bl      fmodf                              @ r0<- op, r0-r3 changed
6097    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6098    SET_VREG(r0, r9)               @ vAA<- r0
6099    GOTO_OPCODE(ip)                     @ jump to next instruction
6100    /* 10-13 instructions */
6101
6102
6103/* ------------------------------ */
6104    .balign 64
6105.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6106/* File: arm-vfp/OP_ADD_DOUBLE_2ADDR.S */
6107/* File: arm-vfp/fbinopWide2addr.S */
6108    /*
6109     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6110     * an "instr" line that specifies an instruction that performs
6111     * "d2 = d0 op d1".
6112     *
6113     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6114     *      div-double/2addr
6115     */
6116    /* binop/2addr vA, vB */
6117    mov     r3, rINST, lsr #12          @ r3<- B
6118    mov     r9, rINST, lsr #8           @ r9<- A+
6119    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6120    and     r9, r9, #15                 @ r9<- A
6121    fldd    d1, [r3]                    @ d1<- vB
6122    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6123    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6124    fldd    d0, [r9]                    @ d0<- vA
6125
6126    faddd   d2, d0, d1                              @ d2<- op
6127    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6128    fstd    d2, [r9]                    @ vAA<- d2
6129    GOTO_OPCODE(ip)                     @ jump to next instruction
6130
6131
6132/* ------------------------------ */
6133    .balign 64
6134.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6135/* File: arm-vfp/OP_SUB_DOUBLE_2ADDR.S */
6136/* File: arm-vfp/fbinopWide2addr.S */
6137    /*
6138     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6139     * an "instr" line that specifies an instruction that performs
6140     * "d2 = d0 op d1".
6141     *
6142     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6143     *      div-double/2addr
6144     */
6145    /* binop/2addr vA, vB */
6146    mov     r3, rINST, lsr #12          @ r3<- B
6147    mov     r9, rINST, lsr #8           @ r9<- A+
6148    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6149    and     r9, r9, #15                 @ r9<- A
6150    fldd    d1, [r3]                    @ d1<- vB
6151    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6152    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6153    fldd    d0, [r9]                    @ d0<- vA
6154
6155    fsubd   d2, d0, d1                              @ d2<- op
6156    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6157    fstd    d2, [r9]                    @ vAA<- d2
6158    GOTO_OPCODE(ip)                     @ jump to next instruction
6159
6160
6161/* ------------------------------ */
6162    .balign 64
6163.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6164/* File: arm-vfp/OP_MUL_DOUBLE_2ADDR.S */
6165/* File: arm-vfp/fbinopWide2addr.S */
6166    /*
6167     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6168     * an "instr" line that specifies an instruction that performs
6169     * "d2 = d0 op d1".
6170     *
6171     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6172     *      div-double/2addr
6173     */
6174    /* binop/2addr vA, vB */
6175    mov     r3, rINST, lsr #12          @ r3<- B
6176    mov     r9, rINST, lsr #8           @ r9<- A+
6177    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6178    and     r9, r9, #15                 @ r9<- A
6179    fldd    d1, [r3]                    @ d1<- vB
6180    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6181    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6182    fldd    d0, [r9]                    @ d0<- vA
6183
6184    fmuld   d2, d0, d1                              @ d2<- op
6185    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6186    fstd    d2, [r9]                    @ vAA<- d2
6187    GOTO_OPCODE(ip)                     @ jump to next instruction
6188
6189
6190/* ------------------------------ */
6191    .balign 64
6192.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6193/* File: arm-vfp/OP_DIV_DOUBLE_2ADDR.S */
6194/* File: arm-vfp/fbinopWide2addr.S */
6195    /*
6196     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6197     * an "instr" line that specifies an instruction that performs
6198     * "d2 = d0 op d1".
6199     *
6200     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6201     *      div-double/2addr
6202     */
6203    /* binop/2addr vA, vB */
6204    mov     r3, rINST, lsr #12          @ r3<- B
6205    mov     r9, rINST, lsr #8           @ r9<- A+
6206    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6207    and     r9, r9, #15                 @ r9<- A
6208    fldd    d1, [r3]                    @ d1<- vB
6209    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6210    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6211    fldd    d0, [r9]                    @ d0<- vA
6212
6213    fdivd   d2, d0, d1                              @ d2<- op
6214    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6215    fstd    d2, [r9]                    @ vAA<- d2
6216    GOTO_OPCODE(ip)                     @ jump to next instruction
6217
6218
6219/* ------------------------------ */
6220    .balign 64
6221.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6222/* File: armv6t2/OP_REM_DOUBLE_2ADDR.S */
6223/* EABI doesn't define a double remainder function, but libm does */
6224/* File: armv6t2/binopWide2addr.S */
6225    /*
6226     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6227     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6228     * This could be an ARM instruction or a function call.  (If the result
6229     * comes back in a register other than r0, you can override "result".)
6230     *
6231     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6232     * vCC (r1).  Useful for integer division and modulus.
6233     *
6234     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6235     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6236     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6237     *      rem-double/2addr
6238     */
6239    /* binop/2addr vA, vB */
6240    mov     r1, rINST, lsr #12          @ r1<- B
6241    ubfx    r9, rINST, #8, #4           @ r9<- A
6242    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6243    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6244    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6245    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6246    .if 0
6247    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6248    beq     common_errDivideByZero
6249    .endif
6250    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6251
6252                               @ optional op; may set condition codes
6253    bl      fmod                              @ result<- op, r0-r3 changed
6254    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6255    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6256    GOTO_OPCODE(ip)                     @ jump to next instruction
6257    /* 12-15 instructions */
6258
6259
6260/* ------------------------------ */
6261    .balign 64
6262.L_OP_ADD_INT_LIT16: /* 0xd0 */
6263/* File: armv6t2/OP_ADD_INT_LIT16.S */
6264/* File: armv6t2/binopLit16.S */
6265    /*
6266     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6267     * that specifies an instruction that performs "result = r0 op r1".
6268     * This could be an ARM instruction or a function call.  (If the result
6269     * comes back in a register other than r0, you can override "result".)
6270     *
6271     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6272     * vCC (r1).  Useful for integer division and modulus.
6273     *
6274     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6275     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6276     */
6277    /* binop/lit16 vA, vB, #+CCCC */
6278    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6279    mov     r2, rINST, lsr #12          @ r2<- B
6280    ubfx    r9, rINST, #8, #4           @ r9<- A
6281    GET_VREG(r0, r2)                    @ r0<- vB
6282    .if 0
6283    cmp     r1, #0                      @ is second operand zero?
6284    beq     common_errDivideByZero
6285    .endif
6286    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6287
6288    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6289    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6290    SET_VREG(r0, r9)               @ vAA<- r0
6291    GOTO_OPCODE(ip)                     @ jump to next instruction
6292    /* 10-13 instructions */
6293
6294
6295/* ------------------------------ */
6296    .balign 64
6297.L_OP_RSUB_INT: /* 0xd1 */
6298/* File: armv6t2/OP_RSUB_INT.S */
6299/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6300/* File: armv6t2/binopLit16.S */
6301    /*
6302     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6303     * that specifies an instruction that performs "result = r0 op r1".
6304     * This could be an ARM instruction or a function call.  (If the result
6305     * comes back in a register other than r0, you can override "result".)
6306     *
6307     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6308     * vCC (r1).  Useful for integer division and modulus.
6309     *
6310     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6311     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6312     */
6313    /* binop/lit16 vA, vB, #+CCCC */
6314    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6315    mov     r2, rINST, lsr #12          @ r2<- B
6316    ubfx    r9, rINST, #8, #4           @ r9<- A
6317    GET_VREG(r0, r2)                    @ r0<- vB
6318    .if 0
6319    cmp     r1, #0                      @ is second operand zero?
6320    beq     common_errDivideByZero
6321    .endif
6322    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6323
6324    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6325    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6326    SET_VREG(r0, r9)               @ vAA<- r0
6327    GOTO_OPCODE(ip)                     @ jump to next instruction
6328    /* 10-13 instructions */
6329
6330
6331/* ------------------------------ */
6332    .balign 64
6333.L_OP_MUL_INT_LIT16: /* 0xd2 */
6334/* File: armv6t2/OP_MUL_INT_LIT16.S */
6335/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6336/* File: armv6t2/binopLit16.S */
6337    /*
6338     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6339     * that specifies an instruction that performs "result = r0 op r1".
6340     * This could be an ARM instruction or a function call.  (If the result
6341     * comes back in a register other than r0, you can override "result".)
6342     *
6343     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6344     * vCC (r1).  Useful for integer division and modulus.
6345     *
6346     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6347     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6348     */
6349    /* binop/lit16 vA, vB, #+CCCC */
6350    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6351    mov     r2, rINST, lsr #12          @ r2<- B
6352    ubfx    r9, rINST, #8, #4           @ r9<- A
6353    GET_VREG(r0, r2)                    @ r0<- vB
6354    .if 0
6355    cmp     r1, #0                      @ is second operand zero?
6356    beq     common_errDivideByZero
6357    .endif
6358    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6359
6360    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6361    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6362    SET_VREG(r0, r9)               @ vAA<- r0
6363    GOTO_OPCODE(ip)                     @ jump to next instruction
6364    /* 10-13 instructions */
6365
6366
6367/* ------------------------------ */
6368    .balign 64
6369.L_OP_DIV_INT_LIT16: /* 0xd3 */
6370/* File: armv6t2/OP_DIV_INT_LIT16.S */
6371/* File: armv6t2/binopLit16.S */
6372    /*
6373     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6374     * that specifies an instruction that performs "result = r0 op r1".
6375     * This could be an ARM instruction or a function call.  (If the result
6376     * comes back in a register other than r0, you can override "result".)
6377     *
6378     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6379     * vCC (r1).  Useful for integer division and modulus.
6380     *
6381     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6382     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6383     */
6384    /* binop/lit16 vA, vB, #+CCCC */
6385    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6386    mov     r2, rINST, lsr #12          @ r2<- B
6387    ubfx    r9, rINST, #8, #4           @ r9<- A
6388    GET_VREG(r0, r2)                    @ r0<- vB
6389    .if 1
6390    cmp     r1, #0                      @ is second operand zero?
6391    beq     common_errDivideByZero
6392    .endif
6393    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6394
6395    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6396    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6397    SET_VREG(r0, r9)               @ vAA<- r0
6398    GOTO_OPCODE(ip)                     @ jump to next instruction
6399    /* 10-13 instructions */
6400
6401
6402/* ------------------------------ */
6403    .balign 64
6404.L_OP_REM_INT_LIT16: /* 0xd4 */
6405/* File: armv6t2/OP_REM_INT_LIT16.S */
6406/* idivmod returns quotient in r0 and remainder in r1 */
6407/* File: armv6t2/binopLit16.S */
6408    /*
6409     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6410     * that specifies an instruction that performs "result = r0 op r1".
6411     * This could be an ARM instruction or a function call.  (If the result
6412     * comes back in a register other than r0, you can override "result".)
6413     *
6414     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6415     * vCC (r1).  Useful for integer division and modulus.
6416     *
6417     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6418     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6419     */
6420    /* binop/lit16 vA, vB, #+CCCC */
6421    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6422    mov     r2, rINST, lsr #12          @ r2<- B
6423    ubfx    r9, rINST, #8, #4           @ r9<- A
6424    GET_VREG(r0, r2)                    @ r0<- vB
6425    .if 1
6426    cmp     r1, #0                      @ is second operand zero?
6427    beq     common_errDivideByZero
6428    .endif
6429    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6430
6431    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6432    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6433    SET_VREG(r1, r9)               @ vAA<- r1
6434    GOTO_OPCODE(ip)                     @ jump to next instruction
6435    /* 10-13 instructions */
6436
6437
6438/* ------------------------------ */
6439    .balign 64
6440.L_OP_AND_INT_LIT16: /* 0xd5 */
6441/* File: armv6t2/OP_AND_INT_LIT16.S */
6442/* File: armv6t2/binopLit16.S */
6443    /*
6444     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6445     * that specifies an instruction that performs "result = r0 op r1".
6446     * This could be an ARM instruction or a function call.  (If the result
6447     * comes back in a register other than r0, you can override "result".)
6448     *
6449     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6450     * vCC (r1).  Useful for integer division and modulus.
6451     *
6452     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6453     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6454     */
6455    /* binop/lit16 vA, vB, #+CCCC */
6456    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6457    mov     r2, rINST, lsr #12          @ r2<- B
6458    ubfx    r9, rINST, #8, #4           @ r9<- A
6459    GET_VREG(r0, r2)                    @ r0<- vB
6460    .if 0
6461    cmp     r1, #0                      @ is second operand zero?
6462    beq     common_errDivideByZero
6463    .endif
6464    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6465
6466    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6467    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6468    SET_VREG(r0, r9)               @ vAA<- r0
6469    GOTO_OPCODE(ip)                     @ jump to next instruction
6470    /* 10-13 instructions */
6471
6472
6473/* ------------------------------ */
6474    .balign 64
6475.L_OP_OR_INT_LIT16: /* 0xd6 */
6476/* File: armv6t2/OP_OR_INT_LIT16.S */
6477/* File: armv6t2/binopLit16.S */
6478    /*
6479     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6480     * that specifies an instruction that performs "result = r0 op r1".
6481     * This could be an ARM instruction or a function call.  (If the result
6482     * comes back in a register other than r0, you can override "result".)
6483     *
6484     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6485     * vCC (r1).  Useful for integer division and modulus.
6486     *
6487     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6488     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6489     */
6490    /* binop/lit16 vA, vB, #+CCCC */
6491    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6492    mov     r2, rINST, lsr #12          @ r2<- B
6493    ubfx    r9, rINST, #8, #4           @ r9<- A
6494    GET_VREG(r0, r2)                    @ r0<- vB
6495    .if 0
6496    cmp     r1, #0                      @ is second operand zero?
6497    beq     common_errDivideByZero
6498    .endif
6499    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6500
6501    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6502    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6503    SET_VREG(r0, r9)               @ vAA<- r0
6504    GOTO_OPCODE(ip)                     @ jump to next instruction
6505    /* 10-13 instructions */
6506
6507
6508/* ------------------------------ */
6509    .balign 64
6510.L_OP_XOR_INT_LIT16: /* 0xd7 */
6511/* File: armv6t2/OP_XOR_INT_LIT16.S */
6512/* File: armv6t2/binopLit16.S */
6513    /*
6514     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6515     * that specifies an instruction that performs "result = r0 op r1".
6516     * This could be an ARM instruction or a function call.  (If the result
6517     * comes back in a register other than r0, you can override "result".)
6518     *
6519     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6520     * vCC (r1).  Useful for integer division and modulus.
6521     *
6522     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6523     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6524     */
6525    /* binop/lit16 vA, vB, #+CCCC */
6526    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6527    mov     r2, rINST, lsr #12          @ r2<- B
6528    ubfx    r9, rINST, #8, #4           @ r9<- A
6529    GET_VREG(r0, r2)                    @ r0<- vB
6530    .if 0
6531    cmp     r1, #0                      @ is second operand zero?
6532    beq     common_errDivideByZero
6533    .endif
6534    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6535
6536    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6537    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6538    SET_VREG(r0, r9)               @ vAA<- r0
6539    GOTO_OPCODE(ip)                     @ jump to next instruction
6540    /* 10-13 instructions */
6541
6542
6543/* ------------------------------ */
6544    .balign 64
6545.L_OP_ADD_INT_LIT8: /* 0xd8 */
6546/* File: armv5te/OP_ADD_INT_LIT8.S */
6547/* File: armv5te/binopLit8.S */
6548    /*
6549     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6550     * that specifies an instruction that performs "result = r0 op r1".
6551     * This could be an ARM instruction or a function call.  (If the result
6552     * comes back in a register other than r0, you can override "result".)
6553     *
6554     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6555     * vCC (r1).  Useful for integer division and modulus.
6556     *
6557     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6558     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6559     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6560     */
6561    /* binop/lit8 vAA, vBB, #+CC */
6562    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6563    mov     r9, rINST, lsr #8           @ r9<- AA
6564    and     r2, r3, #255                @ r2<- BB
6565    GET_VREG(r0, r2)                    @ r0<- vBB
6566    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6567    .if 0
6568    @cmp     r1, #0                      @ is second operand zero?
6569    beq     common_errDivideByZero
6570    .endif
6571    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6572
6573                               @ optional op; may set condition codes
6574    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6575    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6576    SET_VREG(r0, r9)               @ vAA<- r0
6577    GOTO_OPCODE(ip)                     @ jump to next instruction
6578    /* 10-12 instructions */
6579
6580
6581/* ------------------------------ */
6582    .balign 64
6583.L_OP_RSUB_INT_LIT8: /* 0xd9 */
6584/* File: armv5te/OP_RSUB_INT_LIT8.S */
6585/* File: armv5te/binopLit8.S */
6586    /*
6587     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6588     * that specifies an instruction that performs "result = r0 op r1".
6589     * This could be an ARM instruction or a function call.  (If the result
6590     * comes back in a register other than r0, you can override "result".)
6591     *
6592     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6593     * vCC (r1).  Useful for integer division and modulus.
6594     *
6595     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6596     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6597     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6598     */
6599    /* binop/lit8 vAA, vBB, #+CC */
6600    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6601    mov     r9, rINST, lsr #8           @ r9<- AA
6602    and     r2, r3, #255                @ r2<- BB
6603    GET_VREG(r0, r2)                    @ r0<- vBB
6604    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6605    .if 0
6606    @cmp     r1, #0                      @ is second operand zero?
6607    beq     common_errDivideByZero
6608    .endif
6609    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6610
6611                               @ optional op; may set condition codes
6612    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6613    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6614    SET_VREG(r0, r9)               @ vAA<- r0
6615    GOTO_OPCODE(ip)                     @ jump to next instruction
6616    /* 10-12 instructions */
6617
6618
6619/* ------------------------------ */
6620    .balign 64
6621.L_OP_MUL_INT_LIT8: /* 0xda */
6622/* File: armv5te/OP_MUL_INT_LIT8.S */
6623/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6624/* File: armv5te/binopLit8.S */
6625    /*
6626     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6627     * that specifies an instruction that performs "result = r0 op r1".
6628     * This could be an ARM instruction or a function call.  (If the result
6629     * comes back in a register other than r0, you can override "result".)
6630     *
6631     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6632     * vCC (r1).  Useful for integer division and modulus.
6633     *
6634     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6635     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6636     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6637     */
6638    /* binop/lit8 vAA, vBB, #+CC */
6639    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6640    mov     r9, rINST, lsr #8           @ r9<- AA
6641    and     r2, r3, #255                @ r2<- BB
6642    GET_VREG(r0, r2)                    @ r0<- vBB
6643    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6644    .if 0
6645    @cmp     r1, #0                      @ is second operand zero?
6646    beq     common_errDivideByZero
6647    .endif
6648    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6649
6650                               @ optional op; may set condition codes
6651    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6652    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6653    SET_VREG(r0, r9)               @ vAA<- r0
6654    GOTO_OPCODE(ip)                     @ jump to next instruction
6655    /* 10-12 instructions */
6656
6657
6658/* ------------------------------ */
6659    .balign 64
6660.L_OP_DIV_INT_LIT8: /* 0xdb */
6661/* File: armv5te/OP_DIV_INT_LIT8.S */
6662/* File: armv5te/binopLit8.S */
6663    /*
6664     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6665     * that specifies an instruction that performs "result = r0 op r1".
6666     * This could be an ARM instruction or a function call.  (If the result
6667     * comes back in a register other than r0, you can override "result".)
6668     *
6669     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6670     * vCC (r1).  Useful for integer division and modulus.
6671     *
6672     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6673     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6674     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6675     */
6676    /* binop/lit8 vAA, vBB, #+CC */
6677    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6678    mov     r9, rINST, lsr #8           @ r9<- AA
6679    and     r2, r3, #255                @ r2<- BB
6680    GET_VREG(r0, r2)                    @ r0<- vBB
6681    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6682    .if 1
6683    @cmp     r1, #0                      @ is second operand zero?
6684    beq     common_errDivideByZero
6685    .endif
6686    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6687
6688                               @ optional op; may set condition codes
6689    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6690    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6691    SET_VREG(r0, r9)               @ vAA<- r0
6692    GOTO_OPCODE(ip)                     @ jump to next instruction
6693    /* 10-12 instructions */
6694
6695
6696/* ------------------------------ */
6697    .balign 64
6698.L_OP_REM_INT_LIT8: /* 0xdc */
6699/* File: armv5te/OP_REM_INT_LIT8.S */
6700/* idivmod returns quotient in r0 and remainder in r1 */
6701/* File: armv5te/binopLit8.S */
6702    /*
6703     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6704     * that specifies an instruction that performs "result = r0 op r1".
6705     * This could be an ARM instruction or a function call.  (If the result
6706     * comes back in a register other than r0, you can override "result".)
6707     *
6708     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6709     * vCC (r1).  Useful for integer division and modulus.
6710     *
6711     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6712     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6713     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6714     */
6715    /* binop/lit8 vAA, vBB, #+CC */
6716    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6717    mov     r9, rINST, lsr #8           @ r9<- AA
6718    and     r2, r3, #255                @ r2<- BB
6719    GET_VREG(r0, r2)                    @ r0<- vBB
6720    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6721    .if 1
6722    @cmp     r1, #0                      @ is second operand zero?
6723    beq     common_errDivideByZero
6724    .endif
6725    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6726
6727                               @ optional op; may set condition codes
6728    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6729    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6730    SET_VREG(r1, r9)               @ vAA<- r1
6731    GOTO_OPCODE(ip)                     @ jump to next instruction
6732    /* 10-12 instructions */
6733
6734
6735/* ------------------------------ */
6736    .balign 64
6737.L_OP_AND_INT_LIT8: /* 0xdd */
6738/* File: armv5te/OP_AND_INT_LIT8.S */
6739/* File: armv5te/binopLit8.S */
6740    /*
6741     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6742     * that specifies an instruction that performs "result = r0 op r1".
6743     * This could be an ARM instruction or a function call.  (If the result
6744     * comes back in a register other than r0, you can override "result".)
6745     *
6746     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6747     * vCC (r1).  Useful for integer division and modulus.
6748     *
6749     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6750     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6751     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6752     */
6753    /* binop/lit8 vAA, vBB, #+CC */
6754    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6755    mov     r9, rINST, lsr #8           @ r9<- AA
6756    and     r2, r3, #255                @ r2<- BB
6757    GET_VREG(r0, r2)                    @ r0<- vBB
6758    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6759    .if 0
6760    @cmp     r1, #0                      @ is second operand zero?
6761    beq     common_errDivideByZero
6762    .endif
6763    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6764
6765                               @ optional op; may set condition codes
6766    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6767    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6768    SET_VREG(r0, r9)               @ vAA<- r0
6769    GOTO_OPCODE(ip)                     @ jump to next instruction
6770    /* 10-12 instructions */
6771
6772
6773/* ------------------------------ */
6774    .balign 64
6775.L_OP_OR_INT_LIT8: /* 0xde */
6776/* File: armv5te/OP_OR_INT_LIT8.S */
6777/* File: armv5te/binopLit8.S */
6778    /*
6779     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6780     * that specifies an instruction that performs "result = r0 op r1".
6781     * This could be an ARM instruction or a function call.  (If the result
6782     * comes back in a register other than r0, you can override "result".)
6783     *
6784     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6785     * vCC (r1).  Useful for integer division and modulus.
6786     *
6787     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6788     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6789     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6790     */
6791    /* binop/lit8 vAA, vBB, #+CC */
6792    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6793    mov     r9, rINST, lsr #8           @ r9<- AA
6794    and     r2, r3, #255                @ r2<- BB
6795    GET_VREG(r0, r2)                    @ r0<- vBB
6796    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6797    .if 0
6798    @cmp     r1, #0                      @ is second operand zero?
6799    beq     common_errDivideByZero
6800    .endif
6801    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6802
6803                               @ optional op; may set condition codes
6804    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6805    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6806    SET_VREG(r0, r9)               @ vAA<- r0
6807    GOTO_OPCODE(ip)                     @ jump to next instruction
6808    /* 10-12 instructions */
6809
6810
6811/* ------------------------------ */
6812    .balign 64
6813.L_OP_XOR_INT_LIT8: /* 0xdf */
6814/* File: armv5te/OP_XOR_INT_LIT8.S */
6815/* File: armv5te/binopLit8.S */
6816    /*
6817     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6818     * that specifies an instruction that performs "result = r0 op r1".
6819     * This could be an ARM instruction or a function call.  (If the result
6820     * comes back in a register other than r0, you can override "result".)
6821     *
6822     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6823     * vCC (r1).  Useful for integer division and modulus.
6824     *
6825     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6826     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6827     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6828     */
6829    /* binop/lit8 vAA, vBB, #+CC */
6830    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6831    mov     r9, rINST, lsr #8           @ r9<- AA
6832    and     r2, r3, #255                @ r2<- BB
6833    GET_VREG(r0, r2)                    @ r0<- vBB
6834    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6835    .if 0
6836    @cmp     r1, #0                      @ is second operand zero?
6837    beq     common_errDivideByZero
6838    .endif
6839    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6840
6841                               @ optional op; may set condition codes
6842    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6844    SET_VREG(r0, r9)               @ vAA<- r0
6845    GOTO_OPCODE(ip)                     @ jump to next instruction
6846    /* 10-12 instructions */
6847
6848
6849/* ------------------------------ */
6850    .balign 64
6851.L_OP_SHL_INT_LIT8: /* 0xe0 */
6852/* File: armv5te/OP_SHL_INT_LIT8.S */
6853/* File: armv5te/binopLit8.S */
6854    /*
6855     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6856     * that specifies an instruction that performs "result = r0 op r1".
6857     * This could be an ARM instruction or a function call.  (If the result
6858     * comes back in a register other than r0, you can override "result".)
6859     *
6860     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6861     * vCC (r1).  Useful for integer division and modulus.
6862     *
6863     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6864     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6865     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6866     */
6867    /* binop/lit8 vAA, vBB, #+CC */
6868    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6869    mov     r9, rINST, lsr #8           @ r9<- AA
6870    and     r2, r3, #255                @ r2<- BB
6871    GET_VREG(r0, r2)                    @ r0<- vBB
6872    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6873    .if 0
6874    @cmp     r1, #0                      @ is second operand zero?
6875    beq     common_errDivideByZero
6876    .endif
6877    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6878
6879    and     r1, r1, #31                           @ optional op; may set condition codes
6880    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
6881    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6882    SET_VREG(r0, r9)               @ vAA<- r0
6883    GOTO_OPCODE(ip)                     @ jump to next instruction
6884    /* 10-12 instructions */
6885
6886
6887/* ------------------------------ */
6888    .balign 64
6889.L_OP_SHR_INT_LIT8: /* 0xe1 */
6890/* File: armv5te/OP_SHR_INT_LIT8.S */
6891/* File: armv5te/binopLit8.S */
6892    /*
6893     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6894     * that specifies an instruction that performs "result = r0 op r1".
6895     * This could be an ARM instruction or a function call.  (If the result
6896     * comes back in a register other than r0, you can override "result".)
6897     *
6898     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6899     * vCC (r1).  Useful for integer division and modulus.
6900     *
6901     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6902     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6903     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6904     */
6905    /* binop/lit8 vAA, vBB, #+CC */
6906    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6907    mov     r9, rINST, lsr #8           @ r9<- AA
6908    and     r2, r3, #255                @ r2<- BB
6909    GET_VREG(r0, r2)                    @ r0<- vBB
6910    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6911    .if 0
6912    @cmp     r1, #0                      @ is second operand zero?
6913    beq     common_errDivideByZero
6914    .endif
6915    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6916
6917    and     r1, r1, #31                           @ optional op; may set condition codes
6918    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
6919    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6920    SET_VREG(r0, r9)               @ vAA<- r0
6921    GOTO_OPCODE(ip)                     @ jump to next instruction
6922    /* 10-12 instructions */
6923
6924
6925/* ------------------------------ */
6926    .balign 64
6927.L_OP_USHR_INT_LIT8: /* 0xe2 */
6928/* File: armv5te/OP_USHR_INT_LIT8.S */
6929/* File: armv5te/binopLit8.S */
6930    /*
6931     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6932     * that specifies an instruction that performs "result = r0 op r1".
6933     * This could be an ARM instruction or a function call.  (If the result
6934     * comes back in a register other than r0, you can override "result".)
6935     *
6936     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6937     * vCC (r1).  Useful for integer division and modulus.
6938     *
6939     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6940     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6941     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6942     */
6943    /* binop/lit8 vAA, vBB, #+CC */
6944    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6945    mov     r9, rINST, lsr #8           @ r9<- AA
6946    and     r2, r3, #255                @ r2<- BB
6947    GET_VREG(r0, r2)                    @ r0<- vBB
6948    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6949    .if 0
6950    @cmp     r1, #0                      @ is second operand zero?
6951    beq     common_errDivideByZero
6952    .endif
6953    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6954
6955    and     r1, r1, #31                           @ optional op; may set condition codes
6956    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
6957    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6958    SET_VREG(r0, r9)               @ vAA<- r0
6959    GOTO_OPCODE(ip)                     @ jump to next instruction
6960    /* 10-12 instructions */
6961
6962
6963/* ------------------------------ */
6964    .balign 64
6965.L_OP_IGET_VOLATILE: /* 0xe3 */
6966/* File: armv5te/OP_IGET_VOLATILE.S */
6967/* File: armv5te/OP_IGET.S */
6968    /*
6969     * General 32-bit instance field get.
6970     *
6971     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
6972     */
6973    /* op vA, vB, field@CCCC */
6974    mov     r0, rINST, lsr #12          @ r0<- B
6975    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
6976    FETCH(r1, 1)                        @ r1<- field ref CCCC
6977    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
6978    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
6979    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
6980    cmp     r0, #0                      @ is resolved entry null?
6981    bne     .LOP_IGET_VOLATILE_finish          @ no, already resolved
69828:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
6983    EXPORT_PC()                         @ resolve() could throw
6984    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
6985    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
6986    cmp     r0, #0
6987    bne     .LOP_IGET_VOLATILE_finish
6988    b       common_exceptionThrown
6989
6990
6991/* ------------------------------ */
6992    .balign 64
6993.L_OP_IPUT_VOLATILE: /* 0xe4 */
6994/* File: armv5te/OP_IPUT_VOLATILE.S */
6995/* File: armv5te/OP_IPUT.S */
6996    /*
6997     * General 32-bit instance field put.
6998     *
6999     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
7000     */
7001    /* op vA, vB, field@CCCC */
7002    mov     r0, rINST, lsr #12          @ r0<- B
7003    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7004    FETCH(r1, 1)                        @ r1<- field ref CCCC
7005    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7006    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7007    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7008    cmp     r0, #0                      @ is resolved entry null?
7009    bne     .LOP_IPUT_VOLATILE_finish          @ no, already resolved
70108:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7011    EXPORT_PC()                         @ resolve() could throw
7012    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7013    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7014    cmp     r0, #0                      @ success?
7015    bne     .LOP_IPUT_VOLATILE_finish          @ yes, finish up
7016    b       common_exceptionThrown
7017
7018
7019/* ------------------------------ */
7020    .balign 64
7021.L_OP_SGET_VOLATILE: /* 0xe5 */
7022/* File: armv5te/OP_SGET_VOLATILE.S */
7023/* File: armv5te/OP_SGET.S */
7024    /*
7025     * General 32-bit SGET handler.
7026     *
7027     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7028     */
7029    /* op vAA, field@BBBB */
7030    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7031    FETCH(r1, 1)                        @ r1<- field ref BBBB
7032    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7033    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7034    cmp     r0, #0                      @ is resolved entry null?
7035    beq     .LOP_SGET_VOLATILE_resolve         @ yes, do resolve
7036.LOP_SGET_VOLATILE_finish: @ field ptr in r0
7037    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7038    SMP_DMB                            @ acquiring load
7039    mov     r2, rINST, lsr #8           @ r2<- AA
7040    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7041    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7042    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7043    GOTO_OPCODE(ip)                     @ jump to next instruction
7044
7045
7046/* ------------------------------ */
7047    .balign 64
7048.L_OP_SPUT_VOLATILE: /* 0xe6 */
7049/* File: armv5te/OP_SPUT_VOLATILE.S */
7050/* File: armv5te/OP_SPUT.S */
7051    /*
7052     * General 32-bit SPUT handler.
7053     *
7054     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
7055     */
7056    /* op vAA, field@BBBB */
7057    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7058    FETCH(r1, 1)                        @ r1<- field ref BBBB
7059    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7060    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7061    cmp     r0, #0                      @ is resolved entry null?
7062    beq     .LOP_SPUT_VOLATILE_resolve         @ yes, do resolve
7063.LOP_SPUT_VOLATILE_finish:   @ field ptr in r0
7064    mov     r2, rINST, lsr #8           @ r2<- AA
7065    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7066    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7067    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7068    SMP_DMB_ST                        @ releasing store
7069    str     r1, [r0, #offStaticField_value] @ field<- vAA
7070    SMP_DMB
7071    GOTO_OPCODE(ip)                     @ jump to next instruction
7072
7073
7074/* ------------------------------ */
7075    .balign 64
7076.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
7077/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */
7078/* File: armv5te/OP_IGET.S */
7079    /*
7080     * General 32-bit instance field get.
7081     *
7082     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7083     */
7084    /* op vA, vB, field@CCCC */
7085    mov     r0, rINST, lsr #12          @ r0<- B
7086    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7087    FETCH(r1, 1)                        @ r1<- field ref CCCC
7088    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7089    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7090    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7091    cmp     r0, #0                      @ is resolved entry null?
7092    bne     .LOP_IGET_OBJECT_VOLATILE_finish          @ no, already resolved
70938:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7094    EXPORT_PC()                         @ resolve() could throw
7095    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7096    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7097    cmp     r0, #0
7098    bne     .LOP_IGET_OBJECT_VOLATILE_finish
7099    b       common_exceptionThrown
7100
7101
7102/* ------------------------------ */
7103    .balign 64
7104.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
7105/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */
7106/* File: armv5te/OP_IGET_WIDE.S */
7107    /*
7108     * Wide 32-bit instance field get.
7109     */
7110    /* iget-wide vA, vB, field@CCCC */
7111    mov     r0, rINST, lsr #12          @ r0<- B
7112    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7113    FETCH(r1, 1)                        @ r1<- field ref CCCC
7114    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7115    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7116    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7117    cmp     r0, #0                      @ is resolved entry null?
7118    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
71198:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7120    EXPORT_PC()                         @ resolve() could throw
7121    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7122    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7123    cmp     r0, #0
7124    bne     .LOP_IGET_WIDE_VOLATILE_finish
7125    b       common_exceptionThrown
7126
7127
7128/* ------------------------------ */
7129    .balign 64
7130.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
7131/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */
7132/* File: armv5te/OP_IPUT_WIDE.S */
7133    /* iput-wide vA, vB, field@CCCC */
7134    mov     r0, rINST, lsr #12          @ r0<- B
7135    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7136    FETCH(r1, 1)                        @ r1<- field ref CCCC
7137    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7138    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7139    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7140    cmp     r0, #0                      @ is resolved entry null?
7141    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
71428:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7143    EXPORT_PC()                         @ resolve() could throw
7144    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7145    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7146    cmp     r0, #0                      @ success?
7147    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
7148    b       common_exceptionThrown
7149
7150
7151/* ------------------------------ */
7152    .balign 64
7153.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
7154/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */
7155/* File: armv5te/OP_SGET_WIDE.S */
7156    /*
7157     * 64-bit SGET handler.
7158     */
7159    /* sget-wide vAA, field@BBBB */
7160    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7161    FETCH(r1, 1)                        @ r1<- field ref BBBB
7162    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7163    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7164    cmp     r0, #0                      @ is resolved entry null?
7165    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
7166.LOP_SGET_WIDE_VOLATILE_finish:
7167    mov     r9, rINST, lsr #8           @ r9<- AA
7168    .if 1
7169    add     r0, r0, #offStaticField_value @ r0<- pointer to data
7170    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
7171    .else
7172    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
7173    .endif
7174    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7175    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7176    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
7177    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7178    GOTO_OPCODE(ip)                     @ jump to next instruction
7179
7180
7181/* ------------------------------ */
7182    .balign 64
7183.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
7184/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */
7185/* File: armv5te/OP_SPUT_WIDE.S */
7186    /*
7187     * 64-bit SPUT handler.
7188     */
7189    /* sput-wide vAA, field@BBBB */
7190    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
7191    FETCH(r1, 1)                        @ r1<- field ref BBBB
7192    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7193    mov     r9, rINST, lsr #8           @ r9<- AA
7194    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
7195    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7196    cmp     r2, #0                      @ is resolved entry null?
7197    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7198.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
7199    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7200    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7201    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7202    .if 1
7203    add     r2, r2, #offStaticField_value @ r2<- pointer to data
7204    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
7205    .else
7206    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
7207    .endif
7208    GOTO_OPCODE(r10)                    @ jump to next instruction
7209
7210
7211/* ------------------------------ */
7212    .balign 64
7213.L_OP_BREAKPOINT: /* 0xec */
7214/* File: armv5te/OP_BREAKPOINT.S */
7215    /*
7216     * Breakpoint handler.
7217     *
7218     * Restart this instruction with the original opcode.  By
7219     * the time we get here, the breakpoint will have already been
7220     * handled.
7221     */
7222    mov     r0, rPC
7223    bl      dvmGetOriginalOpcode        @ (rPC)
7224    FETCH(rINST, 0)                     @ reload OP_BREAKPOINT + rest of inst
7225    ldr     r1, [rSELF, #offThread_mainHandlerTable]
7226    and     rINST, #0xff00
7227    orr     rINST, rINST, r0
7228    GOTO_OPCODE_BASE(r1, r0)
7229
7230/* ------------------------------ */
7231    .balign 64
7232.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
7233/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
7234    /*
7235     * Handle a throw-verification-error instruction.  This throws an
7236     * exception for an error discovered during verification.  The
7237     * exception is indicated by AA, with some detail provided by BBBB.
7238     */
7239    /* op AA, ref@BBBB */
7240    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
7241    FETCH(r2, 1)                        @ r2<- BBBB
7242    EXPORT_PC()                         @ export the PC
7243    mov     r1, rINST, lsr #8           @ r1<- AA
7244    bl      dvmThrowVerificationError   @ always throws
7245    b       common_exceptionThrown      @ handle exception
7246
7247/* ------------------------------ */
7248    .balign 64
7249.L_OP_EXECUTE_INLINE: /* 0xee */
7250/* File: armv5te/OP_EXECUTE_INLINE.S */
7251    /*
7252     * Execute a "native inline" instruction.
7253     *
7254     * We need to call an InlineOp4Func:
7255     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7256     *
7257     * The first four args are in r0-r3, pointer to return value storage
7258     * is on the stack.  The function's return value is a flag that tells
7259     * us if an exception was thrown.
7260     *
7261     * TUNING: could maintain two tables, pointer in Thread and
7262     * swap if profiler/debuggger active.
7263     */
7264    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7265    ldrh    r2, [rSELF, #offThread_subMode]
7266    FETCH(r10, 1)                       @ r10<- BBBB
7267    EXPORT_PC()                         @ can throw
7268    ands    r2, #kSubModeDebugProfile   @ Any going on?
7269    bne     .LOP_EXECUTE_INLINE_debugmode       @ yes - take slow path
7270.LOP_EXECUTE_INLINE_resume:
7271    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7272    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7273    mov     r0, rINST, lsr #12          @ r0<- B
7274    str     r1, [sp]                    @ push &self->retval
7275    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7276    add     sp, sp, #8                  @ pop stack
7277    cmp     r0, #0                      @ test boolean result of inline
7278    beq     common_exceptionThrown      @ returned false, handle exception
7279    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7280    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7281    GOTO_OPCODE(ip)                     @ jump to next instruction
7282
7283/* ------------------------------ */
7284    .balign 64
7285.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7286/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7287    /*
7288     * Execute a "native inline" instruction, using "/range" semantics.
7289     * Same idea as execute-inline, but we get the args differently.
7290     *
7291     * We need to call an InlineOp4Func:
7292     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7293     *
7294     * The first four args are in r0-r3, pointer to return value storage
7295     * is on the stack.  The function's return value is a flag that tells
7296     * us if an exception was thrown.
7297     */
7298    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7299    ldrh    r2, [rSELF, #offThread_subMode]
7300    FETCH(r10, 1)                       @ r10<- BBBB
7301    EXPORT_PC()                         @ can throw
7302    ands    r2, #kSubModeDebugProfile   @ Any going on?
7303    bne     .LOP_EXECUTE_INLINE_RANGE_debugmode       @ yes - take slow path
7304.LOP_EXECUTE_INLINE_RANGE_resume:
7305    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7306    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7307    mov     r0, rINST, lsr #8           @ r0<- AA
7308    str     r1, [sp]                    @ push &self->retval
7309    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7310    add     sp, sp, #8                  @ pop stack
7311    cmp     r0, #0                      @ test boolean result of inline
7312    beq     common_exceptionThrown      @ returned false, handle exception
7313    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7314    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7315    GOTO_OPCODE(ip)                     @ jump to next instruction
7316
7317/* ------------------------------ */
7318    .balign 64
7319.L_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
7320/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
7321    /*
7322     * Invoke Object.<init> on an object.  In practice we know that
7323     * Object's nullary constructor doesn't do anything, so we just
7324     * skip it unless a debugger is active.
7325     */
7326    FETCH(r1, 2)                  @ r1<- CCCC
7327    GET_VREG(r0, r1)                    @ r0<- "this" ptr
7328    cmp     r0, #0                      @ check for NULL
7329    beq     common_errNullObject        @ export PC and throw NPE
7330    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
7331    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
7332    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
7333    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_setFinal        @ yes, go
7334.LOP_INVOKE_OBJECT_INIT_RANGE_finish:
7335    ldrh    r1, [rSELF, #offThread_subMode]
7336    ands    r1, #kSubModeDebuggerActive @ debugger active?
7337    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_debugger        @ Yes - skip optimization
7338    FETCH_ADVANCE_INST(2+1)       @ advance to next instr, load rINST
7339    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7340    GOTO_OPCODE(ip)                     @ execute it
7341
7342/* ------------------------------ */
7343    .balign 64
7344.L_OP_RETURN_VOID_BARRIER: /* 0xf1 */
7345/* File: armv5te/OP_RETURN_VOID_BARRIER.S */
7346    SMP_DMB_ST
7347    b       common_returnFromMethod
7348
7349/* ------------------------------ */
7350    .balign 64
7351.L_OP_IGET_QUICK: /* 0xf2 */
7352/* File: armv6t2/OP_IGET_QUICK.S */
7353    /* For: iget-quick, iget-object-quick */
7354    /* op vA, vB, offset@CCCC */
7355    mov     r2, rINST, lsr #12          @ r2<- B
7356    FETCH(r1, 1)                        @ r1<- field byte offset
7357    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7358    ubfx    r2, rINST, #8, #4           @ r2<- A
7359    cmp     r3, #0                      @ check object for null
7360    beq     common_errNullObject        @ object was null
7361    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7362    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7363    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7364    SET_VREG(r0, r2)                    @ fp[A]<- r0
7365    GOTO_OPCODE(ip)                     @ jump to next instruction
7366
7367/* ------------------------------ */
7368    .balign 64
7369.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7370/* File: armv6t2/OP_IGET_WIDE_QUICK.S */
7371    /* iget-wide-quick vA, vB, offset@CCCC */
7372    mov     r2, rINST, lsr #12          @ r2<- B
7373    FETCH(ip, 1)                        @ ip<- field byte offset
7374    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7375    ubfx    r2, rINST, #8, #4           @ r2<- A
7376    cmp     r3, #0                      @ check object for null
7377    beq     common_errNullObject        @ object was null
7378    ldrd    r0, [r3, ip]                @ r0<- obj.field (64 bits, aligned)
7379    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7380    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7381    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7382    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7383    GOTO_OPCODE(ip)                     @ jump to next instruction
7384
7385/* ------------------------------ */
7386    .balign 64
7387.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7388/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7389/* File: armv5te/OP_IGET_QUICK.S */
7390    /* For: iget-quick, iget-object-quick */
7391    /* op vA, vB, offset@CCCC */
7392    mov     r2, rINST, lsr #12          @ r2<- B
7393    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7394    FETCH(r1, 1)                        @ r1<- field byte offset
7395    cmp     r3, #0                      @ check object for null
7396    mov     r2, rINST, lsr #8           @ r2<- A(+)
7397    beq     common_errNullObject        @ object was null
7398    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7399    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7400    and     r2, r2, #15
7401    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7402    SET_VREG(r0, r2)                    @ fp[A]<- r0
7403    GOTO_OPCODE(ip)                     @ jump to next instruction
7404
7405
7406/* ------------------------------ */
7407    .balign 64
7408.L_OP_IPUT_QUICK: /* 0xf5 */
7409/* File: armv6t2/OP_IPUT_QUICK.S */
7410    /* For: iput-quick, iput-object-quick */
7411    /* op vA, vB, offset@CCCC */
7412    mov     r2, rINST, lsr #12          @ r2<- B
7413    FETCH(r1, 1)                        @ r1<- field byte offset
7414    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7415    ubfx    r2, rINST, #8, #4           @ r2<- A
7416    cmp     r3, #0                      @ check object for null
7417    beq     common_errNullObject        @ object was null
7418    GET_VREG(r0, r2)                    @ r0<- fp[A]
7419    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7420    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7421    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7422    GOTO_OPCODE(ip)                     @ jump to next instruction
7423
7424/* ------------------------------ */
7425    .balign 64
7426.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7427/* File: armv6t2/OP_IPUT_WIDE_QUICK.S */
7428    /* iput-wide-quick vA, vB, offset@CCCC */
7429    mov     r1, rINST, lsr #12          @ r1<- B
7430    ubfx    r0, rINST, #8, #4           @ r0<- A
7431    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7432    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7433    cmp     r2, #0                      @ check object for null
7434    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7435    beq     common_errNullObject        @ object was null
7436    FETCH(r3, 1)                        @ r3<- field byte offset
7437    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7438    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7439    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7440    GOTO_OPCODE(ip)                     @ jump to next instruction
7441
7442/* ------------------------------ */
7443    .balign 64
7444.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7445/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7446    /* For: iput-object-quick */
7447    /* op vA, vB, offset@CCCC */
7448    mov     r2, rINST, lsr #12          @ r2<- B
7449    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7450    FETCH(r1, 1)                        @ r1<- field byte offset
7451    cmp     r3, #0                      @ check object for null
7452    mov     r2, rINST, lsr #8           @ r2<- A(+)
7453    beq     common_errNullObject        @ object was null
7454    and     r2, r2, #15
7455    GET_VREG(r0, r2)                    @ r0<- fp[A]
7456    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7457    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7458    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7459    cmp     r0, #0
7460    strneb  r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
7461    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7462    GOTO_OPCODE(ip)                     @ jump to next instruction
7463
7464/* ------------------------------ */
7465    .balign 64
7466.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7467/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7468    /*
7469     * Handle an optimized virtual method call.
7470     *
7471     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7472     */
7473    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7474    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7475    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7476    FETCH(r1, 1)                        @ r1<- BBBB
7477    .if     (!0)
7478    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7479    .endif
7480    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7481    cmp     r9, #0                      @ is "this" null?
7482    beq     common_errNullObject        @ null "this", throw exception
7483    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7484    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7485    EXPORT_PC()                         @ invoke must export
7486    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7487    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7488
7489/* ------------------------------ */
7490    .balign 64
7491.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7492/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7493/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7494    /*
7495     * Handle an optimized virtual method call.
7496     *
7497     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7498     */
7499    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7500    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7501    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7502    FETCH(r1, 1)                        @ r1<- BBBB
7503    .if     (!1)
7504    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7505    .endif
7506    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7507    cmp     r9, #0                      @ is "this" null?
7508    beq     common_errNullObject        @ null "this", throw exception
7509    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7510    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7511    EXPORT_PC()                         @ invoke must export
7512    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7513    bl      common_invokeMethodRange @ (r0=method, r9="this")
7514
7515
7516/* ------------------------------ */
7517    .balign 64
7518.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7519/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7520    /*
7521     * Handle an optimized "super" method call.
7522     *
7523     * for: [opt] invoke-super-quick, invoke-super-quick/range
7524     */
7525    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7526    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7527    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7528    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7529    .if     (!0)
7530    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7531    .endif
7532    FETCH(r1, 1)                        @ r1<- BBBB
7533    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7534    EXPORT_PC()                         @ must export for invoke
7535    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7536    GET_VREG(r9, r10)                   @ r9<- "this"
7537    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7538    cmp     r9, #0                      @ null "this" ref?
7539    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7540    beq     common_errNullObject        @ "this" is null, throw exception
7541    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7542
7543/* ------------------------------ */
7544    .balign 64
7545.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7546/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
7547/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7548    /*
7549     * Handle an optimized "super" method call.
7550     *
7551     * for: [opt] invoke-super-quick, invoke-super-quick/range
7552     */
7553    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7554    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7555    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7556    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7557    .if     (!1)
7558    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7559    .endif
7560    FETCH(r1, 1)                        @ r1<- BBBB
7561    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7562    EXPORT_PC()                         @ must export for invoke
7563    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7564    GET_VREG(r9, r10)                   @ r9<- "this"
7565    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7566    cmp     r9, #0                      @ null "this" ref?
7567    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7568    beq     common_errNullObject        @ "this" is null, throw exception
7569    bl      common_invokeMethodRange @ (r0=method, r9="this")
7570
7571
7572/* ------------------------------ */
7573    .balign 64
7574.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
7575/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */
7576/* File: armv5te/OP_IPUT_OBJECT.S */
7577    /*
7578     * 32-bit instance field put.
7579     *
7580     * for: iput-object, iput-object-volatile
7581     */
7582    /* op vA, vB, field@CCCC */
7583    mov     r0, rINST, lsr #12          @ r0<- B
7584    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7585    FETCH(r1, 1)                        @ r1<- field ref CCCC
7586    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7587    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7588    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7589    cmp     r0, #0                      @ is resolved entry null?
7590    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ no, already resolved
75918:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7592    EXPORT_PC()                         @ resolve() could throw
7593    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7594    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7595    cmp     r0, #0                      @ success?
7596    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ yes, finish up
7597    b       common_exceptionThrown
7598
7599
7600/* ------------------------------ */
7601    .balign 64
7602.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
7603/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */
7604/* File: armv5te/OP_SGET.S */
7605    /*
7606     * General 32-bit SGET handler.
7607     *
7608     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7609     */
7610    /* op vAA, field@BBBB */
7611    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7612    FETCH(r1, 1)                        @ r1<- field ref BBBB
7613    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7614    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7615    cmp     r0, #0                      @ is resolved entry null?
7616    beq     .LOP_SGET_OBJECT_VOLATILE_resolve         @ yes, do resolve
7617.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0
7618    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7619    SMP_DMB                            @ acquiring load
7620    mov     r2, rINST, lsr #8           @ r2<- AA
7621    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7622    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7623    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7624    GOTO_OPCODE(ip)                     @ jump to next instruction
7625
7626
7627/* ------------------------------ */
7628    .balign 64
7629.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
7630/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */
7631/* File: armv5te/OP_SPUT_OBJECT.S */
7632    /*
7633     * 32-bit SPUT handler for objects
7634     *
7635     * for: sput-object, sput-object-volatile
7636     */
7637    /* op vAA, field@BBBB */
7638    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7639    FETCH(r1, 1)                        @ r1<- field ref BBBB
7640    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7641    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7642    cmp     r0, #0                      @ is resolved entry null?
7643    beq     .LOP_SPUT_OBJECT_VOLATILE_resolve         @ yes, do resolve
7644.LOP_SPUT_OBJECT_VOLATILE_finish:   @ field ptr in r0
7645    mov     r2, rINST, lsr #8           @ r2<- AA
7646    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7647    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7648    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7649    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
7650    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7651    SMP_DMB_ST                        @ releasing store
7652    b       .LOP_SPUT_OBJECT_VOLATILE_end
7653
7654
7655/* ------------------------------ */
7656    .balign 64
7657.L_OP_DISPATCH_FF: /* 0xff */
7658/* File: armv5te/OP_DISPATCH_FF.S */
7659    mov     ip, rINST, lsr #8           @ ip<- extended opcode
7660    add     ip, ip, #256                @ add offset for extended opcodes
7661    GOTO_OPCODE(ip)                     @ go to proper extended handler
7662
7663
7664/* ------------------------------ */
7665    .balign 64
7666.L_OP_CONST_CLASS_JUMBO: /* 0x100 */
7667/* File: armv5te/OP_CONST_CLASS_JUMBO.S */
7668    /* const-class/jumbo vBBBB, Class@AAAAAAAA */
7669    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7670    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<-self>methodClassDex
7671    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7672    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
7673    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7674    FETCH(r9, 3)                        @ r9<- BBBB
7675    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[AAAAaaaa]
7676    cmp     r0, #0                      @ not yet resolved?
7677    beq     .LOP_CONST_CLASS_JUMBO_resolve
7678    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
7679    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7680    SET_VREG(r0, r9)                    @ vBBBB<- r0
7681    GOTO_OPCODE(ip)                     @ jump to next instruction
7682
7683/* ------------------------------ */
7684    .balign 64
7685.L_OP_CHECK_CAST_JUMBO: /* 0x101 */
7686/* File: armv5te/OP_CHECK_CAST_JUMBO.S */
7687    /*
7688     * Check to see if a cast from one class to another is allowed.
7689     */
7690    /* check-cast/jumbo vBBBB, class@AAAAAAAA */
7691    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7692    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7693    FETCH(r3, 3)                        @ r3<- BBBB
7694    orr     r2, r0, r2, lsl #16         @ r2<- AAAAaaaa
7695    GET_VREG(r9, r3)                    @ r9<- object
7696    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
7697    cmp     r9, #0                      @ is object null?
7698    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
7699    beq     .LOP_CHECK_CAST_JUMBO_okay            @ null obj, cast always succeeds
7700    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
7701    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
7702    cmp     r1, #0                      @ have we resolved this before?
7703    beq     .LOP_CHECK_CAST_JUMBO_resolve         @ not resolved, do it now
7704.LOP_CHECK_CAST_JUMBO_resolved:
7705    cmp     r0, r1                      @ same class (trivial success)?
7706    bne     .LOP_CHECK_CAST_JUMBO_fullcheck       @ no, do full check
7707    b       .LOP_CHECK_CAST_JUMBO_okay            @ yes, finish up
7708
7709/* ------------------------------ */
7710    .balign 64
7711.L_OP_INSTANCE_OF_JUMBO: /* 0x102 */
7712/* File: armv5te/OP_INSTANCE_OF_JUMBO.S */
7713    /*
7714     * Check to see if an object reference is an instance of a class.
7715     *
7716     * Most common situation is a non-null object, being compared against
7717     * an already-resolved class.
7718     *
7719     * TODO: convert most of this into a common subroutine, shared with
7720     *       OP_INSTANCE_OF.S.
7721     */
7722    /* instance-of/jumbo vBBBB, vCCCC, class@AAAAAAAA */
7723    FETCH(r3, 4)                        @ r3<- vCCCC
7724    FETCH(r9, 3)                        @ r9<- vBBBB
7725    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
7726    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
7727    cmp     r0, #0                      @ is object null?
7728    beq     .LOP_INSTANCE_OF_JUMBO_store           @ null obj, not an instance, store r0
7729    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7730    FETCH(r3, 2)                        @ r3<- AAAA (hi)
7731    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
7732    orr     r3, r1, r3, lsl #16         @ r3<- AAAAaaaa
7733    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
7734    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
7735    cmp     r1, #0                      @ have we resolved this before?
7736    beq     .LOP_INSTANCE_OF_JUMBO_resolve         @ not resolved, do it now
7737    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ resolved, continue
7738
7739/* ------------------------------ */
7740    .balign 64
7741.L_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
7742/* File: armv5te/OP_NEW_INSTANCE_JUMBO.S */
7743    /*
7744     * Create a new instance of a class.
7745     */
7746    /* new-instance/jumbo vBBBB, class@AAAAAAAA */
7747    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7748    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7749    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7750    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7751    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7752    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
7753#if defined(WITH_JIT)
7754    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
7755#endif
7756    EXPORT_PC()                         @ req'd for init, resolve, alloc
7757    cmp     r0, #0                      @ already resolved?
7758    beq     .LOP_NEW_INSTANCE_JUMBO_resolve         @ no, resolve it now
7759.LOP_NEW_INSTANCE_JUMBO_resolved:   @ r0=class
7760    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
7761    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
7762    bne     .LOP_NEW_INSTANCE_JUMBO_needinit        @ no, init class now
7763.LOP_NEW_INSTANCE_JUMBO_initialized: @ r0=class
7764    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
7765    bl      dvmAllocObject              @ r0<- new object
7766    b       .LOP_NEW_INSTANCE_JUMBO_finish          @ continue
7767
7768/* ------------------------------ */
7769    .balign 64
7770.L_OP_NEW_ARRAY_JUMBO: /* 0x104 */
7771/* File: armv5te/OP_NEW_ARRAY_JUMBO.S */
7772    /*
7773     * Allocate an array of objects, specified with the array class
7774     * and a count.
7775     *
7776     * The verifier guarantees that this is an array class, so we don't
7777     * check for it here.
7778     */
7779    /* new-array/jumbo vBBBB, vCCCC, class@AAAAAAAA */
7780    FETCH(r2, 1)                        @ r2<- aaaa (lo)
7781    FETCH(r3, 2)                        @ r3<- AAAA (hi)
7782    FETCH(r0, 4)                        @ r0<- vCCCC
7783    orr     r2, r2, r3, lsl #16         @ r2<- AAAAaaaa
7784    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7785    GET_VREG(r1, r0)                    @ r1<- vCCCC (array length)
7786    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7787    cmp     r1, #0                      @ check length
7788    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
7789    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
7790    cmp     r0, #0                      @ already resolved?
7791    EXPORT_PC()                         @ req'd for resolve, alloc
7792    bne     .LOP_NEW_ARRAY_JUMBO_finish          @ resolved, continue
7793    b       .LOP_NEW_ARRAY_JUMBO_resolve         @ do resolve now
7794
7795/* ------------------------------ */
7796    .balign 64
7797.L_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
7798/* File: armv5te/OP_FILLED_NEW_ARRAY_JUMBO.S */
7799    /*
7800     * Create a new array with elements filled from registers.
7801     *
7802     * TODO: convert most of this into a common subroutine, shared with
7803     *       OP_FILLED_NEW_ARRAY.S.
7804     */
7805    /* filled-new-array/jumbo {vCCCC..v(CCCC+BBBB-1)}, type@AAAAAAAA */
7806    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7807    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7808    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7809    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7810    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7811    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
7812    EXPORT_PC()                         @ need for resolve and alloc
7813    cmp     r0, #0                      @ already resolved?
7814    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_continue        @ yes, continue on
78158:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
7816    mov     r2, #0                      @ r2<- false
7817    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
7818    bl      dvmResolveClass             @ r0<- call(clazz, ref)
7819    cmp     r0, #0                      @ got null?
7820    beq     common_exceptionThrown      @ yes, handle exception
7821    b       .LOP_FILLED_NEW_ARRAY_JUMBO_continue
7822
7823/* ------------------------------ */
7824    .balign 64
7825.L_OP_IGET_JUMBO: /* 0x106 */
7826/* File: armv5te/OP_IGET_JUMBO.S */
7827    /*
7828     * Jumbo 32-bit instance field get.
7829     *
7830     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7831     *      iget-char/jumbo, iget-short/jumbo
7832     */
7833    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7834    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7835    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7836    FETCH(r0, 4)                        @ r0<- CCCC
7837    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7838    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7839    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7840    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7841    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7842    cmp     r0, #0                      @ is resolved entry null?
7843    bne     .LOP_IGET_JUMBO_finish          @ no, already resolved
78448:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7845    EXPORT_PC()                         @ resolve() could throw
7846    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7847    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7848    b       .LOP_IGET_JUMBO_resolved        @ resolved, continue
7849
7850/* ------------------------------ */
7851    .balign 64
7852.L_OP_IGET_WIDE_JUMBO: /* 0x107 */
7853/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
7854    /*
7855     * Jumbo 64-bit instance field get.
7856     */
7857    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
7858    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7859    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7860    FETCH(r0, 4)                        @ r0<- CCCC
7861    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7862    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7863    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7864    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7865    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7866    cmp     r0, #0                      @ is resolved entry null?
7867    bne     .LOP_IGET_WIDE_JUMBO_finish          @ no, already resolved
7868    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7869    EXPORT_PC()                         @ resolve() could throw
7870    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7871    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7872    b       .LOP_IGET_WIDE_JUMBO_resolved        @ resolved, continue
7873
7874/* ------------------------------ */
7875    .balign 64
7876.L_OP_IGET_OBJECT_JUMBO: /* 0x108 */
7877/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
7878/* File: armv5te/OP_IGET_JUMBO.S */
7879    /*
7880     * Jumbo 32-bit instance field get.
7881     *
7882     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7883     *      iget-char/jumbo, iget-short/jumbo
7884     */
7885    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7886    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7887    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7888    FETCH(r0, 4)                        @ r0<- CCCC
7889    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7890    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7891    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7892    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7893    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7894    cmp     r0, #0                      @ is resolved entry null?
7895    bne     .LOP_IGET_OBJECT_JUMBO_finish          @ no, already resolved
78968:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7897    EXPORT_PC()                         @ resolve() could throw
7898    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7899    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7900    b       .LOP_IGET_OBJECT_JUMBO_resolved        @ resolved, continue
7901
7902
7903/* ------------------------------ */
7904    .balign 64
7905.L_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
7906/* File: armv5te/OP_IGET_BOOLEAN_JUMBO.S */
7907@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrb", "sqnum":"1" }
7908/* File: armv5te/OP_IGET_JUMBO.S */
7909    /*
7910     * Jumbo 32-bit instance field get.
7911     *
7912     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7913     *      iget-char/jumbo, iget-short/jumbo
7914     */
7915    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7916    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7917    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7918    FETCH(r0, 4)                        @ r0<- CCCC
7919    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7920    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7921    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7922    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7923    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7924    cmp     r0, #0                      @ is resolved entry null?
7925    bne     .LOP_IGET_BOOLEAN_JUMBO_finish          @ no, already resolved
79268:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7927    EXPORT_PC()                         @ resolve() could throw
7928    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7929    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7930    b       .LOP_IGET_BOOLEAN_JUMBO_resolved        @ resolved, continue
7931
7932
7933/* ------------------------------ */
7934    .balign 64
7935.L_OP_IGET_BYTE_JUMBO: /* 0x10a */
7936/* File: armv5te/OP_IGET_BYTE_JUMBO.S */
7937@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsb", "sqnum":"2" }
7938/* File: armv5te/OP_IGET_JUMBO.S */
7939    /*
7940     * Jumbo 32-bit instance field get.
7941     *
7942     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7943     *      iget-char/jumbo, iget-short/jumbo
7944     */
7945    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7946    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7947    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7948    FETCH(r0, 4)                        @ r0<- CCCC
7949    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7950    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7951    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7952    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7953    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7954    cmp     r0, #0                      @ is resolved entry null?
7955    bne     .LOP_IGET_BYTE_JUMBO_finish          @ no, already resolved
79568:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7957    EXPORT_PC()                         @ resolve() could throw
7958    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7959    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7960    b       .LOP_IGET_BYTE_JUMBO_resolved        @ resolved, continue
7961
7962
7963/* ------------------------------ */
7964    .balign 64
7965.L_OP_IGET_CHAR_JUMBO: /* 0x10b */
7966/* File: armv5te/OP_IGET_CHAR_JUMBO.S */
7967@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrh", "sqnum":"3" }
7968/* File: armv5te/OP_IGET_JUMBO.S */
7969    /*
7970     * Jumbo 32-bit instance field get.
7971     *
7972     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7973     *      iget-char/jumbo, iget-short/jumbo
7974     */
7975    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7976    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7977    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7978    FETCH(r0, 4)                        @ r0<- CCCC
7979    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7980    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7981    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7982    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7983    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7984    cmp     r0, #0                      @ is resolved entry null?
7985    bne     .LOP_IGET_CHAR_JUMBO_finish          @ no, already resolved
79868:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7987    EXPORT_PC()                         @ resolve() could throw
7988    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7989    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7990    b       .LOP_IGET_CHAR_JUMBO_resolved        @ resolved, continue
7991
7992
7993/* ------------------------------ */
7994    .balign 64
7995.L_OP_IGET_SHORT_JUMBO: /* 0x10c */
7996/* File: armv5te/OP_IGET_SHORT_JUMBO.S */
7997@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsh", "sqnum":"4" }
7998/* File: armv5te/OP_IGET_JUMBO.S */
7999    /*
8000     * Jumbo 32-bit instance field get.
8001     *
8002     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8003     *      iget-char/jumbo, iget-short/jumbo
8004     */
8005    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8006    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8007    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8008    FETCH(r0, 4)                        @ r0<- CCCC
8009    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8010    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8011    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8012    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8013    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8014    cmp     r0, #0                      @ is resolved entry null?
8015    bne     .LOP_IGET_SHORT_JUMBO_finish          @ no, already resolved
80168:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8017    EXPORT_PC()                         @ resolve() could throw
8018    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8019    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8020    b       .LOP_IGET_SHORT_JUMBO_resolved        @ resolved, continue
8021
8022
8023/* ------------------------------ */
8024    .balign 64
8025.L_OP_IPUT_JUMBO: /* 0x10d */
8026/* File: armv5te/OP_IPUT_JUMBO.S */
8027    /*
8028     * Jumbo 32-bit instance field put.
8029     *
8030     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8031     *      iput-short/jumbo
8032     */
8033    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8034    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8035    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8036    FETCH(r0, 4)                        @ r0<- CCCC
8037    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8038    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8039    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8040    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8041    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8042    cmp     r0, #0                      @ is resolved entry null?
8043    bne     .LOP_IPUT_JUMBO_finish          @ no, already resolved
80448:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8045    EXPORT_PC()                         @ resolve() could throw
8046    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8047    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8048    b       .LOP_IPUT_JUMBO_resolved        @ resolved, continue
8049
8050/* ------------------------------ */
8051    .balign 64
8052.L_OP_IPUT_WIDE_JUMBO: /* 0x10e */
8053/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
8054    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8055    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8056    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8057    FETCH(r0, 4)                        @ r0<- CCCC
8058    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8059    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8060    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
8061    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
8062    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8063    cmp     r0, #0                      @ is resolved entry null?
8064    bne     .LOP_IPUT_WIDE_JUMBO_finish          @ no, already resolved
80658:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
8066    EXPORT_PC()                         @ resolve() could throw
8067    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8068    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8069    b       .LOP_IPUT_WIDE_JUMBO_resolved        @ resolved, continue
8070
8071/* ------------------------------ */
8072    .balign 64
8073.L_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
8074/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
8075    /*
8076     * Jumbo 32-bit instance field put.
8077     */
8078    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8079    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8080    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8081    FETCH(r0, 4)                        @ r0<- CCCC
8082    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8083    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8084    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8085    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8086    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8087    cmp     r0, #0                      @ is resolved entry null?
8088    bne     .LOP_IPUT_OBJECT_JUMBO_finish          @ no, already resolved
80898:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8090    EXPORT_PC()                         @ resolve() could throw
8091    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8092    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8093    b       .LOP_IPUT_OBJECT_JUMBO_resolved        @ resolved, continue
8094
8095/* ------------------------------ */
8096    .balign 64
8097.L_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
8098/* File: armv5te/OP_IPUT_BOOLEAN_JUMBO.S */
8099@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"1" }
8100/* File: armv5te/OP_IPUT_JUMBO.S */
8101    /*
8102     * Jumbo 32-bit instance field put.
8103     *
8104     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8105     *      iput-short/jumbo
8106     */
8107    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8108    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8109    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8110    FETCH(r0, 4)                        @ r0<- CCCC
8111    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8112    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8113    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8114    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8115    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8116    cmp     r0, #0                      @ is resolved entry null?
8117    bne     .LOP_IPUT_BOOLEAN_JUMBO_finish          @ no, already resolved
81188:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8119    EXPORT_PC()                         @ resolve() could throw
8120    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8121    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8122    b       .LOP_IPUT_BOOLEAN_JUMBO_resolved        @ resolved, continue
8123
8124
8125/* ------------------------------ */
8126    .balign 64
8127.L_OP_IPUT_BYTE_JUMBO: /* 0x111 */
8128/* File: armv5te/OP_IPUT_BYTE_JUMBO.S */
8129@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"2" }
8130/* File: armv5te/OP_IPUT_JUMBO.S */
8131    /*
8132     * Jumbo 32-bit instance field put.
8133     *
8134     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8135     *      iput-short/jumbo
8136     */
8137    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8138    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8139    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8140    FETCH(r0, 4)                        @ r0<- CCCC
8141    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8142    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8143    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8144    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8145    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8146    cmp     r0, #0                      @ is resolved entry null?
8147    bne     .LOP_IPUT_BYTE_JUMBO_finish          @ no, already resolved
81488:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8149    EXPORT_PC()                         @ resolve() could throw
8150    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8151    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8152    b       .LOP_IPUT_BYTE_JUMBO_resolved        @ resolved, continue
8153
8154
8155/* ------------------------------ */
8156    .balign 64
8157.L_OP_IPUT_CHAR_JUMBO: /* 0x112 */
8158/* File: armv5te/OP_IPUT_CHAR_JUMBO.S */
8159@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"3" }
8160/* File: armv5te/OP_IPUT_JUMBO.S */
8161    /*
8162     * Jumbo 32-bit instance field put.
8163     *
8164     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8165     *      iput-short/jumbo
8166     */
8167    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8168    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8169    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8170    FETCH(r0, 4)                        @ r0<- CCCC
8171    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8172    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8173    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8174    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8175    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8176    cmp     r0, #0                      @ is resolved entry null?
8177    bne     .LOP_IPUT_CHAR_JUMBO_finish          @ no, already resolved
81788:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8179    EXPORT_PC()                         @ resolve() could throw
8180    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8181    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8182    b       .LOP_IPUT_CHAR_JUMBO_resolved        @ resolved, continue
8183
8184
8185/* ------------------------------ */
8186    .balign 64
8187.L_OP_IPUT_SHORT_JUMBO: /* 0x113 */
8188/* File: armv5te/OP_IPUT_SHORT_JUMBO.S */
8189@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"4" }
8190/* File: armv5te/OP_IPUT_JUMBO.S */
8191    /*
8192     * Jumbo 32-bit instance field put.
8193     *
8194     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8195     *      iput-short/jumbo
8196     */
8197    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8198    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8199    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8200    FETCH(r0, 4)                        @ r0<- CCCC
8201    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8202    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8203    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8204    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8205    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8206    cmp     r0, #0                      @ is resolved entry null?
8207    bne     .LOP_IPUT_SHORT_JUMBO_finish          @ no, already resolved
82088:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8209    EXPORT_PC()                         @ resolve() could throw
8210    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8211    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8212    b       .LOP_IPUT_SHORT_JUMBO_resolved        @ resolved, continue
8213
8214
8215/* ------------------------------ */
8216    .balign 64
8217.L_OP_SGET_JUMBO: /* 0x114 */
8218/* File: armv5te/OP_SGET_JUMBO.S */
8219    /*
8220     * Jumbo 32-bit SGET handler.
8221     *
8222     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8223     *      sget-char/jumbo, sget-short/jumbo
8224     */
8225    /* exop vBBBB, field@AAAAAAAA */
8226    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8227    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8228    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8229    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8230    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8231    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8232    cmp     r0, #0                      @ is resolved entry null?
8233    beq     .LOP_SGET_JUMBO_resolve         @ yes, do resolve
8234.LOP_SGET_JUMBO_finish: @ field ptr in r0
8235    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8236    @ no-op                             @ acquiring load
8237    FETCH(r2, 3)                        @ r2<- BBBB
8238    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8239    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8240    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8241    GOTO_OPCODE(ip)                     @ jump to next instruction
8242
8243/* ------------------------------ */
8244    .balign 64
8245.L_OP_SGET_WIDE_JUMBO: /* 0x115 */
8246/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
8247    /*
8248     * Jumbo 64-bit SGET handler.
8249     */
8250    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
8251    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8252    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8253    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8254    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
8255    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8256    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
8257    cmp     r0, #0                      @ is resolved entry null?
8258    beq     .LOP_SGET_WIDE_JUMBO_resolve         @ yes, do resolve
8259.LOP_SGET_WIDE_JUMBO_finish:
8260    FETCH(r9, 3)                        @ r9<- BBBB
8261    .if 0
8262    add     r0, r0, #offStaticField_value @ r0<- pointer to data
8263    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
8264    .else
8265    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
8266    .endif
8267    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8268    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8269    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
8270    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8271    GOTO_OPCODE(ip)                     @ jump to next instruction
8272
8273/* ------------------------------ */
8274    .balign 64
8275.L_OP_SGET_OBJECT_JUMBO: /* 0x116 */
8276/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
8277/* File: armv5te/OP_SGET_JUMBO.S */
8278    /*
8279     * Jumbo 32-bit SGET handler.
8280     *
8281     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8282     *      sget-char/jumbo, sget-short/jumbo
8283     */
8284    /* exop vBBBB, field@AAAAAAAA */
8285    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8286    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8287    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8288    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8289    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8290    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8291    cmp     r0, #0                      @ is resolved entry null?
8292    beq     .LOP_SGET_OBJECT_JUMBO_resolve         @ yes, do resolve
8293.LOP_SGET_OBJECT_JUMBO_finish: @ field ptr in r0
8294    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8295    @ no-op                             @ acquiring load
8296    FETCH(r2, 3)                        @ r2<- BBBB
8297    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8298    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8299    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8300    GOTO_OPCODE(ip)                     @ jump to next instruction
8301
8302
8303/* ------------------------------ */
8304    .balign 64
8305.L_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
8306/* File: armv5te/OP_SGET_BOOLEAN_JUMBO.S */
8307/* File: armv5te/OP_SGET_JUMBO.S */
8308    /*
8309     * Jumbo 32-bit SGET handler.
8310     *
8311     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8312     *      sget-char/jumbo, sget-short/jumbo
8313     */
8314    /* exop vBBBB, field@AAAAAAAA */
8315    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8316    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8317    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8318    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8319    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8320    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8321    cmp     r0, #0                      @ is resolved entry null?
8322    beq     .LOP_SGET_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8323.LOP_SGET_BOOLEAN_JUMBO_finish: @ field ptr in r0
8324    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8325    @ no-op                             @ acquiring load
8326    FETCH(r2, 3)                        @ r2<- BBBB
8327    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8328    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8329    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8330    GOTO_OPCODE(ip)                     @ jump to next instruction
8331
8332
8333/* ------------------------------ */
8334    .balign 64
8335.L_OP_SGET_BYTE_JUMBO: /* 0x118 */
8336/* File: armv5te/OP_SGET_BYTE_JUMBO.S */
8337/* File: armv5te/OP_SGET_JUMBO.S */
8338    /*
8339     * Jumbo 32-bit SGET handler.
8340     *
8341     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8342     *      sget-char/jumbo, sget-short/jumbo
8343     */
8344    /* exop vBBBB, field@AAAAAAAA */
8345    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8346    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8347    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8348    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8349    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8350    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8351    cmp     r0, #0                      @ is resolved entry null?
8352    beq     .LOP_SGET_BYTE_JUMBO_resolve         @ yes, do resolve
8353.LOP_SGET_BYTE_JUMBO_finish: @ field ptr in r0
8354    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8355    @ no-op                             @ acquiring load
8356    FETCH(r2, 3)                        @ r2<- BBBB
8357    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8358    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8359    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8360    GOTO_OPCODE(ip)                     @ jump to next instruction
8361
8362
8363/* ------------------------------ */
8364    .balign 64
8365.L_OP_SGET_CHAR_JUMBO: /* 0x119 */
8366/* File: armv5te/OP_SGET_CHAR_JUMBO.S */
8367/* File: armv5te/OP_SGET_JUMBO.S */
8368    /*
8369     * Jumbo 32-bit SGET handler.
8370     *
8371     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8372     *      sget-char/jumbo, sget-short/jumbo
8373     */
8374    /* exop vBBBB, field@AAAAAAAA */
8375    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8376    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8377    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8378    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8379    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8380    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8381    cmp     r0, #0                      @ is resolved entry null?
8382    beq     .LOP_SGET_CHAR_JUMBO_resolve         @ yes, do resolve
8383.LOP_SGET_CHAR_JUMBO_finish: @ field ptr in r0
8384    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8385    @ no-op                             @ acquiring load
8386    FETCH(r2, 3)                        @ r2<- BBBB
8387    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8388    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8389    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8390    GOTO_OPCODE(ip)                     @ jump to next instruction
8391
8392
8393/* ------------------------------ */
8394    .balign 64
8395.L_OP_SGET_SHORT_JUMBO: /* 0x11a */
8396/* File: armv5te/OP_SGET_SHORT_JUMBO.S */
8397/* File: armv5te/OP_SGET_JUMBO.S */
8398    /*
8399     * Jumbo 32-bit SGET handler.
8400     *
8401     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8402     *      sget-char/jumbo, sget-short/jumbo
8403     */
8404    /* exop vBBBB, field@AAAAAAAA */
8405    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8406    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8407    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8408    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8409    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8410    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8411    cmp     r0, #0                      @ is resolved entry null?
8412    beq     .LOP_SGET_SHORT_JUMBO_resolve         @ yes, do resolve
8413.LOP_SGET_SHORT_JUMBO_finish: @ field ptr in r0
8414    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8415    @ no-op                             @ acquiring load
8416    FETCH(r2, 3)                        @ r2<- BBBB
8417    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8418    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8419    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8420    GOTO_OPCODE(ip)                     @ jump to next instruction
8421
8422
8423/* ------------------------------ */
8424    .balign 64
8425.L_OP_SPUT_JUMBO: /* 0x11b */
8426/* File: armv5te/OP_SPUT_JUMBO.S */
8427    /*
8428     * Jumbo 32-bit SPUT handler.
8429     *
8430     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8431     *      sput-short/jumbo
8432     */
8433    /* exop vBBBB, field@AAAAAAAA */
8434    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8435    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8436    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8437    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8438    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8439    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8440    cmp     r0, #0                      @ is resolved entry null?
8441    beq     .LOP_SPUT_JUMBO_resolve         @ yes, do resolve
8442.LOP_SPUT_JUMBO_finish:   @ field ptr in r0
8443    FETCH(r2, 3)                        @ r2<- BBBB
8444    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8445    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8446    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8447    @ no-op                        @ releasing store
8448    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8449    @ no-op
8450    GOTO_OPCODE(ip)                     @ jump to next instruction
8451
8452/* ------------------------------ */
8453    .balign 64
8454.L_OP_SPUT_WIDE_JUMBO: /* 0x11c */
8455/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
8456    /*
8457     * Jumbo 64-bit SPUT handler.
8458     */
8459    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
8460    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
8461    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8462    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8463    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8464    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8465    FETCH(r9, 3)                        @ r9<- BBBB
8466    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
8467    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8468    cmp     r2, #0                      @ is resolved entry null?
8469    beq     .LOP_SPUT_WIDE_JUMBO_resolve         @ yes, do resolve
8470.LOP_SPUT_WIDE_JUMBO_finish: @ field ptr in r2, BBBB in r9
8471    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8472    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
8473    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8474    .if 0
8475    add     r2, r2, #offStaticField_value @ r2<- pointer to data
8476    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
8477    .else
8478    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
8479    .endif
8480    GOTO_OPCODE(r10)                    @ jump to next instruction
8481
8482/* ------------------------------ */
8483    .balign 64
8484.L_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
8485/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
8486    /*
8487     * Jumbo 32-bit SPUT handler for objects
8488     */
8489    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
8490    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8491    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8492    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8493    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8494    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8495    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8496    cmp     r0, #0                      @ is resolved entry null?
8497    beq     .LOP_SPUT_OBJECT_JUMBO_resolve         @ yes, do resolve
8498.LOP_SPUT_OBJECT_JUMBO_finish:   @ field ptr in r0
8499    FETCH(r2, 3)                        @ r2<- BBBB
8500    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8501    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8502    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8503    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
8504    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8505    @ no-op                         @ releasing store
8506    b       .LOP_SPUT_OBJECT_JUMBO_end
8507
8508/* ------------------------------ */
8509    .balign 64
8510.L_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
8511/* File: armv5te/OP_SPUT_BOOLEAN_JUMBO.S */
8512/* File: armv5te/OP_SPUT_JUMBO.S */
8513    /*
8514     * Jumbo 32-bit SPUT handler.
8515     *
8516     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8517     *      sput-short/jumbo
8518     */
8519    /* exop vBBBB, field@AAAAAAAA */
8520    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8521    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8522    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8523    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8524    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8525    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8526    cmp     r0, #0                      @ is resolved entry null?
8527    beq     .LOP_SPUT_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8528.LOP_SPUT_BOOLEAN_JUMBO_finish:   @ field ptr in r0
8529    FETCH(r2, 3)                        @ r2<- BBBB
8530    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8531    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8532    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8533    @ no-op                        @ releasing store
8534    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8535    @ no-op
8536    GOTO_OPCODE(ip)                     @ jump to next instruction
8537
8538
8539/* ------------------------------ */
8540    .balign 64
8541.L_OP_SPUT_BYTE_JUMBO: /* 0x11f */
8542/* File: armv5te/OP_SPUT_BYTE_JUMBO.S */
8543/* File: armv5te/OP_SPUT_JUMBO.S */
8544    /*
8545     * Jumbo 32-bit SPUT handler.
8546     *
8547     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8548     *      sput-short/jumbo
8549     */
8550    /* exop vBBBB, field@AAAAAAAA */
8551    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8552    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8553    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8554    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8555    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8556    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8557    cmp     r0, #0                      @ is resolved entry null?
8558    beq     .LOP_SPUT_BYTE_JUMBO_resolve         @ yes, do resolve
8559.LOP_SPUT_BYTE_JUMBO_finish:   @ field ptr in r0
8560    FETCH(r2, 3)                        @ r2<- BBBB
8561    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8562    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8563    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8564    @ no-op                        @ releasing store
8565    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8566    @ no-op
8567    GOTO_OPCODE(ip)                     @ jump to next instruction
8568
8569
8570/* ------------------------------ */
8571    .balign 64
8572.L_OP_SPUT_CHAR_JUMBO: /* 0x120 */
8573/* File: armv5te/OP_SPUT_CHAR_JUMBO.S */
8574/* File: armv5te/OP_SPUT_JUMBO.S */
8575    /*
8576     * Jumbo 32-bit SPUT handler.
8577     *
8578     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8579     *      sput-short/jumbo
8580     */
8581    /* exop vBBBB, field@AAAAAAAA */
8582    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8583    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8584    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8585    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8586    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8587    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8588    cmp     r0, #0                      @ is resolved entry null?
8589    beq     .LOP_SPUT_CHAR_JUMBO_resolve         @ yes, do resolve
8590.LOP_SPUT_CHAR_JUMBO_finish:   @ field ptr in r0
8591    FETCH(r2, 3)                        @ r2<- BBBB
8592    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8593    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8594    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8595    @ no-op                        @ releasing store
8596    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8597    @ no-op
8598    GOTO_OPCODE(ip)                     @ jump to next instruction
8599
8600
8601/* ------------------------------ */
8602    .balign 64
8603.L_OP_SPUT_SHORT_JUMBO: /* 0x121 */
8604/* File: armv5te/OP_SPUT_SHORT_JUMBO.S */
8605/* File: armv5te/OP_SPUT_JUMBO.S */
8606    /*
8607     * Jumbo 32-bit SPUT handler.
8608     *
8609     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8610     *      sput-short/jumbo
8611     */
8612    /* exop vBBBB, field@AAAAAAAA */
8613    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8614    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8615    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8616    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8617    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8618    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8619    cmp     r0, #0                      @ is resolved entry null?
8620    beq     .LOP_SPUT_SHORT_JUMBO_resolve         @ yes, do resolve
8621.LOP_SPUT_SHORT_JUMBO_finish:   @ field ptr in r0
8622    FETCH(r2, 3)                        @ r2<- BBBB
8623    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8624    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8625    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8626    @ no-op                        @ releasing store
8627    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8628    @ no-op
8629    GOTO_OPCODE(ip)                     @ jump to next instruction
8630
8631
8632/* ------------------------------ */
8633    .balign 64
8634.L_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
8635/* File: armv5te/OP_INVOKE_VIRTUAL_JUMBO.S */
8636    /*
8637     * Handle a virtual method call.
8638     */
8639    /* invoke-virtual/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8640    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8641    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8642    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8643    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8644    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8645    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
8646    cmp     r0, #0                      @ already resolved?
8647    EXPORT_PC()                         @ must export for invoke
8648    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ yes, continue on
8649    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
8650    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8651    mov     r2, #METHOD_VIRTUAL         @ resolver method type
8652    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
8653    cmp     r0, #0                      @ got null?
8654    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ no, continue
8655    b       common_exceptionThrown      @ yes, handle exception
8656
8657/* ------------------------------ */
8658    .balign 64
8659.L_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
8660/* File: armv5te/OP_INVOKE_SUPER_JUMBO.S */
8661    /*
8662     * Handle a "super" method call.
8663     */
8664    /* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8665    FETCH(r10, 4)                       @ r10<- CCCC
8666    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8667    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8668    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8669    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8670    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8671    GET_VREG(r9, r10)                   @ r9<- "this" ptr
8672    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
8673    cmp     r9, #0                      @ null "this"?
8674    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
8675    beq     common_errNullObject        @ null "this", throw exception
8676    cmp     r0, #0                      @ already resolved?
8677    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
8678    EXPORT_PC()                         @ must export for invoke
8679    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ resolved, continue on
8680    b       .LOP_INVOKE_SUPER_JUMBO_resolve         @ do resolve now
8681
8682/* ------------------------------ */
8683    .balign 64
8684.L_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
8685/* File: armv5te/OP_INVOKE_DIRECT_JUMBO.S */
8686    /*
8687     * Handle a direct method call.
8688     *
8689     * (We could defer the "is 'this' pointer null" test to the common
8690     * method invocation code, and use a flag to indicate that static
8691     * calls don't count.  If we do this as part of copying the arguments
8692     * out we could avoiding loading the first arg twice.)
8693     *
8694     */
8695    /* invoke-direct/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8696    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8697    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8698    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8699    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8700    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8701    FETCH(r10, 4)                       @ r10<- CCCC
8702    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
8703    cmp     r0, #0                      @ already resolved?
8704    EXPORT_PC()                         @ must export for invoke
8705    GET_VREG(r9, r10)                   @ r9<- "this" ptr
8706    beq     .LOP_INVOKE_DIRECT_JUMBO_resolve         @ not resolved, do it now
8707.LOP_INVOKE_DIRECT_JUMBO_finish:
8708    cmp     r9, #0                      @ null "this" ref?
8709    bne     common_invokeMethodJumbo    @ (r0=method, r9="this")
8710    b       common_errNullObject        @ yes, throw exception
8711
8712/* ------------------------------ */
8713    .balign 64
8714.L_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
8715/* File: armv5te/OP_INVOKE_STATIC_JUMBO.S */
8716    /*
8717     * Handle a static method call.
8718     */
8719    /* invoke-static/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8720    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8721    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8722    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8723    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8724    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8725    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
8726#if defined(WITH_JIT)
8727    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
8728#endif
8729    cmp     r0, #0                      @ already resolved?
8730    EXPORT_PC()                         @ must export for invoke
8731    bne     common_invokeMethodJumboNoThis   @ (r0=method)
8732    b       .LOP_INVOKE_STATIC_JUMBO_resolve
8733
8734/* ------------------------------ */
8735    .balign 64
8736.L_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
8737/* File: armv5te/OP_INVOKE_INTERFACE_JUMBO.S */
8738    /*
8739     * Handle an interface method call.
8740     */
8741    /* invoke-interface/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8742    FETCH(r2, 4)                        @ r2<- CCCC
8743    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8744    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8745    EXPORT_PC()                         @ must export for invoke
8746    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8747    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
8748    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
8749    cmp     r9, #0                      @ null obj?
8750    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
8751    beq     common_errNullObject        @ yes, fail
8752    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
8753    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
8754    cmp     r0, #0                      @ failed?
8755    beq     common_exceptionThrown      @ yes, handle exception
8756    b       common_invokeMethodJumbo    @ (r0=method, r9="this")
8757
8758/* ------------------------------ */
8759    .balign 64
8760.L_OP_UNUSED_27FF: /* 0x127 */
8761/* File: armv5te/OP_UNUSED_27FF.S */
8762/* File: armv5te/unused.S */
8763    bl      common_abort
8764
8765
8766/* ------------------------------ */
8767    .balign 64
8768.L_OP_UNUSED_28FF: /* 0x128 */
8769/* File: armv5te/OP_UNUSED_28FF.S */
8770/* File: armv5te/unused.S */
8771    bl      common_abort
8772
8773
8774/* ------------------------------ */
8775    .balign 64
8776.L_OP_UNUSED_29FF: /* 0x129 */
8777/* File: armv5te/OP_UNUSED_29FF.S */
8778/* File: armv5te/unused.S */
8779    bl      common_abort
8780
8781
8782/* ------------------------------ */
8783    .balign 64
8784.L_OP_UNUSED_2AFF: /* 0x12a */
8785/* File: armv5te/OP_UNUSED_2AFF.S */
8786/* File: armv5te/unused.S */
8787    bl      common_abort
8788
8789
8790/* ------------------------------ */
8791    .balign 64
8792.L_OP_UNUSED_2BFF: /* 0x12b */
8793/* File: armv5te/OP_UNUSED_2BFF.S */
8794/* File: armv5te/unused.S */
8795    bl      common_abort
8796
8797
8798/* ------------------------------ */
8799    .balign 64
8800.L_OP_UNUSED_2CFF: /* 0x12c */
8801/* File: armv5te/OP_UNUSED_2CFF.S */
8802/* File: armv5te/unused.S */
8803    bl      common_abort
8804
8805
8806/* ------------------------------ */
8807    .balign 64
8808.L_OP_UNUSED_2DFF: /* 0x12d */
8809/* File: armv5te/OP_UNUSED_2DFF.S */
8810/* File: armv5te/unused.S */
8811    bl      common_abort
8812
8813
8814/* ------------------------------ */
8815    .balign 64
8816.L_OP_UNUSED_2EFF: /* 0x12e */
8817/* File: armv5te/OP_UNUSED_2EFF.S */
8818/* File: armv5te/unused.S */
8819    bl      common_abort
8820
8821
8822/* ------------------------------ */
8823    .balign 64
8824.L_OP_UNUSED_2FFF: /* 0x12f */
8825/* File: armv5te/OP_UNUSED_2FFF.S */
8826/* File: armv5te/unused.S */
8827    bl      common_abort
8828
8829
8830/* ------------------------------ */
8831    .balign 64
8832.L_OP_UNUSED_30FF: /* 0x130 */
8833/* File: armv5te/OP_UNUSED_30FF.S */
8834/* File: armv5te/unused.S */
8835    bl      common_abort
8836
8837
8838/* ------------------------------ */
8839    .balign 64
8840.L_OP_UNUSED_31FF: /* 0x131 */
8841/* File: armv5te/OP_UNUSED_31FF.S */
8842/* File: armv5te/unused.S */
8843    bl      common_abort
8844
8845
8846/* ------------------------------ */
8847    .balign 64
8848.L_OP_UNUSED_32FF: /* 0x132 */
8849/* File: armv5te/OP_UNUSED_32FF.S */
8850/* File: armv5te/unused.S */
8851    bl      common_abort
8852
8853
8854/* ------------------------------ */
8855    .balign 64
8856.L_OP_UNUSED_33FF: /* 0x133 */
8857/* File: armv5te/OP_UNUSED_33FF.S */
8858/* File: armv5te/unused.S */
8859    bl      common_abort
8860
8861
8862/* ------------------------------ */
8863    .balign 64
8864.L_OP_UNUSED_34FF: /* 0x134 */
8865/* File: armv5te/OP_UNUSED_34FF.S */
8866/* File: armv5te/unused.S */
8867    bl      common_abort
8868
8869
8870/* ------------------------------ */
8871    .balign 64
8872.L_OP_UNUSED_35FF: /* 0x135 */
8873/* File: armv5te/OP_UNUSED_35FF.S */
8874/* File: armv5te/unused.S */
8875    bl      common_abort
8876
8877
8878/* ------------------------------ */
8879    .balign 64
8880.L_OP_UNUSED_36FF: /* 0x136 */
8881/* File: armv5te/OP_UNUSED_36FF.S */
8882/* File: armv5te/unused.S */
8883    bl      common_abort
8884
8885
8886/* ------------------------------ */
8887    .balign 64
8888.L_OP_UNUSED_37FF: /* 0x137 */
8889/* File: armv5te/OP_UNUSED_37FF.S */
8890/* File: armv5te/unused.S */
8891    bl      common_abort
8892
8893
8894/* ------------------------------ */
8895    .balign 64
8896.L_OP_UNUSED_38FF: /* 0x138 */
8897/* File: armv5te/OP_UNUSED_38FF.S */
8898/* File: armv5te/unused.S */
8899    bl      common_abort
8900
8901
8902/* ------------------------------ */
8903    .balign 64
8904.L_OP_UNUSED_39FF: /* 0x139 */
8905/* File: armv5te/OP_UNUSED_39FF.S */
8906/* File: armv5te/unused.S */
8907    bl      common_abort
8908
8909
8910/* ------------------------------ */
8911    .balign 64
8912.L_OP_UNUSED_3AFF: /* 0x13a */
8913/* File: armv5te/OP_UNUSED_3AFF.S */
8914/* File: armv5te/unused.S */
8915    bl      common_abort
8916
8917
8918/* ------------------------------ */
8919    .balign 64
8920.L_OP_UNUSED_3BFF: /* 0x13b */
8921/* File: armv5te/OP_UNUSED_3BFF.S */
8922/* File: armv5te/unused.S */
8923    bl      common_abort
8924
8925
8926/* ------------------------------ */
8927    .balign 64
8928.L_OP_UNUSED_3CFF: /* 0x13c */
8929/* File: armv5te/OP_UNUSED_3CFF.S */
8930/* File: armv5te/unused.S */
8931    bl      common_abort
8932
8933
8934/* ------------------------------ */
8935    .balign 64
8936.L_OP_UNUSED_3DFF: /* 0x13d */
8937/* File: armv5te/OP_UNUSED_3DFF.S */
8938/* File: armv5te/unused.S */
8939    bl      common_abort
8940
8941
8942/* ------------------------------ */
8943    .balign 64
8944.L_OP_UNUSED_3EFF: /* 0x13e */
8945/* File: armv5te/OP_UNUSED_3EFF.S */
8946/* File: armv5te/unused.S */
8947    bl      common_abort
8948
8949
8950/* ------------------------------ */
8951    .balign 64
8952.L_OP_UNUSED_3FFF: /* 0x13f */
8953/* File: armv5te/OP_UNUSED_3FFF.S */
8954/* File: armv5te/unused.S */
8955    bl      common_abort
8956
8957
8958/* ------------------------------ */
8959    .balign 64
8960.L_OP_UNUSED_40FF: /* 0x140 */
8961/* File: armv5te/OP_UNUSED_40FF.S */
8962/* File: armv5te/unused.S */
8963    bl      common_abort
8964
8965
8966/* ------------------------------ */
8967    .balign 64
8968.L_OP_UNUSED_41FF: /* 0x141 */
8969/* File: armv5te/OP_UNUSED_41FF.S */
8970/* File: armv5te/unused.S */
8971    bl      common_abort
8972
8973
8974/* ------------------------------ */
8975    .balign 64
8976.L_OP_UNUSED_42FF: /* 0x142 */
8977/* File: armv5te/OP_UNUSED_42FF.S */
8978/* File: armv5te/unused.S */
8979    bl      common_abort
8980
8981
8982/* ------------------------------ */
8983    .balign 64
8984.L_OP_UNUSED_43FF: /* 0x143 */
8985/* File: armv5te/OP_UNUSED_43FF.S */
8986/* File: armv5te/unused.S */
8987    bl      common_abort
8988
8989
8990/* ------------------------------ */
8991    .balign 64
8992.L_OP_UNUSED_44FF: /* 0x144 */
8993/* File: armv5te/OP_UNUSED_44FF.S */
8994/* File: armv5te/unused.S */
8995    bl      common_abort
8996
8997
8998/* ------------------------------ */
8999    .balign 64
9000.L_OP_UNUSED_45FF: /* 0x145 */
9001/* File: armv5te/OP_UNUSED_45FF.S */
9002/* File: armv5te/unused.S */
9003    bl      common_abort
9004
9005
9006/* ------------------------------ */
9007    .balign 64
9008.L_OP_UNUSED_46FF: /* 0x146 */
9009/* File: armv5te/OP_UNUSED_46FF.S */
9010/* File: armv5te/unused.S */
9011    bl      common_abort
9012
9013
9014/* ------------------------------ */
9015    .balign 64
9016.L_OP_UNUSED_47FF: /* 0x147 */
9017/* File: armv5te/OP_UNUSED_47FF.S */
9018/* File: armv5te/unused.S */
9019    bl      common_abort
9020
9021
9022/* ------------------------------ */
9023    .balign 64
9024.L_OP_UNUSED_48FF: /* 0x148 */
9025/* File: armv5te/OP_UNUSED_48FF.S */
9026/* File: armv5te/unused.S */
9027    bl      common_abort
9028
9029
9030/* ------------------------------ */
9031    .balign 64
9032.L_OP_UNUSED_49FF: /* 0x149 */
9033/* File: armv5te/OP_UNUSED_49FF.S */
9034/* File: armv5te/unused.S */
9035    bl      common_abort
9036
9037
9038/* ------------------------------ */
9039    .balign 64
9040.L_OP_UNUSED_4AFF: /* 0x14a */
9041/* File: armv5te/OP_UNUSED_4AFF.S */
9042/* File: armv5te/unused.S */
9043    bl      common_abort
9044
9045
9046/* ------------------------------ */
9047    .balign 64
9048.L_OP_UNUSED_4BFF: /* 0x14b */
9049/* File: armv5te/OP_UNUSED_4BFF.S */
9050/* File: armv5te/unused.S */
9051    bl      common_abort
9052
9053
9054/* ------------------------------ */
9055    .balign 64
9056.L_OP_UNUSED_4CFF: /* 0x14c */
9057/* File: armv5te/OP_UNUSED_4CFF.S */
9058/* File: armv5te/unused.S */
9059    bl      common_abort
9060
9061
9062/* ------------------------------ */
9063    .balign 64
9064.L_OP_UNUSED_4DFF: /* 0x14d */
9065/* File: armv5te/OP_UNUSED_4DFF.S */
9066/* File: armv5te/unused.S */
9067    bl      common_abort
9068
9069
9070/* ------------------------------ */
9071    .balign 64
9072.L_OP_UNUSED_4EFF: /* 0x14e */
9073/* File: armv5te/OP_UNUSED_4EFF.S */
9074/* File: armv5te/unused.S */
9075    bl      common_abort
9076
9077
9078/* ------------------------------ */
9079    .balign 64
9080.L_OP_UNUSED_4FFF: /* 0x14f */
9081/* File: armv5te/OP_UNUSED_4FFF.S */
9082/* File: armv5te/unused.S */
9083    bl      common_abort
9084
9085
9086/* ------------------------------ */
9087    .balign 64
9088.L_OP_UNUSED_50FF: /* 0x150 */
9089/* File: armv5te/OP_UNUSED_50FF.S */
9090/* File: armv5te/unused.S */
9091    bl      common_abort
9092
9093
9094/* ------------------------------ */
9095    .balign 64
9096.L_OP_UNUSED_51FF: /* 0x151 */
9097/* File: armv5te/OP_UNUSED_51FF.S */
9098/* File: armv5te/unused.S */
9099    bl      common_abort
9100
9101
9102/* ------------------------------ */
9103    .balign 64
9104.L_OP_UNUSED_52FF: /* 0x152 */
9105/* File: armv5te/OP_UNUSED_52FF.S */
9106/* File: armv5te/unused.S */
9107    bl      common_abort
9108
9109
9110/* ------------------------------ */
9111    .balign 64
9112.L_OP_UNUSED_53FF: /* 0x153 */
9113/* File: armv5te/OP_UNUSED_53FF.S */
9114/* File: armv5te/unused.S */
9115    bl      common_abort
9116
9117
9118/* ------------------------------ */
9119    .balign 64
9120.L_OP_UNUSED_54FF: /* 0x154 */
9121/* File: armv5te/OP_UNUSED_54FF.S */
9122/* File: armv5te/unused.S */
9123    bl      common_abort
9124
9125
9126/* ------------------------------ */
9127    .balign 64
9128.L_OP_UNUSED_55FF: /* 0x155 */
9129/* File: armv5te/OP_UNUSED_55FF.S */
9130/* File: armv5te/unused.S */
9131    bl      common_abort
9132
9133
9134/* ------------------------------ */
9135    .balign 64
9136.L_OP_UNUSED_56FF: /* 0x156 */
9137/* File: armv5te/OP_UNUSED_56FF.S */
9138/* File: armv5te/unused.S */
9139    bl      common_abort
9140
9141
9142/* ------------------------------ */
9143    .balign 64
9144.L_OP_UNUSED_57FF: /* 0x157 */
9145/* File: armv5te/OP_UNUSED_57FF.S */
9146/* File: armv5te/unused.S */
9147    bl      common_abort
9148
9149
9150/* ------------------------------ */
9151    .balign 64
9152.L_OP_UNUSED_58FF: /* 0x158 */
9153/* File: armv5te/OP_UNUSED_58FF.S */
9154/* File: armv5te/unused.S */
9155    bl      common_abort
9156
9157
9158/* ------------------------------ */
9159    .balign 64
9160.L_OP_UNUSED_59FF: /* 0x159 */
9161/* File: armv5te/OP_UNUSED_59FF.S */
9162/* File: armv5te/unused.S */
9163    bl      common_abort
9164
9165
9166/* ------------------------------ */
9167    .balign 64
9168.L_OP_UNUSED_5AFF: /* 0x15a */
9169/* File: armv5te/OP_UNUSED_5AFF.S */
9170/* File: armv5te/unused.S */
9171    bl      common_abort
9172
9173
9174/* ------------------------------ */
9175    .balign 64
9176.L_OP_UNUSED_5BFF: /* 0x15b */
9177/* File: armv5te/OP_UNUSED_5BFF.S */
9178/* File: armv5te/unused.S */
9179    bl      common_abort
9180
9181
9182/* ------------------------------ */
9183    .balign 64
9184.L_OP_UNUSED_5CFF: /* 0x15c */
9185/* File: armv5te/OP_UNUSED_5CFF.S */
9186/* File: armv5te/unused.S */
9187    bl      common_abort
9188
9189
9190/* ------------------------------ */
9191    .balign 64
9192.L_OP_UNUSED_5DFF: /* 0x15d */
9193/* File: armv5te/OP_UNUSED_5DFF.S */
9194/* File: armv5te/unused.S */
9195    bl      common_abort
9196
9197
9198/* ------------------------------ */
9199    .balign 64
9200.L_OP_UNUSED_5EFF: /* 0x15e */
9201/* File: armv5te/OP_UNUSED_5EFF.S */
9202/* File: armv5te/unused.S */
9203    bl      common_abort
9204
9205
9206/* ------------------------------ */
9207    .balign 64
9208.L_OP_UNUSED_5FFF: /* 0x15f */
9209/* File: armv5te/OP_UNUSED_5FFF.S */
9210/* File: armv5te/unused.S */
9211    bl      common_abort
9212
9213
9214/* ------------------------------ */
9215    .balign 64
9216.L_OP_UNUSED_60FF: /* 0x160 */
9217/* File: armv5te/OP_UNUSED_60FF.S */
9218/* File: armv5te/unused.S */
9219    bl      common_abort
9220
9221
9222/* ------------------------------ */
9223    .balign 64
9224.L_OP_UNUSED_61FF: /* 0x161 */
9225/* File: armv5te/OP_UNUSED_61FF.S */
9226/* File: armv5te/unused.S */
9227    bl      common_abort
9228
9229
9230/* ------------------------------ */
9231    .balign 64
9232.L_OP_UNUSED_62FF: /* 0x162 */
9233/* File: armv5te/OP_UNUSED_62FF.S */
9234/* File: armv5te/unused.S */
9235    bl      common_abort
9236
9237
9238/* ------------------------------ */
9239    .balign 64
9240.L_OP_UNUSED_63FF: /* 0x163 */
9241/* File: armv5te/OP_UNUSED_63FF.S */
9242/* File: armv5te/unused.S */
9243    bl      common_abort
9244
9245
9246/* ------------------------------ */
9247    .balign 64
9248.L_OP_UNUSED_64FF: /* 0x164 */
9249/* File: armv5te/OP_UNUSED_64FF.S */
9250/* File: armv5te/unused.S */
9251    bl      common_abort
9252
9253
9254/* ------------------------------ */
9255    .balign 64
9256.L_OP_UNUSED_65FF: /* 0x165 */
9257/* File: armv5te/OP_UNUSED_65FF.S */
9258/* File: armv5te/unused.S */
9259    bl      common_abort
9260
9261
9262/* ------------------------------ */
9263    .balign 64
9264.L_OP_UNUSED_66FF: /* 0x166 */
9265/* File: armv5te/OP_UNUSED_66FF.S */
9266/* File: armv5te/unused.S */
9267    bl      common_abort
9268
9269
9270/* ------------------------------ */
9271    .balign 64
9272.L_OP_UNUSED_67FF: /* 0x167 */
9273/* File: armv5te/OP_UNUSED_67FF.S */
9274/* File: armv5te/unused.S */
9275    bl      common_abort
9276
9277
9278/* ------------------------------ */
9279    .balign 64
9280.L_OP_UNUSED_68FF: /* 0x168 */
9281/* File: armv5te/OP_UNUSED_68FF.S */
9282/* File: armv5te/unused.S */
9283    bl      common_abort
9284
9285
9286/* ------------------------------ */
9287    .balign 64
9288.L_OP_UNUSED_69FF: /* 0x169 */
9289/* File: armv5te/OP_UNUSED_69FF.S */
9290/* File: armv5te/unused.S */
9291    bl      common_abort
9292
9293
9294/* ------------------------------ */
9295    .balign 64
9296.L_OP_UNUSED_6AFF: /* 0x16a */
9297/* File: armv5te/OP_UNUSED_6AFF.S */
9298/* File: armv5te/unused.S */
9299    bl      common_abort
9300
9301
9302/* ------------------------------ */
9303    .balign 64
9304.L_OP_UNUSED_6BFF: /* 0x16b */
9305/* File: armv5te/OP_UNUSED_6BFF.S */
9306/* File: armv5te/unused.S */
9307    bl      common_abort
9308
9309
9310/* ------------------------------ */
9311    .balign 64
9312.L_OP_UNUSED_6CFF: /* 0x16c */
9313/* File: armv5te/OP_UNUSED_6CFF.S */
9314/* File: armv5te/unused.S */
9315    bl      common_abort
9316
9317
9318/* ------------------------------ */
9319    .balign 64
9320.L_OP_UNUSED_6DFF: /* 0x16d */
9321/* File: armv5te/OP_UNUSED_6DFF.S */
9322/* File: armv5te/unused.S */
9323    bl      common_abort
9324
9325
9326/* ------------------------------ */
9327    .balign 64
9328.L_OP_UNUSED_6EFF: /* 0x16e */
9329/* File: armv5te/OP_UNUSED_6EFF.S */
9330/* File: armv5te/unused.S */
9331    bl      common_abort
9332
9333
9334/* ------------------------------ */
9335    .balign 64
9336.L_OP_UNUSED_6FFF: /* 0x16f */
9337/* File: armv5te/OP_UNUSED_6FFF.S */
9338/* File: armv5te/unused.S */
9339    bl      common_abort
9340
9341
9342/* ------------------------------ */
9343    .balign 64
9344.L_OP_UNUSED_70FF: /* 0x170 */
9345/* File: armv5te/OP_UNUSED_70FF.S */
9346/* File: armv5te/unused.S */
9347    bl      common_abort
9348
9349
9350/* ------------------------------ */
9351    .balign 64
9352.L_OP_UNUSED_71FF: /* 0x171 */
9353/* File: armv5te/OP_UNUSED_71FF.S */
9354/* File: armv5te/unused.S */
9355    bl      common_abort
9356
9357
9358/* ------------------------------ */
9359    .balign 64
9360.L_OP_UNUSED_72FF: /* 0x172 */
9361/* File: armv5te/OP_UNUSED_72FF.S */
9362/* File: armv5te/unused.S */
9363    bl      common_abort
9364
9365
9366/* ------------------------------ */
9367    .balign 64
9368.L_OP_UNUSED_73FF: /* 0x173 */
9369/* File: armv5te/OP_UNUSED_73FF.S */
9370/* File: armv5te/unused.S */
9371    bl      common_abort
9372
9373
9374/* ------------------------------ */
9375    .balign 64
9376.L_OP_UNUSED_74FF: /* 0x174 */
9377/* File: armv5te/OP_UNUSED_74FF.S */
9378/* File: armv5te/unused.S */
9379    bl      common_abort
9380
9381
9382/* ------------------------------ */
9383    .balign 64
9384.L_OP_UNUSED_75FF: /* 0x175 */
9385/* File: armv5te/OP_UNUSED_75FF.S */
9386/* File: armv5te/unused.S */
9387    bl      common_abort
9388
9389
9390/* ------------------------------ */
9391    .balign 64
9392.L_OP_UNUSED_76FF: /* 0x176 */
9393/* File: armv5te/OP_UNUSED_76FF.S */
9394/* File: armv5te/unused.S */
9395    bl      common_abort
9396
9397
9398/* ------------------------------ */
9399    .balign 64
9400.L_OP_UNUSED_77FF: /* 0x177 */
9401/* File: armv5te/OP_UNUSED_77FF.S */
9402/* File: armv5te/unused.S */
9403    bl      common_abort
9404
9405
9406/* ------------------------------ */
9407    .balign 64
9408.L_OP_UNUSED_78FF: /* 0x178 */
9409/* File: armv5te/OP_UNUSED_78FF.S */
9410/* File: armv5te/unused.S */
9411    bl      common_abort
9412
9413
9414/* ------------------------------ */
9415    .balign 64
9416.L_OP_UNUSED_79FF: /* 0x179 */
9417/* File: armv5te/OP_UNUSED_79FF.S */
9418/* File: armv5te/unused.S */
9419    bl      common_abort
9420
9421
9422/* ------------------------------ */
9423    .balign 64
9424.L_OP_UNUSED_7AFF: /* 0x17a */
9425/* File: armv5te/OP_UNUSED_7AFF.S */
9426/* File: armv5te/unused.S */
9427    bl      common_abort
9428
9429
9430/* ------------------------------ */
9431    .balign 64
9432.L_OP_UNUSED_7BFF: /* 0x17b */
9433/* File: armv5te/OP_UNUSED_7BFF.S */
9434/* File: armv5te/unused.S */
9435    bl      common_abort
9436
9437
9438/* ------------------------------ */
9439    .balign 64
9440.L_OP_UNUSED_7CFF: /* 0x17c */
9441/* File: armv5te/OP_UNUSED_7CFF.S */
9442/* File: armv5te/unused.S */
9443    bl      common_abort
9444
9445
9446/* ------------------------------ */
9447    .balign 64
9448.L_OP_UNUSED_7DFF: /* 0x17d */
9449/* File: armv5te/OP_UNUSED_7DFF.S */
9450/* File: armv5te/unused.S */
9451    bl      common_abort
9452
9453
9454/* ------------------------------ */
9455    .balign 64
9456.L_OP_UNUSED_7EFF: /* 0x17e */
9457/* File: armv5te/OP_UNUSED_7EFF.S */
9458/* File: armv5te/unused.S */
9459    bl      common_abort
9460
9461
9462/* ------------------------------ */
9463    .balign 64
9464.L_OP_UNUSED_7FFF: /* 0x17f */
9465/* File: armv5te/OP_UNUSED_7FFF.S */
9466/* File: armv5te/unused.S */
9467    bl      common_abort
9468
9469
9470/* ------------------------------ */
9471    .balign 64
9472.L_OP_UNUSED_80FF: /* 0x180 */
9473/* File: armv5te/OP_UNUSED_80FF.S */
9474/* File: armv5te/unused.S */
9475    bl      common_abort
9476
9477
9478/* ------------------------------ */
9479    .balign 64
9480.L_OP_UNUSED_81FF: /* 0x181 */
9481/* File: armv5te/OP_UNUSED_81FF.S */
9482/* File: armv5te/unused.S */
9483    bl      common_abort
9484
9485
9486/* ------------------------------ */
9487    .balign 64
9488.L_OP_UNUSED_82FF: /* 0x182 */
9489/* File: armv5te/OP_UNUSED_82FF.S */
9490/* File: armv5te/unused.S */
9491    bl      common_abort
9492
9493
9494/* ------------------------------ */
9495    .balign 64
9496.L_OP_UNUSED_83FF: /* 0x183 */
9497/* File: armv5te/OP_UNUSED_83FF.S */
9498/* File: armv5te/unused.S */
9499    bl      common_abort
9500
9501
9502/* ------------------------------ */
9503    .balign 64
9504.L_OP_UNUSED_84FF: /* 0x184 */
9505/* File: armv5te/OP_UNUSED_84FF.S */
9506/* File: armv5te/unused.S */
9507    bl      common_abort
9508
9509
9510/* ------------------------------ */
9511    .balign 64
9512.L_OP_UNUSED_85FF: /* 0x185 */
9513/* File: armv5te/OP_UNUSED_85FF.S */
9514/* File: armv5te/unused.S */
9515    bl      common_abort
9516
9517
9518/* ------------------------------ */
9519    .balign 64
9520.L_OP_UNUSED_86FF: /* 0x186 */
9521/* File: armv5te/OP_UNUSED_86FF.S */
9522/* File: armv5te/unused.S */
9523    bl      common_abort
9524
9525
9526/* ------------------------------ */
9527    .balign 64
9528.L_OP_UNUSED_87FF: /* 0x187 */
9529/* File: armv5te/OP_UNUSED_87FF.S */
9530/* File: armv5te/unused.S */
9531    bl      common_abort
9532
9533
9534/* ------------------------------ */
9535    .balign 64
9536.L_OP_UNUSED_88FF: /* 0x188 */
9537/* File: armv5te/OP_UNUSED_88FF.S */
9538/* File: armv5te/unused.S */
9539    bl      common_abort
9540
9541
9542/* ------------------------------ */
9543    .balign 64
9544.L_OP_UNUSED_89FF: /* 0x189 */
9545/* File: armv5te/OP_UNUSED_89FF.S */
9546/* File: armv5te/unused.S */
9547    bl      common_abort
9548
9549
9550/* ------------------------------ */
9551    .balign 64
9552.L_OP_UNUSED_8AFF: /* 0x18a */
9553/* File: armv5te/OP_UNUSED_8AFF.S */
9554/* File: armv5te/unused.S */
9555    bl      common_abort
9556
9557
9558/* ------------------------------ */
9559    .balign 64
9560.L_OP_UNUSED_8BFF: /* 0x18b */
9561/* File: armv5te/OP_UNUSED_8BFF.S */
9562/* File: armv5te/unused.S */
9563    bl      common_abort
9564
9565
9566/* ------------------------------ */
9567    .balign 64
9568.L_OP_UNUSED_8CFF: /* 0x18c */
9569/* File: armv5te/OP_UNUSED_8CFF.S */
9570/* File: armv5te/unused.S */
9571    bl      common_abort
9572
9573
9574/* ------------------------------ */
9575    .balign 64
9576.L_OP_UNUSED_8DFF: /* 0x18d */
9577/* File: armv5te/OP_UNUSED_8DFF.S */
9578/* File: armv5te/unused.S */
9579    bl      common_abort
9580
9581
9582/* ------------------------------ */
9583    .balign 64
9584.L_OP_UNUSED_8EFF: /* 0x18e */
9585/* File: armv5te/OP_UNUSED_8EFF.S */
9586/* File: armv5te/unused.S */
9587    bl      common_abort
9588
9589
9590/* ------------------------------ */
9591    .balign 64
9592.L_OP_UNUSED_8FFF: /* 0x18f */
9593/* File: armv5te/OP_UNUSED_8FFF.S */
9594/* File: armv5te/unused.S */
9595    bl      common_abort
9596
9597
9598/* ------------------------------ */
9599    .balign 64
9600.L_OP_UNUSED_90FF: /* 0x190 */
9601/* File: armv5te/OP_UNUSED_90FF.S */
9602/* File: armv5te/unused.S */
9603    bl      common_abort
9604
9605
9606/* ------------------------------ */
9607    .balign 64
9608.L_OP_UNUSED_91FF: /* 0x191 */
9609/* File: armv5te/OP_UNUSED_91FF.S */
9610/* File: armv5te/unused.S */
9611    bl      common_abort
9612
9613
9614/* ------------------------------ */
9615    .balign 64
9616.L_OP_UNUSED_92FF: /* 0x192 */
9617/* File: armv5te/OP_UNUSED_92FF.S */
9618/* File: armv5te/unused.S */
9619    bl      common_abort
9620
9621
9622/* ------------------------------ */
9623    .balign 64
9624.L_OP_UNUSED_93FF: /* 0x193 */
9625/* File: armv5te/OP_UNUSED_93FF.S */
9626/* File: armv5te/unused.S */
9627    bl      common_abort
9628
9629
9630/* ------------------------------ */
9631    .balign 64
9632.L_OP_UNUSED_94FF: /* 0x194 */
9633/* File: armv5te/OP_UNUSED_94FF.S */
9634/* File: armv5te/unused.S */
9635    bl      common_abort
9636
9637
9638/* ------------------------------ */
9639    .balign 64
9640.L_OP_UNUSED_95FF: /* 0x195 */
9641/* File: armv5te/OP_UNUSED_95FF.S */
9642/* File: armv5te/unused.S */
9643    bl      common_abort
9644
9645
9646/* ------------------------------ */
9647    .balign 64
9648.L_OP_UNUSED_96FF: /* 0x196 */
9649/* File: armv5te/OP_UNUSED_96FF.S */
9650/* File: armv5te/unused.S */
9651    bl      common_abort
9652
9653
9654/* ------------------------------ */
9655    .balign 64
9656.L_OP_UNUSED_97FF: /* 0x197 */
9657/* File: armv5te/OP_UNUSED_97FF.S */
9658/* File: armv5te/unused.S */
9659    bl      common_abort
9660
9661
9662/* ------------------------------ */
9663    .balign 64
9664.L_OP_UNUSED_98FF: /* 0x198 */
9665/* File: armv5te/OP_UNUSED_98FF.S */
9666/* File: armv5te/unused.S */
9667    bl      common_abort
9668
9669
9670/* ------------------------------ */
9671    .balign 64
9672.L_OP_UNUSED_99FF: /* 0x199 */
9673/* File: armv5te/OP_UNUSED_99FF.S */
9674/* File: armv5te/unused.S */
9675    bl      common_abort
9676
9677
9678/* ------------------------------ */
9679    .balign 64
9680.L_OP_UNUSED_9AFF: /* 0x19a */
9681/* File: armv5te/OP_UNUSED_9AFF.S */
9682/* File: armv5te/unused.S */
9683    bl      common_abort
9684
9685
9686/* ------------------------------ */
9687    .balign 64
9688.L_OP_UNUSED_9BFF: /* 0x19b */
9689/* File: armv5te/OP_UNUSED_9BFF.S */
9690/* File: armv5te/unused.S */
9691    bl      common_abort
9692
9693
9694/* ------------------------------ */
9695    .balign 64
9696.L_OP_UNUSED_9CFF: /* 0x19c */
9697/* File: armv5te/OP_UNUSED_9CFF.S */
9698/* File: armv5te/unused.S */
9699    bl      common_abort
9700
9701
9702/* ------------------------------ */
9703    .balign 64
9704.L_OP_UNUSED_9DFF: /* 0x19d */
9705/* File: armv5te/OP_UNUSED_9DFF.S */
9706/* File: armv5te/unused.S */
9707    bl      common_abort
9708
9709
9710/* ------------------------------ */
9711    .balign 64
9712.L_OP_UNUSED_9EFF: /* 0x19e */
9713/* File: armv5te/OP_UNUSED_9EFF.S */
9714/* File: armv5te/unused.S */
9715    bl      common_abort
9716
9717
9718/* ------------------------------ */
9719    .balign 64
9720.L_OP_UNUSED_9FFF: /* 0x19f */
9721/* File: armv5te/OP_UNUSED_9FFF.S */
9722/* File: armv5te/unused.S */
9723    bl      common_abort
9724
9725
9726/* ------------------------------ */
9727    .balign 64
9728.L_OP_UNUSED_A0FF: /* 0x1a0 */
9729/* File: armv5te/OP_UNUSED_A0FF.S */
9730/* File: armv5te/unused.S */
9731    bl      common_abort
9732
9733
9734/* ------------------------------ */
9735    .balign 64
9736.L_OP_UNUSED_A1FF: /* 0x1a1 */
9737/* File: armv5te/OP_UNUSED_A1FF.S */
9738/* File: armv5te/unused.S */
9739    bl      common_abort
9740
9741
9742/* ------------------------------ */
9743    .balign 64
9744.L_OP_UNUSED_A2FF: /* 0x1a2 */
9745/* File: armv5te/OP_UNUSED_A2FF.S */
9746/* File: armv5te/unused.S */
9747    bl      common_abort
9748
9749
9750/* ------------------------------ */
9751    .balign 64
9752.L_OP_UNUSED_A3FF: /* 0x1a3 */
9753/* File: armv5te/OP_UNUSED_A3FF.S */
9754/* File: armv5te/unused.S */
9755    bl      common_abort
9756
9757
9758/* ------------------------------ */
9759    .balign 64
9760.L_OP_UNUSED_A4FF: /* 0x1a4 */
9761/* File: armv5te/OP_UNUSED_A4FF.S */
9762/* File: armv5te/unused.S */
9763    bl      common_abort
9764
9765
9766/* ------------------------------ */
9767    .balign 64
9768.L_OP_UNUSED_A5FF: /* 0x1a5 */
9769/* File: armv5te/OP_UNUSED_A5FF.S */
9770/* File: armv5te/unused.S */
9771    bl      common_abort
9772
9773
9774/* ------------------------------ */
9775    .balign 64
9776.L_OP_UNUSED_A6FF: /* 0x1a6 */
9777/* File: armv5te/OP_UNUSED_A6FF.S */
9778/* File: armv5te/unused.S */
9779    bl      common_abort
9780
9781
9782/* ------------------------------ */
9783    .balign 64
9784.L_OP_UNUSED_A7FF: /* 0x1a7 */
9785/* File: armv5te/OP_UNUSED_A7FF.S */
9786/* File: armv5te/unused.S */
9787    bl      common_abort
9788
9789
9790/* ------------------------------ */
9791    .balign 64
9792.L_OP_UNUSED_A8FF: /* 0x1a8 */
9793/* File: armv5te/OP_UNUSED_A8FF.S */
9794/* File: armv5te/unused.S */
9795    bl      common_abort
9796
9797
9798/* ------------------------------ */
9799    .balign 64
9800.L_OP_UNUSED_A9FF: /* 0x1a9 */
9801/* File: armv5te/OP_UNUSED_A9FF.S */
9802/* File: armv5te/unused.S */
9803    bl      common_abort
9804
9805
9806/* ------------------------------ */
9807    .balign 64
9808.L_OP_UNUSED_AAFF: /* 0x1aa */
9809/* File: armv5te/OP_UNUSED_AAFF.S */
9810/* File: armv5te/unused.S */
9811    bl      common_abort
9812
9813
9814/* ------------------------------ */
9815    .balign 64
9816.L_OP_UNUSED_ABFF: /* 0x1ab */
9817/* File: armv5te/OP_UNUSED_ABFF.S */
9818/* File: armv5te/unused.S */
9819    bl      common_abort
9820
9821
9822/* ------------------------------ */
9823    .balign 64
9824.L_OP_UNUSED_ACFF: /* 0x1ac */
9825/* File: armv5te/OP_UNUSED_ACFF.S */
9826/* File: armv5te/unused.S */
9827    bl      common_abort
9828
9829
9830/* ------------------------------ */
9831    .balign 64
9832.L_OP_UNUSED_ADFF: /* 0x1ad */
9833/* File: armv5te/OP_UNUSED_ADFF.S */
9834/* File: armv5te/unused.S */
9835    bl      common_abort
9836
9837
9838/* ------------------------------ */
9839    .balign 64
9840.L_OP_UNUSED_AEFF: /* 0x1ae */
9841/* File: armv5te/OP_UNUSED_AEFF.S */
9842/* File: armv5te/unused.S */
9843    bl      common_abort
9844
9845
9846/* ------------------------------ */
9847    .balign 64
9848.L_OP_UNUSED_AFFF: /* 0x1af */
9849/* File: armv5te/OP_UNUSED_AFFF.S */
9850/* File: armv5te/unused.S */
9851    bl      common_abort
9852
9853
9854/* ------------------------------ */
9855    .balign 64
9856.L_OP_UNUSED_B0FF: /* 0x1b0 */
9857/* File: armv5te/OP_UNUSED_B0FF.S */
9858/* File: armv5te/unused.S */
9859    bl      common_abort
9860
9861
9862/* ------------------------------ */
9863    .balign 64
9864.L_OP_UNUSED_B1FF: /* 0x1b1 */
9865/* File: armv5te/OP_UNUSED_B1FF.S */
9866/* File: armv5te/unused.S */
9867    bl      common_abort
9868
9869
9870/* ------------------------------ */
9871    .balign 64
9872.L_OP_UNUSED_B2FF: /* 0x1b2 */
9873/* File: armv5te/OP_UNUSED_B2FF.S */
9874/* File: armv5te/unused.S */
9875    bl      common_abort
9876
9877
9878/* ------------------------------ */
9879    .balign 64
9880.L_OP_UNUSED_B3FF: /* 0x1b3 */
9881/* File: armv5te/OP_UNUSED_B3FF.S */
9882/* File: armv5te/unused.S */
9883    bl      common_abort
9884
9885
9886/* ------------------------------ */
9887    .balign 64
9888.L_OP_UNUSED_B4FF: /* 0x1b4 */
9889/* File: armv5te/OP_UNUSED_B4FF.S */
9890/* File: armv5te/unused.S */
9891    bl      common_abort
9892
9893
9894/* ------------------------------ */
9895    .balign 64
9896.L_OP_UNUSED_B5FF: /* 0x1b5 */
9897/* File: armv5te/OP_UNUSED_B5FF.S */
9898/* File: armv5te/unused.S */
9899    bl      common_abort
9900
9901
9902/* ------------------------------ */
9903    .balign 64
9904.L_OP_UNUSED_B6FF: /* 0x1b6 */
9905/* File: armv5te/OP_UNUSED_B6FF.S */
9906/* File: armv5te/unused.S */
9907    bl      common_abort
9908
9909
9910/* ------------------------------ */
9911    .balign 64
9912.L_OP_UNUSED_B7FF: /* 0x1b7 */
9913/* File: armv5te/OP_UNUSED_B7FF.S */
9914/* File: armv5te/unused.S */
9915    bl      common_abort
9916
9917
9918/* ------------------------------ */
9919    .balign 64
9920.L_OP_UNUSED_B8FF: /* 0x1b8 */
9921/* File: armv5te/OP_UNUSED_B8FF.S */
9922/* File: armv5te/unused.S */
9923    bl      common_abort
9924
9925
9926/* ------------------------------ */
9927    .balign 64
9928.L_OP_UNUSED_B9FF: /* 0x1b9 */
9929/* File: armv5te/OP_UNUSED_B9FF.S */
9930/* File: armv5te/unused.S */
9931    bl      common_abort
9932
9933
9934/* ------------------------------ */
9935    .balign 64
9936.L_OP_UNUSED_BAFF: /* 0x1ba */
9937/* File: armv5te/OP_UNUSED_BAFF.S */
9938/* File: armv5te/unused.S */
9939    bl      common_abort
9940
9941
9942/* ------------------------------ */
9943    .balign 64
9944.L_OP_UNUSED_BBFF: /* 0x1bb */
9945/* File: armv5te/OP_UNUSED_BBFF.S */
9946/* File: armv5te/unused.S */
9947    bl      common_abort
9948
9949
9950/* ------------------------------ */
9951    .balign 64
9952.L_OP_UNUSED_BCFF: /* 0x1bc */
9953/* File: armv5te/OP_UNUSED_BCFF.S */
9954/* File: armv5te/unused.S */
9955    bl      common_abort
9956
9957
9958/* ------------------------------ */
9959    .balign 64
9960.L_OP_UNUSED_BDFF: /* 0x1bd */
9961/* File: armv5te/OP_UNUSED_BDFF.S */
9962/* File: armv5te/unused.S */
9963    bl      common_abort
9964
9965
9966/* ------------------------------ */
9967    .balign 64
9968.L_OP_UNUSED_BEFF: /* 0x1be */
9969/* File: armv5te/OP_UNUSED_BEFF.S */
9970/* File: armv5te/unused.S */
9971    bl      common_abort
9972
9973
9974/* ------------------------------ */
9975    .balign 64
9976.L_OP_UNUSED_BFFF: /* 0x1bf */
9977/* File: armv5te/OP_UNUSED_BFFF.S */
9978/* File: armv5te/unused.S */
9979    bl      common_abort
9980
9981
9982/* ------------------------------ */
9983    .balign 64
9984.L_OP_UNUSED_C0FF: /* 0x1c0 */
9985/* File: armv5te/OP_UNUSED_C0FF.S */
9986/* File: armv5te/unused.S */
9987    bl      common_abort
9988
9989
9990/* ------------------------------ */
9991    .balign 64
9992.L_OP_UNUSED_C1FF: /* 0x1c1 */
9993/* File: armv5te/OP_UNUSED_C1FF.S */
9994/* File: armv5te/unused.S */
9995    bl      common_abort
9996
9997
9998/* ------------------------------ */
9999    .balign 64
10000.L_OP_UNUSED_C2FF: /* 0x1c2 */
10001/* File: armv5te/OP_UNUSED_C2FF.S */
10002/* File: armv5te/unused.S */
10003    bl      common_abort
10004
10005
10006/* ------------------------------ */
10007    .balign 64
10008.L_OP_UNUSED_C3FF: /* 0x1c3 */
10009/* File: armv5te/OP_UNUSED_C3FF.S */
10010/* File: armv5te/unused.S */
10011    bl      common_abort
10012
10013
10014/* ------------------------------ */
10015    .balign 64
10016.L_OP_UNUSED_C4FF: /* 0x1c4 */
10017/* File: armv5te/OP_UNUSED_C4FF.S */
10018/* File: armv5te/unused.S */
10019    bl      common_abort
10020
10021
10022/* ------------------------------ */
10023    .balign 64
10024.L_OP_UNUSED_C5FF: /* 0x1c5 */
10025/* File: armv5te/OP_UNUSED_C5FF.S */
10026/* File: armv5te/unused.S */
10027    bl      common_abort
10028
10029
10030/* ------------------------------ */
10031    .balign 64
10032.L_OP_UNUSED_C6FF: /* 0x1c6 */
10033/* File: armv5te/OP_UNUSED_C6FF.S */
10034/* File: armv5te/unused.S */
10035    bl      common_abort
10036
10037
10038/* ------------------------------ */
10039    .balign 64
10040.L_OP_UNUSED_C7FF: /* 0x1c7 */
10041/* File: armv5te/OP_UNUSED_C7FF.S */
10042/* File: armv5te/unused.S */
10043    bl      common_abort
10044
10045
10046/* ------------------------------ */
10047    .balign 64
10048.L_OP_UNUSED_C8FF: /* 0x1c8 */
10049/* File: armv5te/OP_UNUSED_C8FF.S */
10050/* File: armv5te/unused.S */
10051    bl      common_abort
10052
10053
10054/* ------------------------------ */
10055    .balign 64
10056.L_OP_UNUSED_C9FF: /* 0x1c9 */
10057/* File: armv5te/OP_UNUSED_C9FF.S */
10058/* File: armv5te/unused.S */
10059    bl      common_abort
10060
10061
10062/* ------------------------------ */
10063    .balign 64
10064.L_OP_UNUSED_CAFF: /* 0x1ca */
10065/* File: armv5te/OP_UNUSED_CAFF.S */
10066/* File: armv5te/unused.S */
10067    bl      common_abort
10068
10069
10070/* ------------------------------ */
10071    .balign 64
10072.L_OP_UNUSED_CBFF: /* 0x1cb */
10073/* File: armv5te/OP_UNUSED_CBFF.S */
10074/* File: armv5te/unused.S */
10075    bl      common_abort
10076
10077
10078/* ------------------------------ */
10079    .balign 64
10080.L_OP_UNUSED_CCFF: /* 0x1cc */
10081/* File: armv5te/OP_UNUSED_CCFF.S */
10082/* File: armv5te/unused.S */
10083    bl      common_abort
10084
10085
10086/* ------------------------------ */
10087    .balign 64
10088.L_OP_UNUSED_CDFF: /* 0x1cd */
10089/* File: armv5te/OP_UNUSED_CDFF.S */
10090/* File: armv5te/unused.S */
10091    bl      common_abort
10092
10093
10094/* ------------------------------ */
10095    .balign 64
10096.L_OP_UNUSED_CEFF: /* 0x1ce */
10097/* File: armv5te/OP_UNUSED_CEFF.S */
10098/* File: armv5te/unused.S */
10099    bl      common_abort
10100
10101
10102/* ------------------------------ */
10103    .balign 64
10104.L_OP_UNUSED_CFFF: /* 0x1cf */
10105/* File: armv5te/OP_UNUSED_CFFF.S */
10106/* File: armv5te/unused.S */
10107    bl      common_abort
10108
10109
10110/* ------------------------------ */
10111    .balign 64
10112.L_OP_UNUSED_D0FF: /* 0x1d0 */
10113/* File: armv5te/OP_UNUSED_D0FF.S */
10114/* File: armv5te/unused.S */
10115    bl      common_abort
10116
10117
10118/* ------------------------------ */
10119    .balign 64
10120.L_OP_UNUSED_D1FF: /* 0x1d1 */
10121/* File: armv5te/OP_UNUSED_D1FF.S */
10122/* File: armv5te/unused.S */
10123    bl      common_abort
10124
10125
10126/* ------------------------------ */
10127    .balign 64
10128.L_OP_UNUSED_D2FF: /* 0x1d2 */
10129/* File: armv5te/OP_UNUSED_D2FF.S */
10130/* File: armv5te/unused.S */
10131    bl      common_abort
10132
10133
10134/* ------------------------------ */
10135    .balign 64
10136.L_OP_UNUSED_D3FF: /* 0x1d3 */
10137/* File: armv5te/OP_UNUSED_D3FF.S */
10138/* File: armv5te/unused.S */
10139    bl      common_abort
10140
10141
10142/* ------------------------------ */
10143    .balign 64
10144.L_OP_UNUSED_D4FF: /* 0x1d4 */
10145/* File: armv5te/OP_UNUSED_D4FF.S */
10146/* File: armv5te/unused.S */
10147    bl      common_abort
10148
10149
10150/* ------------------------------ */
10151    .balign 64
10152.L_OP_UNUSED_D5FF: /* 0x1d5 */
10153/* File: armv5te/OP_UNUSED_D5FF.S */
10154/* File: armv5te/unused.S */
10155    bl      common_abort
10156
10157
10158/* ------------------------------ */
10159    .balign 64
10160.L_OP_UNUSED_D6FF: /* 0x1d6 */
10161/* File: armv5te/OP_UNUSED_D6FF.S */
10162/* File: armv5te/unused.S */
10163    bl      common_abort
10164
10165
10166/* ------------------------------ */
10167    .balign 64
10168.L_OP_UNUSED_D7FF: /* 0x1d7 */
10169/* File: armv5te/OP_UNUSED_D7FF.S */
10170/* File: armv5te/unused.S */
10171    bl      common_abort
10172
10173
10174/* ------------------------------ */
10175    .balign 64
10176.L_OP_UNUSED_D8FF: /* 0x1d8 */
10177/* File: armv5te/OP_UNUSED_D8FF.S */
10178/* File: armv5te/unused.S */
10179    bl      common_abort
10180
10181
10182/* ------------------------------ */
10183    .balign 64
10184.L_OP_UNUSED_D9FF: /* 0x1d9 */
10185/* File: armv5te/OP_UNUSED_D9FF.S */
10186/* File: armv5te/unused.S */
10187    bl      common_abort
10188
10189
10190/* ------------------------------ */
10191    .balign 64
10192.L_OP_UNUSED_DAFF: /* 0x1da */
10193/* File: armv5te/OP_UNUSED_DAFF.S */
10194/* File: armv5te/unused.S */
10195    bl      common_abort
10196
10197
10198/* ------------------------------ */
10199    .balign 64
10200.L_OP_UNUSED_DBFF: /* 0x1db */
10201/* File: armv5te/OP_UNUSED_DBFF.S */
10202/* File: armv5te/unused.S */
10203    bl      common_abort
10204
10205
10206/* ------------------------------ */
10207    .balign 64
10208.L_OP_UNUSED_DCFF: /* 0x1dc */
10209/* File: armv5te/OP_UNUSED_DCFF.S */
10210/* File: armv5te/unused.S */
10211    bl      common_abort
10212
10213
10214/* ------------------------------ */
10215    .balign 64
10216.L_OP_UNUSED_DDFF: /* 0x1dd */
10217/* File: armv5te/OP_UNUSED_DDFF.S */
10218/* File: armv5te/unused.S */
10219    bl      common_abort
10220
10221
10222/* ------------------------------ */
10223    .balign 64
10224.L_OP_UNUSED_DEFF: /* 0x1de */
10225/* File: armv5te/OP_UNUSED_DEFF.S */
10226/* File: armv5te/unused.S */
10227    bl      common_abort
10228
10229
10230/* ------------------------------ */
10231    .balign 64
10232.L_OP_UNUSED_DFFF: /* 0x1df */
10233/* File: armv5te/OP_UNUSED_DFFF.S */
10234/* File: armv5te/unused.S */
10235    bl      common_abort
10236
10237
10238/* ------------------------------ */
10239    .balign 64
10240.L_OP_UNUSED_E0FF: /* 0x1e0 */
10241/* File: armv5te/OP_UNUSED_E0FF.S */
10242/* File: armv5te/unused.S */
10243    bl      common_abort
10244
10245
10246/* ------------------------------ */
10247    .balign 64
10248.L_OP_UNUSED_E1FF: /* 0x1e1 */
10249/* File: armv5te/OP_UNUSED_E1FF.S */
10250/* File: armv5te/unused.S */
10251    bl      common_abort
10252
10253
10254/* ------------------------------ */
10255    .balign 64
10256.L_OP_UNUSED_E2FF: /* 0x1e2 */
10257/* File: armv5te/OP_UNUSED_E2FF.S */
10258/* File: armv5te/unused.S */
10259    bl      common_abort
10260
10261
10262/* ------------------------------ */
10263    .balign 64
10264.L_OP_UNUSED_E3FF: /* 0x1e3 */
10265/* File: armv5te/OP_UNUSED_E3FF.S */
10266/* File: armv5te/unused.S */
10267    bl      common_abort
10268
10269
10270/* ------------------------------ */
10271    .balign 64
10272.L_OP_UNUSED_E4FF: /* 0x1e4 */
10273/* File: armv5te/OP_UNUSED_E4FF.S */
10274/* File: armv5te/unused.S */
10275    bl      common_abort
10276
10277
10278/* ------------------------------ */
10279    .balign 64
10280.L_OP_UNUSED_E5FF: /* 0x1e5 */
10281/* File: armv5te/OP_UNUSED_E5FF.S */
10282/* File: armv5te/unused.S */
10283    bl      common_abort
10284
10285
10286/* ------------------------------ */
10287    .balign 64
10288.L_OP_UNUSED_E6FF: /* 0x1e6 */
10289/* File: armv5te/OP_UNUSED_E6FF.S */
10290/* File: armv5te/unused.S */
10291    bl      common_abort
10292
10293
10294/* ------------------------------ */
10295    .balign 64
10296.L_OP_UNUSED_E7FF: /* 0x1e7 */
10297/* File: armv5te/OP_UNUSED_E7FF.S */
10298/* File: armv5te/unused.S */
10299    bl      common_abort
10300
10301
10302/* ------------------------------ */
10303    .balign 64
10304.L_OP_UNUSED_E8FF: /* 0x1e8 */
10305/* File: armv5te/OP_UNUSED_E8FF.S */
10306/* File: armv5te/unused.S */
10307    bl      common_abort
10308
10309
10310/* ------------------------------ */
10311    .balign 64
10312.L_OP_UNUSED_E9FF: /* 0x1e9 */
10313/* File: armv5te/OP_UNUSED_E9FF.S */
10314/* File: armv5te/unused.S */
10315    bl      common_abort
10316
10317
10318/* ------------------------------ */
10319    .balign 64
10320.L_OP_UNUSED_EAFF: /* 0x1ea */
10321/* File: armv5te/OP_UNUSED_EAFF.S */
10322/* File: armv5te/unused.S */
10323    bl      common_abort
10324
10325
10326/* ------------------------------ */
10327    .balign 64
10328.L_OP_UNUSED_EBFF: /* 0x1eb */
10329/* File: armv5te/OP_UNUSED_EBFF.S */
10330/* File: armv5te/unused.S */
10331    bl      common_abort
10332
10333
10334/* ------------------------------ */
10335    .balign 64
10336.L_OP_UNUSED_ECFF: /* 0x1ec */
10337/* File: armv5te/OP_UNUSED_ECFF.S */
10338/* File: armv5te/unused.S */
10339    bl      common_abort
10340
10341
10342/* ------------------------------ */
10343    .balign 64
10344.L_OP_UNUSED_EDFF: /* 0x1ed */
10345/* File: armv5te/OP_UNUSED_EDFF.S */
10346/* File: armv5te/unused.S */
10347    bl      common_abort
10348
10349
10350/* ------------------------------ */
10351    .balign 64
10352.L_OP_UNUSED_EEFF: /* 0x1ee */
10353/* File: armv5te/OP_UNUSED_EEFF.S */
10354/* File: armv5te/unused.S */
10355    bl      common_abort
10356
10357
10358/* ------------------------------ */
10359    .balign 64
10360.L_OP_UNUSED_EFFF: /* 0x1ef */
10361/* File: armv5te/OP_UNUSED_EFFF.S */
10362/* File: armv5te/unused.S */
10363    bl      common_abort
10364
10365
10366/* ------------------------------ */
10367    .balign 64
10368.L_OP_UNUSED_F0FF: /* 0x1f0 */
10369/* File: armv5te/OP_UNUSED_F0FF.S */
10370/* File: armv5te/unused.S */
10371    bl      common_abort
10372
10373
10374/* ------------------------------ */
10375    .balign 64
10376.L_OP_UNUSED_F1FF: /* 0x1f1 */
10377/* File: armv5te/OP_UNUSED_F1FF.S */
10378/* File: armv5te/unused.S */
10379    bl      common_abort
10380
10381
10382/* ------------------------------ */
10383    .balign 64
10384.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
10385/* File: armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S */
10386/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
10387    /*
10388     * Invoke Object.<init> on an object.  In practice we know that
10389     * Object's nullary constructor doesn't do anything, so we just
10390     * skip it unless a debugger is active.
10391     */
10392    FETCH(r1, 4)                  @ r1<- CCCC
10393    GET_VREG(r0, r1)                    @ r0<- "this" ptr
10394    cmp     r0, #0                      @ check for NULL
10395    beq     common_errNullObject        @ export PC and throw NPE
10396    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
10397    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
10398    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
10399    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal        @ yes, go
10400.LOP_INVOKE_OBJECT_INIT_JUMBO_finish:
10401    ldrh    r1, [rSELF, #offThread_subMode]
10402    ands    r1, #kSubModeDebuggerActive @ debugger active?
10403    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_debugger        @ Yes - skip optimization
10404    FETCH_ADVANCE_INST(4+1)       @ advance to next instr, load rINST
10405    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
10406    GOTO_OPCODE(ip)                     @ execute it
10407
10408
10409/* ------------------------------ */
10410    .balign 64
10411.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
10412/* File: armv5te/OP_IGET_VOLATILE_JUMBO.S */
10413/* File: armv5te/OP_IGET_JUMBO.S */
10414    /*
10415     * Jumbo 32-bit instance field get.
10416     *
10417     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10418     *      iget-char/jumbo, iget-short/jumbo
10419     */
10420    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10421    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10422    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10423    FETCH(r0, 4)                        @ r0<- CCCC
10424    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10425    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10426    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10427    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10428    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10429    cmp     r0, #0                      @ is resolved entry null?
10430    bne     .LOP_IGET_VOLATILE_JUMBO_finish          @ no, already resolved
104318:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10432    EXPORT_PC()                         @ resolve() could throw
10433    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10434    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10435    b       .LOP_IGET_VOLATILE_JUMBO_resolved        @ resolved, continue
10436
10437
10438/* ------------------------------ */
10439    .balign 64
10440.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
10441/* File: armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S */
10442/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
10443    /*
10444     * Jumbo 64-bit instance field get.
10445     */
10446    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10447    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10448    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10449    FETCH(r0, 4)                        @ r0<- CCCC
10450    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10451    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10452    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10453    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10454    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10455    cmp     r0, #0                      @ is resolved entry null?
10456    bne     .LOP_IGET_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
10457    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10458    EXPORT_PC()                         @ resolve() could throw
10459    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10460    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10461    b       .LOP_IGET_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10462
10463
10464/* ------------------------------ */
10465    .balign 64
10466.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
10467/* File: armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S */
10468/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
10469/* File: armv5te/OP_IGET_JUMBO.S */
10470    /*
10471     * Jumbo 32-bit instance field get.
10472     *
10473     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10474     *      iget-char/jumbo, iget-short/jumbo
10475     */
10476    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10477    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10478    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10479    FETCH(r0, 4)                        @ r0<- CCCC
10480    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10481    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10482    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10483    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10484    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10485    cmp     r0, #0                      @ is resolved entry null?
10486    bne     .LOP_IGET_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
104878:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10488    EXPORT_PC()                         @ resolve() could throw
10489    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10490    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10491    b       .LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10492
10493
10494
10495/* ------------------------------ */
10496    .balign 64
10497.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
10498/* File: armv5te/OP_IPUT_VOLATILE_JUMBO.S */
10499/* File: armv5te/OP_IPUT_JUMBO.S */
10500    /*
10501     * Jumbo 32-bit instance field put.
10502     *
10503     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
10504     *      iput-short/jumbo
10505     */
10506    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10507    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10508    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10509    FETCH(r0, 4)                        @ r0<- CCCC
10510    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10511    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10512    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10513    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10514    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10515    cmp     r0, #0                      @ is resolved entry null?
10516    bne     .LOP_IPUT_VOLATILE_JUMBO_finish          @ no, already resolved
105178:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10518    EXPORT_PC()                         @ resolve() could throw
10519    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10520    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10521    b       .LOP_IPUT_VOLATILE_JUMBO_resolved        @ resolved, continue
10522
10523
10524/* ------------------------------ */
10525    .balign 64
10526.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
10527/* File: armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S */
10528/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
10529    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10530    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10531    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10532    FETCH(r0, 4)                        @ r0<- CCCC
10533    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10534    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10535    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10536    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
10537    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10538    cmp     r0, #0                      @ is resolved entry null?
10539    bne     .LOP_IPUT_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
105408:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10541    EXPORT_PC()                         @ resolve() could throw
10542    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10543    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10544    b       .LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10545
10546
10547/* ------------------------------ */
10548    .balign 64
10549.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
10550/* File: armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S */
10551/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
10552    /*
10553     * Jumbo 32-bit instance field put.
10554     */
10555    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10556    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10557    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10558    FETCH(r0, 4)                        @ r0<- CCCC
10559    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10560    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10561    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10562    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10563    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10564    cmp     r0, #0                      @ is resolved entry null?
10565    bne     .LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
105668:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10567    EXPORT_PC()                         @ resolve() could throw
10568    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10569    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10570    b       .LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10571
10572
10573/* ------------------------------ */
10574    .balign 64
10575.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
10576/* File: armv5te/OP_SGET_VOLATILE_JUMBO.S */
10577/* File: armv5te/OP_SGET_JUMBO.S */
10578    /*
10579     * Jumbo 32-bit SGET handler.
10580     *
10581     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
10582     *      sget-char/jumbo, sget-short/jumbo
10583     */
10584    /* exop vBBBB, field@AAAAAAAA */
10585    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10586    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10587    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10588    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10589    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10590    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10591    cmp     r0, #0                      @ is resolved entry null?
10592    beq     .LOP_SGET_VOLATILE_JUMBO_resolve         @ yes, do resolve
10593.LOP_SGET_VOLATILE_JUMBO_finish: @ field ptr in r0
10594    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
10595    SMP_DMB                            @ acquiring load
10596    FETCH(r2, 3)                        @ r2<- BBBB
10597    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10598    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
10599    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10600    GOTO_OPCODE(ip)                     @ jump to next instruction
10601
10602
10603/* ------------------------------ */
10604    .balign 64
10605.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
10606/* File: armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S */
10607/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
10608    /*
10609     * Jumbo 64-bit SGET handler.
10610     */
10611    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
10612    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10613    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10614    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10615    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
10616    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10617    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
10618    cmp     r0, #0                      @ is resolved entry null?
10619    beq     .LOP_SGET_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
10620.LOP_SGET_WIDE_VOLATILE_JUMBO_finish:
10621    FETCH(r9, 3)                        @ r9<- BBBB
10622    .if 1
10623    add     r0, r0, #offStaticField_value @ r0<- pointer to data
10624    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
10625    .else
10626    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
10627    .endif
10628    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
10629    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10630    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
10631    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10632    GOTO_OPCODE(ip)                     @ jump to next instruction
10633
10634
10635/* ------------------------------ */
10636    .balign 64
10637.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
10638/* File: armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S */
10639/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
10640/* File: armv5te/OP_SGET_JUMBO.S */
10641    /*
10642     * Jumbo 32-bit SGET handler.
10643     *
10644     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
10645     *      sget-char/jumbo, sget-short/jumbo
10646     */
10647    /* exop vBBBB, field@AAAAAAAA */
10648    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10649    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10650    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10651    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10652    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10653    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10654    cmp     r0, #0                      @ is resolved entry null?
10655    beq     .LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10656.LOP_SGET_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
10657    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
10658    SMP_DMB                            @ acquiring load
10659    FETCH(r2, 3)                        @ r2<- BBBB
10660    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10661    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
10662    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10663    GOTO_OPCODE(ip)                     @ jump to next instruction
10664
10665
10666
10667/* ------------------------------ */
10668    .balign 64
10669.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
10670/* File: armv5te/OP_SPUT_VOLATILE_JUMBO.S */
10671/* File: armv5te/OP_SPUT_JUMBO.S */
10672    /*
10673     * Jumbo 32-bit SPUT handler.
10674     *
10675     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
10676     *      sput-short/jumbo
10677     */
10678    /* exop vBBBB, field@AAAAAAAA */
10679    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10680    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10681    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10682    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10683    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10684    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
10685    cmp     r0, #0                      @ is resolved entry null?
10686    beq     .LOP_SPUT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10687.LOP_SPUT_VOLATILE_JUMBO_finish:   @ field ptr in r0
10688    FETCH(r2, 3)                        @ r2<- BBBB
10689    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10690    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
10691    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10692    SMP_DMB_ST                        @ releasing store
10693    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
10694    SMP_DMB
10695    GOTO_OPCODE(ip)                     @ jump to next instruction
10696
10697
10698/* ------------------------------ */
10699    .balign 64
10700.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
10701/* File: armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S */
10702/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
10703    /*
10704     * Jumbo 64-bit SPUT handler.
10705     */
10706    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
10707    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
10708    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10709    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10710    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10711    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10712    FETCH(r9, 3)                        @ r9<- BBBB
10713    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
10714    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
10715    cmp     r2, #0                      @ is resolved entry null?
10716    beq     .LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
10717.LOP_SPUT_WIDE_VOLATILE_JUMBO_finish: @ field ptr in r2, BBBB in r9
10718    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10719    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
10720    GET_INST_OPCODE(r10)                @ extract opcode from rINST
10721    .if 1
10722    add     r2, r2, #offStaticField_value @ r2<- pointer to data
10723    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
10724    .else
10725    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
10726    .endif
10727    GOTO_OPCODE(r10)                    @ jump to next instruction
10728
10729
10730/* ------------------------------ */
10731    .balign 64
10732.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
10733/* File: armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S */
10734/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
10735    /*
10736     * Jumbo 32-bit SPUT handler for objects
10737     */
10738    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
10739    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10740    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10741    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10742    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10743    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10744    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10745    cmp     r0, #0                      @ is resolved entry null?
10746    beq     .LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10747.LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish:   @ field ptr in r0
10748    FETCH(r2, 3)                        @ r2<- BBBB
10749    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10750    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
10751    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
10752    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
10753    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10754    SMP_DMB_ST                        @ releasing store
10755    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_end
10756
10757
10758/* ------------------------------ */
10759    .balign 64
10760.L_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
10761/* File: armv5te/OP_THROW_VERIFICATION_ERROR_JUMBO.S */
10762    /*
10763     * Handle a jumbo throw-verification-error instruction.  This throws an
10764     * exception for an error discovered during verification.  The
10765     * exception is indicated by BBBB, with some detail provided by AAAAAAAA.
10766     */
10767    /* exop BBBB, Class@AAAAAAAA */
10768    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10769    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10770    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
10771    orr     r2, r1, r2, lsl #16         @ r2<- AAAAaaaa
10772    EXPORT_PC()                         @ export the PC
10773    FETCH(r1, 3)                        @ r1<- BBBB
10774    bl      dvmThrowVerificationError   @ always throws
10775    b       common_exceptionThrown      @ handle exception
10776
10777    .balign 64
10778    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
10779    .global dvmAsmInstructionEnd
10780dvmAsmInstructionEnd:
10781
10782/*
10783 * ===========================================================================
10784 *  Sister implementations
10785 * ===========================================================================
10786 */
10787    .global dvmAsmSisterStart
10788    .type   dvmAsmSisterStart, %function
10789    .text
10790    .balign 4
10791dvmAsmSisterStart:
10792
10793/* continuation for OP_CONST_STRING */
10794
10795    /*
10796     * Continuation if the String has not yet been resolved.
10797     *  r1: BBBB (String ref)
10798     *  r9: target register
10799     */
10800.LOP_CONST_STRING_resolve:
10801    EXPORT_PC()
10802    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10803    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10804    bl      dvmResolveString            @ r0<- String reference
10805    cmp     r0, #0                      @ failed?
10806    beq     common_exceptionThrown      @ yup, handle the exception
10807    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10808    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10809    SET_VREG(r0, r9)                    @ vAA<- r0
10810    GOTO_OPCODE(ip)                     @ jump to next instruction
10811
10812/* continuation for OP_CONST_STRING_JUMBO */
10813
10814    /*
10815     * Continuation if the String has not yet been resolved.
10816     *  r1: BBBBBBBB (String ref)
10817     *  r9: target register
10818     */
10819.LOP_CONST_STRING_JUMBO_resolve:
10820    EXPORT_PC()
10821    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10822    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10823    bl      dvmResolveString            @ r0<- String reference
10824    cmp     r0, #0                      @ failed?
10825    beq     common_exceptionThrown      @ yup, handle the exception
10826    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
10827    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10828    SET_VREG(r0, r9)                    @ vAA<- r0
10829    GOTO_OPCODE(ip)                     @ jump to next instruction
10830
10831/* continuation for OP_CONST_CLASS */
10832
10833    /*
10834     * Continuation if the Class has not yet been resolved.
10835     *  r1: BBBB (Class ref)
10836     *  r9: target register
10837     */
10838.LOP_CONST_CLASS_resolve:
10839    EXPORT_PC()
10840    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10841    mov     r2, #1                      @ r2<- true
10842    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10843    bl      dvmResolveClass             @ r0<- Class reference
10844    cmp     r0, #0                      @ failed?
10845    beq     common_exceptionThrown      @ yup, handle the exception
10846    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10847    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10848    SET_VREG(r0, r9)                    @ vAA<- r0
10849    GOTO_OPCODE(ip)                     @ jump to next instruction
10850
10851/* continuation for OP_CHECK_CAST */
10852
10853    /*
10854     * Trivial test failed, need to perform full check.  This is common.
10855     *  r0 holds obj->clazz
10856     *  r1 holds desired class resolved from BBBB
10857     *  r9 holds object
10858     */
10859.LOP_CHECK_CAST_fullcheck:
10860    mov     r10, r1                     @ avoid ClassObject getting clobbered
10861    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
10862    cmp     r0, #0                      @ failed?
10863    bne     .LOP_CHECK_CAST_okay            @ no, success
10864
10865    @ A cast has failed.  We need to throw a ClassCastException.
10866    EXPORT_PC()                         @ about to throw
10867    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
10868    mov     r1, r10                     @ r1<- desired class
10869    bl      dvmThrowClassCastException
10870    b       common_exceptionThrown
10871
10872    /*
10873     * Resolution required.  This is the least-likely path.
10874     *
10875     *  r2 holds BBBB
10876     *  r9 holds object
10877     */
10878.LOP_CHECK_CAST_resolve:
10879    EXPORT_PC()                         @ resolve() could throw
10880    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
10881    mov     r1, r2                      @ r1<- BBBB
10882    mov     r2, #0                      @ r2<- false
10883    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
10884    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
10885    cmp     r0, #0                      @ got null?
10886    beq     common_exceptionThrown      @ yes, handle exception
10887    mov     r1, r0                      @ r1<- class resolved from BBB
10888    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
10889    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
10890
10891/* continuation for OP_INSTANCE_OF */
10892
10893    /*
10894     * Trivial test failed, need to perform full check.  This is common.
10895     *  r0 holds obj->clazz
10896     *  r1 holds class resolved from BBBB
10897     *  r9 holds A
10898     */
10899.LOP_INSTANCE_OF_fullcheck:
10900    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
10901    @ fall through to OP_INSTANCE_OF_store
10902
10903    /*
10904     * r0 holds boolean result
10905     * r9 holds A
10906     */
10907.LOP_INSTANCE_OF_store:
10908    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10909    SET_VREG(r0, r9)                    @ vA<- r0
10910    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10911    GOTO_OPCODE(ip)                     @ jump to next instruction
10912
10913    /*
10914     * Trivial test succeeded, save and bail.
10915     *  r9 holds A
10916     */
10917.LOP_INSTANCE_OF_trivial:
10918    mov     r0, #1                      @ indicate success
10919    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
10920    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10921    SET_VREG(r0, r9)                    @ vA<- r0
10922    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10923    GOTO_OPCODE(ip)                     @ jump to next instruction
10924
10925    /*
10926     * Resolution required.  This is the least-likely path.
10927     *
10928     *  r3 holds BBBB
10929     *  r9 holds A
10930     */
10931.LOP_INSTANCE_OF_resolve:
10932    EXPORT_PC()                         @ resolve() could throw
10933    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
10934    mov     r1, r3                      @ r1<- BBBB
10935    mov     r2, #1                      @ r2<- true
10936    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10937    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
10938    cmp     r0, #0                      @ got null?
10939    beq     common_exceptionThrown      @ yes, handle exception
10940    mov     r1, r0                      @ r1<- class resolved from BBB
10941    mov     r3, rINST, lsr #12          @ r3<- B
10942    GET_VREG(r0, r3)                    @ r0<- vB (object)
10943    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
10944    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
10945
10946/* continuation for OP_NEW_INSTANCE */
10947
10948    .balign 32                          @ minimize cache lines
10949.LOP_NEW_INSTANCE_finish: @ r0=new object
10950    mov     r3, rINST, lsr #8           @ r3<- AA
10951    cmp     r0, #0                      @ failed?
10952#if defined(WITH_JIT)
10953    /*
10954     * The JIT needs the class to be fully resolved before it can
10955     * include this instruction in a trace.
10956     */
10957    ldrh    r1, [rSELF, #offThread_subMode]
10958    beq     common_exceptionThrown      @ yes, handle the exception
10959    ands    r1, #kSubModeJitTraceBuild  @ under construction?
10960    bne     .LOP_NEW_INSTANCE_jitCheck
10961#else
10962    beq     common_exceptionThrown      @ yes, handle the exception
10963#endif
10964.LOP_NEW_INSTANCE_end:
10965    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10966    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10967    SET_VREG(r0, r3)                    @ vAA<- r0
10968    GOTO_OPCODE(ip)                     @ jump to next instruction
10969
10970#if defined(WITH_JIT)
10971    /*
10972     * Check to see if we need to stop the trace building early.
10973     * r0: new object
10974     * r3: vAA
10975     */
10976.LOP_NEW_INSTANCE_jitCheck:
10977    ldr     r1, [r10]                   @ reload resolved class
10978    cmp     r1, #0                      @ okay?
10979    bne     .LOP_NEW_INSTANCE_end             @ yes, finish
10980    mov     r9, r0                      @ preserve new object
10981    mov     r10, r3                     @ preserve vAA
10982    mov     r0, rSELF
10983    mov     r1, rPC
10984    bl      dvmJitEndTraceSelect        @ (self, pc)
10985    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10986    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10987    SET_VREG(r9, r10)                   @ vAA<- new object
10988    GOTO_OPCODE(ip)                     @ jump to next instruction
10989#endif
10990
10991    /*
10992     * Class initialization required.
10993     *
10994     *  r0 holds class object
10995     */
10996.LOP_NEW_INSTANCE_needinit:
10997    mov     r9, r0                      @ save r0
10998    bl      dvmInitClass                @ initialize class
10999    cmp     r0, #0                      @ check boolean result
11000    mov     r0, r9                      @ restore r0
11001    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
11002    b       common_exceptionThrown      @ failed, deal with init exception
11003
11004    /*
11005     * Resolution required.  This is the least-likely path.
11006     *
11007     *  r1 holds BBBB
11008     */
11009.LOP_NEW_INSTANCE_resolve:
11010    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11011    mov     r2, #0                      @ r2<- false
11012    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11013    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
11014    cmp     r0, #0                      @ got null?
11015    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
11016    b       common_exceptionThrown      @ yes, handle exception
11017
11018/* continuation for OP_NEW_ARRAY */
11019
11020
11021    /*
11022     * Resolve class.  (This is an uncommon case.)
11023     *
11024     *  r1 holds array length
11025     *  r2 holds class ref CCCC
11026     */
11027.LOP_NEW_ARRAY_resolve:
11028    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11029    mov     r9, r1                      @ r9<- length (save)
11030    mov     r1, r2                      @ r1<- CCCC
11031    mov     r2, #0                      @ r2<- false
11032    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11033    bl      dvmResolveClass             @ r0<- call(clazz, ref)
11034    cmp     r0, #0                      @ got null?
11035    mov     r1, r9                      @ r1<- length (restore)
11036    beq     common_exceptionThrown      @ yes, handle exception
11037    @ fall through to OP_NEW_ARRAY_finish
11038
11039    /*
11040     * Finish allocation.
11041     *
11042     *  r0 holds class
11043     *  r1 holds array length
11044     */
11045.LOP_NEW_ARRAY_finish:
11046    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
11047    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
11048    cmp     r0, #0                      @ failed?
11049    mov     r2, rINST, lsr #8           @ r2<- A+
11050    beq     common_exceptionThrown      @ yes, handle the exception
11051    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11052    and     r2, r2, #15                 @ r2<- A
11053    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11054    SET_VREG(r0, r2)                    @ vA<- r0
11055    GOTO_OPCODE(ip)                     @ jump to next instruction
11056
11057/* continuation for OP_FILLED_NEW_ARRAY */
11058
11059    /*
11060     * On entry:
11061     *  r0 holds array class
11062     *  r10 holds AA or BA
11063     */
11064.LOP_FILLED_NEW_ARRAY_continue:
11065    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11066    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11067    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11068    .if     0
11069    mov     r1, r10                     @ r1<- AA (length)
11070    .else
11071    mov     r1, r10, lsr #4             @ r1<- B (length)
11072    .endif
11073    cmp     rINST, #'I'                 @ array of ints?
11074    cmpne   rINST, #'L'                 @ array of objects?
11075    cmpne   rINST, #'['                 @ array of arrays?
11076    mov     r9, r1                      @ save length in r9
11077    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
11078    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11079    cmp     r0, #0                      @ null return?
11080    beq     common_exceptionThrown      @ alloc failed, handle exception
11081
11082    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11083    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11084    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11085    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11086    subs    r9, r9, #1                  @ length--, check for neg
11087    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11088    bmi     2f                          @ was zero, bail
11089
11090    @ copy values from registers into the array
11091    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11092    .if     0
11093    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
110941:  ldr     r3, [r2], #4                @ r3<- *r2++
11095    subs    r9, r9, #1                  @ count--
11096    str     r3, [r0], #4                @ *contents++ = vX
11097    bpl     1b
11098    @ continue at 2
11099    .else
11100    cmp     r9, #4                      @ length was initially 5?
11101    and     r2, r10, #15                @ r2<- A
11102    bne     1f                          @ <= 4 args, branch
11103    GET_VREG(r3, r2)                    @ r3<- vA
11104    sub     r9, r9, #1                  @ count--
11105    str     r3, [r0, #16]               @ contents[4] = vA
111061:  and     r2, r1, #15                 @ r2<- F/E/D/C
11107    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11108    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11109    subs    r9, r9, #1                  @ count--
11110    str     r3, [r0], #4                @ *contents++ = vX
11111    bpl     1b
11112    @ continue at 2
11113    .endif
11114
111152:
11116    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11117    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11118    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11119    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11120    cmp     r1, #'I'                         @ Is int array?
11121    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11122    GOTO_OPCODE(ip)                          @ execute it
11123
11124    /*
11125     * Throw an exception indicating that we have not implemented this
11126     * mode of filled-new-array.
11127     */
11128.LOP_FILLED_NEW_ARRAY_notimpl:
11129    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY
11130    bl      dvmThrowInternalError
11131    b       common_exceptionThrown
11132
11133    /*
11134     * Ideally we'd only define this once, but depending on layout we can
11135     * exceed the range of the load above.
11136     */
11137
11138.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY:
11139    .word   .LstrFilledNewArrayNotImpl
11140
11141/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
11142
11143    /*
11144     * On entry:
11145     *  r0 holds array class
11146     *  r10 holds AA or BA
11147     */
11148.LOP_FILLED_NEW_ARRAY_RANGE_continue:
11149    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11150    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11151    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11152    .if     1
11153    mov     r1, r10                     @ r1<- AA (length)
11154    .else
11155    mov     r1, r10, lsr #4             @ r1<- B (length)
11156    .endif
11157    cmp     rINST, #'I'                 @ array of ints?
11158    cmpne   rINST, #'L'                 @ array of objects?
11159    cmpne   rINST, #'['                 @ array of arrays?
11160    mov     r9, r1                      @ save length in r9
11161    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
11162    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11163    cmp     r0, #0                      @ null return?
11164    beq     common_exceptionThrown      @ alloc failed, handle exception
11165
11166    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11167    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11168    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11169    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11170    subs    r9, r9, #1                  @ length--, check for neg
11171    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11172    bmi     2f                          @ was zero, bail
11173
11174    @ copy values from registers into the array
11175    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11176    .if     1
11177    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
111781:  ldr     r3, [r2], #4                @ r3<- *r2++
11179    subs    r9, r9, #1                  @ count--
11180    str     r3, [r0], #4                @ *contents++ = vX
11181    bpl     1b
11182    @ continue at 2
11183    .else
11184    cmp     r9, #4                      @ length was initially 5?
11185    and     r2, r10, #15                @ r2<- A
11186    bne     1f                          @ <= 4 args, branch
11187    GET_VREG(r3, r2)                    @ r3<- vA
11188    sub     r9, r9, #1                  @ count--
11189    str     r3, [r0, #16]               @ contents[4] = vA
111901:  and     r2, r1, #15                 @ r2<- F/E/D/C
11191    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11192    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11193    subs    r9, r9, #1                  @ count--
11194    str     r3, [r0], #4                @ *contents++ = vX
11195    bpl     1b
11196    @ continue at 2
11197    .endif
11198
111992:
11200    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11201    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11202    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11203    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11204    cmp     r1, #'I'                         @ Is int array?
11205    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11206    GOTO_OPCODE(ip)                          @ execute it
11207
11208    /*
11209     * Throw an exception indicating that we have not implemented this
11210     * mode of filled-new-array.
11211     */
11212.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
11213    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE
11214    bl      dvmThrowInternalError
11215    b       common_exceptionThrown
11216
11217    /*
11218     * Ideally we'd only define this once, but depending on layout we can
11219     * exceed the range of the load above.
11220     */
11221
11222.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE:
11223    .word   .LstrFilledNewArrayNotImpl
11224
11225/* continuation for OP_CMPL_FLOAT */
11226.LOP_CMPL_FLOAT_finish:
11227    SET_VREG(r0, r9)                    @ vAA<- r0
11228    GOTO_OPCODE(ip)                     @ jump to next instruction
11229
11230/* continuation for OP_CMPG_FLOAT */
11231.LOP_CMPG_FLOAT_finish:
11232    SET_VREG(r0, r9)                    @ vAA<- r0
11233    GOTO_OPCODE(ip)                     @ jump to next instruction
11234
11235/* continuation for OP_CMPL_DOUBLE */
11236.LOP_CMPL_DOUBLE_finish:
11237    SET_VREG(r0, r9)                    @ vAA<- r0
11238    GOTO_OPCODE(ip)                     @ jump to next instruction
11239
11240/* continuation for OP_CMPG_DOUBLE */
11241.LOP_CMPG_DOUBLE_finish:
11242    SET_VREG(r0, r9)                    @ vAA<- r0
11243    GOTO_OPCODE(ip)                     @ jump to next instruction
11244
11245/* continuation for OP_CMP_LONG */
11246
11247.LOP_CMP_LONG_less:
11248    mvn     r1, #0                      @ r1<- -1
11249    @ Want to cond code the next mov so we can avoid branch, but don't see it;
11250    @ instead, we just replicate the tail end.
11251    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11252    SET_VREG(r1, r9)                    @ vAA<- r1
11253    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11254    GOTO_OPCODE(ip)                     @ jump to next instruction
11255
11256.LOP_CMP_LONG_greater:
11257    mov     r1, #1                      @ r1<- 1
11258    @ fall through to _finish
11259
11260.LOP_CMP_LONG_finish:
11261    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11262    SET_VREG(r1, r9)                    @ vAA<- r1
11263    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11264    GOTO_OPCODE(ip)                     @ jump to next instruction
11265
11266/* continuation for OP_AGET_WIDE */
11267
11268.LOP_AGET_WIDE_finish:
11269    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11270    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11271    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
11272    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11273    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
11274    GOTO_OPCODE(ip)                     @ jump to next instruction
11275
11276/* continuation for OP_APUT_WIDE */
11277
11278.LOP_APUT_WIDE_finish:
11279    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11280    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
11281    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11282    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11283    GOTO_OPCODE(ip)                     @ jump to next instruction
11284
11285/* continuation for OP_APUT_OBJECT */
11286    /*
11287     * On entry:
11288     *  rINST = vBB (arrayObj)
11289     *  r9 = vAA (obj)
11290     *  r10 = offset into array (vBB + vCC * width)
11291     */
11292.LOP_APUT_OBJECT_finish:
11293    cmp     r9, #0                      @ storing null reference?
11294    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
11295    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
11296    ldr     r1, [rINST, #offObject_clazz]  @ r1<- arrayObj->clazz
11297    bl      dvmCanPutArrayElement       @ test object type vs. array type
11298    cmp     r0, #0                      @ okay?
11299    beq     .LOP_APUT_OBJECT_throw           @ no
11300    mov     r1, rINST                   @ r1<- arrayObj
11301    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11302    ldr     r2, [rSELF, #offThread_cardTable]     @ get biased CT base
11303    add     r10, #offArrayObject_contents   @ r0<- pointer to slot
11304    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11305    str     r9, [r10]                   @ vBB[vCC]<- vAA
11306    strb    r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
11307    GOTO_OPCODE(ip)                     @ jump to next instruction
11308.LOP_APUT_OBJECT_skip_check:
11309    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11310    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11311    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
11312    GOTO_OPCODE(ip)                     @ jump to next instruction
11313.LOP_APUT_OBJECT_throw:
11314    @ The types don't match.  We need to throw an ArrayStoreException.
11315    ldr     r0, [r9, #offObject_clazz]
11316    ldr     r1, [rINST, #offObject_clazz]
11317    EXPORT_PC()
11318    bl      dvmThrowArrayStoreExceptionIncompatibleElement
11319    b       common_exceptionThrown
11320
11321/* continuation for OP_IGET */
11322
11323    /*
11324     * Currently:
11325     *  r0 holds resolved field
11326     *  r9 holds object
11327     */
11328.LOP_IGET_finish:
11329    @bl      common_squeak0
11330    cmp     r9, #0                      @ check object for null
11331    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11332    beq     common_errNullObject        @ object was null
11333    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11334    ubfx    r2, rINST, #8, #4           @ r2<- A
11335    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11336    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11337    SET_VREG(r0, r2)                    @ fp[A]<- r0
11338    GOTO_OPCODE(ip)                     @ jump to next instruction
11339
11340/* continuation for OP_IGET_WIDE */
11341
11342    /*
11343     * Currently:
11344     *  r0 holds resolved field
11345     *  r9 holds object
11346     */
11347.LOP_IGET_WIDE_finish:
11348    cmp     r9, #0                      @ check object for null
11349    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11350    beq     common_errNullObject        @ object was null
11351    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
11352    ubfx    r2, rINST, #8, #4           @ r2<- A
11353    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11354    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
11355    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11356    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
11357    GOTO_OPCODE(ip)                     @ jump to next instruction
11358
11359/* continuation for OP_IGET_OBJECT */
11360
11361    /*
11362     * Currently:
11363     *  r0 holds resolved field
11364     *  r9 holds object
11365     */
11366.LOP_IGET_OBJECT_finish:
11367    @bl      common_squeak0
11368    cmp     r9, #0                      @ check object for null
11369    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11370    beq     common_errNullObject        @ object was null
11371    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11372    @ no-op                             @ acquiring load
11373    mov     r2, rINST, lsr #8           @ r2<- A+
11374    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11375    and     r2, r2, #15                 @ r2<- A
11376    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11377    SET_VREG(r0, r2)                    @ fp[A]<- r0
11378    GOTO_OPCODE(ip)                     @ jump to next instruction
11379
11380/* continuation for OP_IGET_BOOLEAN */
11381
11382    /*
11383     * Currently:
11384     *  r0 holds resolved field
11385     *  r9 holds object
11386     */
11387.LOP_IGET_BOOLEAN_finish:
11388    @bl      common_squeak1
11389    cmp     r9, #0                      @ check object for null
11390    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11391    beq     common_errNullObject        @ object was null
11392    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11393    @ no-op                             @ acquiring load
11394    mov     r2, rINST, lsr #8           @ r2<- A+
11395    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11396    and     r2, r2, #15                 @ r2<- A
11397    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11398    SET_VREG(r0, r2)                    @ fp[A]<- r0
11399    GOTO_OPCODE(ip)                     @ jump to next instruction
11400
11401/* continuation for OP_IGET_BYTE */
11402
11403    /*
11404     * Currently:
11405     *  r0 holds resolved field
11406     *  r9 holds object
11407     */
11408.LOP_IGET_BYTE_finish:
11409    @bl      common_squeak2
11410    cmp     r9, #0                      @ check object for null
11411    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11412    beq     common_errNullObject        @ object was null
11413    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11414    @ no-op                             @ acquiring load
11415    mov     r2, rINST, lsr #8           @ r2<- A+
11416    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11417    and     r2, r2, #15                 @ r2<- A
11418    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11419    SET_VREG(r0, r2)                    @ fp[A]<- r0
11420    GOTO_OPCODE(ip)                     @ jump to next instruction
11421
11422/* continuation for OP_IGET_CHAR */
11423
11424    /*
11425     * Currently:
11426     *  r0 holds resolved field
11427     *  r9 holds object
11428     */
11429.LOP_IGET_CHAR_finish:
11430    @bl      common_squeak3
11431    cmp     r9, #0                      @ check object for null
11432    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11433    beq     common_errNullObject        @ object was null
11434    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11435    @ no-op                             @ acquiring load
11436    mov     r2, rINST, lsr #8           @ r2<- A+
11437    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11438    and     r2, r2, #15                 @ r2<- A
11439    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11440    SET_VREG(r0, r2)                    @ fp[A]<- r0
11441    GOTO_OPCODE(ip)                     @ jump to next instruction
11442
11443/* continuation for OP_IGET_SHORT */
11444
11445    /*
11446     * Currently:
11447     *  r0 holds resolved field
11448     *  r9 holds object
11449     */
11450.LOP_IGET_SHORT_finish:
11451    @bl      common_squeak4
11452    cmp     r9, #0                      @ check object for null
11453    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11454    beq     common_errNullObject        @ object was null
11455    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11456    @ no-op                             @ acquiring load
11457    mov     r2, rINST, lsr #8           @ r2<- A+
11458    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11459    and     r2, r2, #15                 @ r2<- A
11460    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11461    SET_VREG(r0, r2)                    @ fp[A]<- r0
11462    GOTO_OPCODE(ip)                     @ jump to next instruction
11463
11464/* continuation for OP_IPUT */
11465
11466    /*
11467     * Currently:
11468     *  r0 holds resolved field
11469     *  r9 holds object
11470     */
11471.LOP_IPUT_finish:
11472    @bl      common_squeak0
11473    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11474    ubfx    r1, rINST, #8, #4           @ r1<- A
11475    cmp     r9, #0                      @ check object for null
11476    GET_VREG(r0, r1)                    @ r0<- fp[A]
11477    beq     common_errNullObject        @ object was null
11478    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11479    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11480    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11481    GOTO_OPCODE(ip)                     @ jump to next instruction
11482
11483/* continuation for OP_IPUT_WIDE */
11484
11485    /*
11486     * Currently:
11487     *  r0 holds resolved field
11488     *  r9 holds object
11489     */
11490.LOP_IPUT_WIDE_finish:
11491    ubfx    r2, rINST, #8, #4           @ r2<- A
11492    cmp     r9, #0                      @ check object for null
11493    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11494    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
11495    beq     common_errNullObject        @ object was null
11496    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11497    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
11498    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11499    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0
11500    GOTO_OPCODE(ip)                     @ jump to next instruction
11501
11502/* continuation for OP_IPUT_OBJECT */
11503
11504    /*
11505     * Currently:
11506     *  r0 holds resolved field
11507     *  r9 holds object
11508     */
11509.LOP_IPUT_OBJECT_finish:
11510    @bl      common_squeak0
11511    mov     r1, rINST, lsr #8           @ r1<- A+
11512    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11513    and     r1, r1, #15                 @ r1<- A
11514    cmp     r9, #0                      @ check object for null
11515    GET_VREG(r0, r1)                    @ r0<- fp[A]
11516    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11517    beq     common_errNullObject        @ object was null
11518    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11519    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11520    @ no-op                         @ releasing store
11521    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
11522    @ no-op
11523    cmp     r0, #0                      @ stored a null reference?
11524    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
11525    GOTO_OPCODE(ip)                     @ jump to next instruction
11526
11527/* continuation for OP_IPUT_BOOLEAN */
11528
11529    /*
11530     * Currently:
11531     *  r0 holds resolved field
11532     *  r9 holds object
11533     */
11534.LOP_IPUT_BOOLEAN_finish:
11535    @bl      common_squeak1
11536    mov     r1, rINST, lsr #8           @ r1<- A+
11537    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11538    and     r1, r1, #15                 @ r1<- A
11539    cmp     r9, #0                      @ check object for null
11540    GET_VREG(r0, r1)                    @ r0<- fp[A]
11541    beq     common_errNullObject        @ object was null
11542    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11543    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11544    @ no-op                         @ releasing store
11545    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11546    @ no-op
11547    GOTO_OPCODE(ip)                     @ jump to next instruction
11548
11549/* continuation for OP_IPUT_BYTE */
11550
11551    /*
11552     * Currently:
11553     *  r0 holds resolved field
11554     *  r9 holds object
11555     */
11556.LOP_IPUT_BYTE_finish:
11557    @bl      common_squeak2
11558    mov     r1, rINST, lsr #8           @ r1<- A+
11559    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11560    and     r1, r1, #15                 @ r1<- A
11561    cmp     r9, #0                      @ check object for null
11562    GET_VREG(r0, r1)                    @ r0<- fp[A]
11563    beq     common_errNullObject        @ object was null
11564    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11565    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11566    @ no-op                         @ releasing store
11567    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11568    @ no-op
11569    GOTO_OPCODE(ip)                     @ jump to next instruction
11570
11571/* continuation for OP_IPUT_CHAR */
11572
11573    /*
11574     * Currently:
11575     *  r0 holds resolved field
11576     *  r9 holds object
11577     */
11578.LOP_IPUT_CHAR_finish:
11579    @bl      common_squeak3
11580    mov     r1, rINST, lsr #8           @ r1<- A+
11581    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11582    and     r1, r1, #15                 @ r1<- A
11583    cmp     r9, #0                      @ check object for null
11584    GET_VREG(r0, r1)                    @ r0<- fp[A]
11585    beq     common_errNullObject        @ object was null
11586    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11587    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11588    @ no-op                         @ releasing store
11589    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11590    @ no-op
11591    GOTO_OPCODE(ip)                     @ jump to next instruction
11592
11593/* continuation for OP_IPUT_SHORT */
11594
11595    /*
11596     * Currently:
11597     *  r0 holds resolved field
11598     *  r9 holds object
11599     */
11600.LOP_IPUT_SHORT_finish:
11601    @bl      common_squeak4
11602    mov     r1, rINST, lsr #8           @ r1<- A+
11603    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11604    and     r1, r1, #15                 @ r1<- A
11605    cmp     r9, #0                      @ check object for null
11606    GET_VREG(r0, r1)                    @ r0<- fp[A]
11607    beq     common_errNullObject        @ object was null
11608    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11609    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11610    @ no-op                         @ releasing store
11611    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11612    @ no-op
11613    GOTO_OPCODE(ip)                     @ jump to next instruction
11614
11615/* continuation for OP_SGET */
11616
11617    /*
11618     * Continuation if the field has not yet been resolved.
11619     *  r1:  BBBB field ref
11620     *  r10: dvmDex->pResFields
11621     */
11622.LOP_SGET_resolve:
11623    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11624#if defined(WITH_JIT)
11625    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11626#endif
11627    EXPORT_PC()                         @ resolve() could throw, so export now
11628    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11629    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11630    cmp     r0, #0                      @ success?
11631    beq     common_exceptionThrown      @ no, handle exception
11632#if defined(WITH_JIT)
11633    /*
11634     * If the JIT is actively building a trace we need to make sure
11635     * that the field is fully resolved before including this instruction.
11636     */
11637    bl      common_verifyField
11638#endif
11639    b       .LOP_SGET_finish
11640
11641/* continuation for OP_SGET_WIDE */
11642
11643    /*
11644     * Continuation if the field has not yet been resolved.
11645     *  r1:  BBBB field ref
11646     *  r10: dvmDex->pResFields
11647     *
11648     * Returns StaticField pointer in r0.
11649     */
11650.LOP_SGET_WIDE_resolve:
11651    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11652#if defined(WITH_JIT)
11653    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
11654#endif
11655    EXPORT_PC()                         @ resolve() could throw, so export now
11656    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11657    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11658    cmp     r0, #0                      @ success?
11659    beq     common_exceptionThrown      @ no, handle exception
11660#if defined(WITH_JIT)
11661    /*
11662     * If the JIT is actively building a trace we need to make sure
11663     * that the field is fully resolved before including this instruction.
11664     */
11665    bl      common_verifyField
11666#endif
11667    b       .LOP_SGET_WIDE_finish          @ resume
11668
11669/* continuation for OP_SGET_OBJECT */
11670
11671    /*
11672     * Continuation if the field has not yet been resolved.
11673     *  r1:  BBBB field ref
11674     *  r10: dvmDex->pResFields
11675     */
11676.LOP_SGET_OBJECT_resolve:
11677    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11678#if defined(WITH_JIT)
11679    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11680#endif
11681    EXPORT_PC()                         @ resolve() could throw, so export now
11682    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11683    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11684    cmp     r0, #0                      @ success?
11685    beq     common_exceptionThrown      @ no, handle exception
11686#if defined(WITH_JIT)
11687    /*
11688     * If the JIT is actively building a trace we need to make sure
11689     * that the field is fully resolved before including this instruction.
11690     */
11691    bl      common_verifyField
11692#endif
11693    b       .LOP_SGET_OBJECT_finish
11694
11695/* continuation for OP_SGET_BOOLEAN */
11696
11697    /*
11698     * Continuation if the field has not yet been resolved.
11699     *  r1:  BBBB field ref
11700     *  r10: dvmDex->pResFields
11701     */
11702.LOP_SGET_BOOLEAN_resolve:
11703    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11704#if defined(WITH_JIT)
11705    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11706#endif
11707    EXPORT_PC()                         @ resolve() could throw, so export now
11708    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11709    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11710    cmp     r0, #0                      @ success?
11711    beq     common_exceptionThrown      @ no, handle exception
11712#if defined(WITH_JIT)
11713    /*
11714     * If the JIT is actively building a trace we need to make sure
11715     * that the field is fully resolved before including this instruction.
11716     */
11717    bl      common_verifyField
11718#endif
11719    b       .LOP_SGET_BOOLEAN_finish
11720
11721/* continuation for OP_SGET_BYTE */
11722
11723    /*
11724     * Continuation if the field has not yet been resolved.
11725     *  r1:  BBBB field ref
11726     *  r10: dvmDex->pResFields
11727     */
11728.LOP_SGET_BYTE_resolve:
11729    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11730#if defined(WITH_JIT)
11731    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11732#endif
11733    EXPORT_PC()                         @ resolve() could throw, so export now
11734    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11735    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11736    cmp     r0, #0                      @ success?
11737    beq     common_exceptionThrown      @ no, handle exception
11738#if defined(WITH_JIT)
11739    /*
11740     * If the JIT is actively building a trace we need to make sure
11741     * that the field is fully resolved before including this instruction.
11742     */
11743    bl      common_verifyField
11744#endif
11745    b       .LOP_SGET_BYTE_finish
11746
11747/* continuation for OP_SGET_CHAR */
11748
11749    /*
11750     * Continuation if the field has not yet been resolved.
11751     *  r1:  BBBB field ref
11752     *  r10: dvmDex->pResFields
11753     */
11754.LOP_SGET_CHAR_resolve:
11755    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11756#if defined(WITH_JIT)
11757    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11758#endif
11759    EXPORT_PC()                         @ resolve() could throw, so export now
11760    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11761    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11762    cmp     r0, #0                      @ success?
11763    beq     common_exceptionThrown      @ no, handle exception
11764#if defined(WITH_JIT)
11765    /*
11766     * If the JIT is actively building a trace we need to make sure
11767     * that the field is fully resolved before including this instruction.
11768     */
11769    bl      common_verifyField
11770#endif
11771    b       .LOP_SGET_CHAR_finish
11772
11773/* continuation for OP_SGET_SHORT */
11774
11775    /*
11776     * Continuation if the field has not yet been resolved.
11777     *  r1:  BBBB field ref
11778     *  r10: dvmDex->pResFields
11779     */
11780.LOP_SGET_SHORT_resolve:
11781    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11782#if defined(WITH_JIT)
11783    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11784#endif
11785    EXPORT_PC()                         @ resolve() could throw, so export now
11786    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11787    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11788    cmp     r0, #0                      @ success?
11789    beq     common_exceptionThrown      @ no, handle exception
11790#if defined(WITH_JIT)
11791    /*
11792     * If the JIT is actively building a trace we need to make sure
11793     * that the field is fully resolved before including this instruction.
11794     */
11795    bl      common_verifyField
11796#endif
11797    b       .LOP_SGET_SHORT_finish
11798
11799/* continuation for OP_SPUT */
11800
11801    /*
11802     * Continuation if the field has not yet been resolved.
11803     *  r1:  BBBB field ref
11804     *  r10: dvmDex->pResFields
11805     */
11806.LOP_SPUT_resolve:
11807    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11808#if defined(WITH_JIT)
11809    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11810#endif
11811    EXPORT_PC()                         @ resolve() could throw, so export now
11812    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11813    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11814    cmp     r0, #0                      @ success?
11815    beq     common_exceptionThrown      @ no, handle exception
11816#if defined(WITH_JIT)
11817    /*
11818     * If the JIT is actively building a trace we need to make sure
11819     * that the field is fully resolved before including this instruction.
11820     */
11821    bl      common_verifyField
11822#endif
11823    b       .LOP_SPUT_finish          @ resume
11824
11825/* continuation for OP_SPUT_WIDE */
11826
11827    /*
11828     * Continuation if the field has not yet been resolved.
11829     *  r1:  BBBB field ref
11830     *  r9:  &fp[AA]
11831     *  r10: dvmDex->pResFields
11832     *
11833     * Returns StaticField pointer in r2.
11834     */
11835.LOP_SPUT_WIDE_resolve:
11836    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11837#if defined(WITH_JIT)
11838    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11839#endif
11840    EXPORT_PC()                         @ resolve() could throw, so export now
11841    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11842    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11843    cmp     r0, #0                      @ success?
11844    mov     r2, r0                      @ copy to r2
11845    beq     common_exceptionThrown      @ no, handle exception
11846#if defined(WITH_JIT)
11847    /*
11848     * If the JIT is actively building a trace we need to make sure
11849     * that the field is fully resolved before including this instruction.
11850     */
11851    bl      common_verifyField
11852#endif
11853    b       .LOP_SPUT_WIDE_finish          @ resume
11854
11855/* continuation for OP_SPUT_OBJECT */
11856
11857
11858.LOP_SPUT_OBJECT_end:
11859    str     r1, [r0, #offStaticField_value]  @ field<- vAA
11860    @ no-op
11861    cmp     r1, #0                      @ stored a null object?
11862    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
11863    GOTO_OPCODE(ip)                     @ jump to next instruction
11864
11865    /* Continuation if the field has not yet been resolved.
11866     * r1:  BBBB field ref
11867     * r10: dvmDex->pResFields
11868     */
11869.LOP_SPUT_OBJECT_resolve:
11870    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11871#if defined(WITH_JIT)
11872    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11873#endif
11874    EXPORT_PC()                         @ resolve() could throw, so export now
11875    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11876    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11877    cmp     r0, #0                      @ success?
11878    beq     common_exceptionThrown      @ no, handle exception
11879#if defined(WITH_JIT)
11880    /*
11881     * If the JIT is actively building a trace we need to make sure
11882     * that the field is fully resolved before including this instruction.
11883     */
11884    bl      common_verifyField
11885#endif
11886    b       .LOP_SPUT_OBJECT_finish          @ resume
11887
11888
11889/* continuation for OP_SPUT_BOOLEAN */
11890
11891    /*
11892     * Continuation if the field has not yet been resolved.
11893     *  r1:  BBBB field ref
11894     *  r10: dvmDex->pResFields
11895     */
11896.LOP_SPUT_BOOLEAN_resolve:
11897    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11898#if defined(WITH_JIT)
11899    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11900#endif
11901    EXPORT_PC()                         @ resolve() could throw, so export now
11902    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11903    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11904    cmp     r0, #0                      @ success?
11905    beq     common_exceptionThrown      @ no, handle exception
11906#if defined(WITH_JIT)
11907    /*
11908     * If the JIT is actively building a trace we need to make sure
11909     * that the field is fully resolved before including this instruction.
11910     */
11911    bl      common_verifyField
11912#endif
11913    b       .LOP_SPUT_BOOLEAN_finish          @ resume
11914
11915/* continuation for OP_SPUT_BYTE */
11916
11917    /*
11918     * Continuation if the field has not yet been resolved.
11919     *  r1:  BBBB field ref
11920     *  r10: dvmDex->pResFields
11921     */
11922.LOP_SPUT_BYTE_resolve:
11923    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11924#if defined(WITH_JIT)
11925    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11926#endif
11927    EXPORT_PC()                         @ resolve() could throw, so export now
11928    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11929    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11930    cmp     r0, #0                      @ success?
11931    beq     common_exceptionThrown      @ no, handle exception
11932#if defined(WITH_JIT)
11933    /*
11934     * If the JIT is actively building a trace we need to make sure
11935     * that the field is fully resolved before including this instruction.
11936     */
11937    bl      common_verifyField
11938#endif
11939    b       .LOP_SPUT_BYTE_finish          @ resume
11940
11941/* continuation for OP_SPUT_CHAR */
11942
11943    /*
11944     * Continuation if the field has not yet been resolved.
11945     *  r1:  BBBB field ref
11946     *  r10: dvmDex->pResFields
11947     */
11948.LOP_SPUT_CHAR_resolve:
11949    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11950#if defined(WITH_JIT)
11951    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11952#endif
11953    EXPORT_PC()                         @ resolve() could throw, so export now
11954    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11955    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11956    cmp     r0, #0                      @ success?
11957    beq     common_exceptionThrown      @ no, handle exception
11958#if defined(WITH_JIT)
11959    /*
11960     * If the JIT is actively building a trace we need to make sure
11961     * that the field is fully resolved before including this instruction.
11962     */
11963    bl      common_verifyField
11964#endif
11965    b       .LOP_SPUT_CHAR_finish          @ resume
11966
11967/* continuation for OP_SPUT_SHORT */
11968
11969    /*
11970     * Continuation if the field has not yet been resolved.
11971     *  r1:  BBBB field ref
11972     *  r10: dvmDex->pResFields
11973     */
11974.LOP_SPUT_SHORT_resolve:
11975    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11976#if defined(WITH_JIT)
11977    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11978#endif
11979    EXPORT_PC()                         @ resolve() could throw, so export now
11980    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11981    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11982    cmp     r0, #0                      @ success?
11983    beq     common_exceptionThrown      @ no, handle exception
11984#if defined(WITH_JIT)
11985    /*
11986     * If the JIT is actively building a trace we need to make sure
11987     * that the field is fully resolved before including this instruction.
11988     */
11989    bl      common_verifyField
11990#endif
11991    b       .LOP_SPUT_SHORT_finish          @ resume
11992
11993/* continuation for OP_INVOKE_VIRTUAL */
11994
11995    /*
11996     * At this point:
11997     *  r0 = resolved base method
11998     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
11999     */
12000.LOP_INVOKE_VIRTUAL_continue:
12001    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12002    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12003    cmp     r9, #0                      @ is "this" null?
12004    beq     common_errNullObject        @ null "this", throw exception
12005    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12006    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12007    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12008    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
12009
12010/* continuation for OP_INVOKE_SUPER */
12011
12012    /*
12013     * At this point:
12014     *  r0 = resolved base method
12015     *  r10 = method->clazz
12016     */
12017.LOP_INVOKE_SUPER_continue:
12018    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12019    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12020    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12021    EXPORT_PC()                         @ must export for invoke
12022    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12023    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
12024    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12025    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12026    bl      common_invokeMethodNoRange @ continue on
12027
12028.LOP_INVOKE_SUPER_resolve:
12029    mov     r0, r10                     @ r0<- method->clazz
12030    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12031    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12032    cmp     r0, #0                      @ got null?
12033    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
12034    b       common_exceptionThrown      @ yes, handle exception
12035
12036    /*
12037     * Throw a NoSuchMethodError with the method name as the message.
12038     *  r0 = resolved base method
12039     */
12040.LOP_INVOKE_SUPER_nsm:
12041    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12042    b       common_errNoSuchMethod
12043
12044/* continuation for OP_INVOKE_DIRECT */
12045
12046    /*
12047     * On entry:
12048     *  r1 = reference (BBBB or CCCC)
12049     *  r10 = "this" register
12050     */
12051.LOP_INVOKE_DIRECT_resolve:
12052    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12053    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12054    mov     r2, #METHOD_DIRECT          @ resolver method type
12055    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12056    cmp     r0, #0                      @ got null?
12057    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
12058    b       common_exceptionThrown      @ yes, handle exception
12059
12060/* continuation for OP_INVOKE_STATIC */
12061
12062
12063.LOP_INVOKE_STATIC_resolve:
12064    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12065    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12066    mov     r2, #METHOD_STATIC          @ resolver method type
12067    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12068    cmp     r0, #0                      @ got null?
12069#if defined(WITH_JIT)
12070    /*
12071     * Check to see if we're actively building a trace.  If so,
12072     * we need to keep this instruction out of it.
12073     * r10: &resolved_methodToCall
12074     */
12075    ldrh    r2, [rSELF, #offThread_subMode]
12076    beq     common_exceptionThrown            @ null, handle exception
12077    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12078    beq     common_invokeMethodNoRange     @ no (r0=method, r9="this")
12079    ldr     r1, [r10]                         @ reload resolved method
12080    cmp     r1, #0                            @ finished resolving?
12081    bne     common_invokeMethodNoRange     @ yes (r0=method, r9="this")
12082    mov     r10, r0                           @ preserve method
12083    mov     r0, rSELF
12084    mov     r1, rPC
12085    bl      dvmJitEndTraceSelect              @ (self, pc)
12086    mov     r0, r10
12087    b       common_invokeMethodNoRange     @ whew, finally!
12088#else
12089    bne     common_invokeMethodNoRange     @ (r0=method, r9="this")
12090    b       common_exceptionThrown            @ yes, handle exception
12091#endif
12092
12093/* continuation for OP_INVOKE_VIRTUAL_RANGE */
12094
12095    /*
12096     * At this point:
12097     *  r0 = resolved base method
12098     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
12099     */
12100.LOP_INVOKE_VIRTUAL_RANGE_continue:
12101    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12102    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12103    cmp     r9, #0                      @ is "this" null?
12104    beq     common_errNullObject        @ null "this", throw exception
12105    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12106    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12107    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12108    bl      common_invokeMethodRange @ (r0=method, r9="this")
12109
12110/* continuation for OP_INVOKE_SUPER_RANGE */
12111
12112    /*
12113     * At this point:
12114     *  r0 = resolved base method
12115     *  r10 = method->clazz
12116     */
12117.LOP_INVOKE_SUPER_RANGE_continue:
12118    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12119    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12120    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12121    EXPORT_PC()                         @ must export for invoke
12122    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12123    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
12124    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12125    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12126    bl      common_invokeMethodRange @ continue on
12127
12128.LOP_INVOKE_SUPER_RANGE_resolve:
12129    mov     r0, r10                     @ r0<- method->clazz
12130    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12131    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12132    cmp     r0, #0                      @ got null?
12133    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
12134    b       common_exceptionThrown      @ yes, handle exception
12135
12136    /*
12137     * Throw a NoSuchMethodError with the method name as the message.
12138     *  r0 = resolved base method
12139     */
12140.LOP_INVOKE_SUPER_RANGE_nsm:
12141    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12142    b       common_errNoSuchMethod
12143
12144/* continuation for OP_INVOKE_DIRECT_RANGE */
12145
12146    /*
12147     * On entry:
12148     *  r1 = reference (BBBB or CCCC)
12149     *  r10 = "this" register
12150     */
12151.LOP_INVOKE_DIRECT_RANGE_resolve:
12152    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12153    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12154    mov     r2, #METHOD_DIRECT          @ resolver method type
12155    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12156    cmp     r0, #0                      @ got null?
12157    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
12158    b       common_exceptionThrown      @ yes, handle exception
12159
12160/* continuation for OP_INVOKE_STATIC_RANGE */
12161
12162
12163.LOP_INVOKE_STATIC_RANGE_resolve:
12164    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12165    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12166    mov     r2, #METHOD_STATIC          @ resolver method type
12167    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12168    cmp     r0, #0                      @ got null?
12169#if defined(WITH_JIT)
12170    /*
12171     * Check to see if we're actively building a trace.  If so,
12172     * we need to keep this instruction out of it.
12173     * r10: &resolved_methodToCall
12174     */
12175    ldrh    r2, [rSELF, #offThread_subMode]
12176    beq     common_exceptionThrown            @ null, handle exception
12177    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12178    beq     common_invokeMethodRange     @ no (r0=method, r9="this")
12179    ldr     r1, [r10]                         @ reload resolved method
12180    cmp     r1, #0                            @ finished resolving?
12181    bne     common_invokeMethodRange     @ yes (r0=method, r9="this")
12182    mov     r10, r0                           @ preserve method
12183    mov     r0, rSELF
12184    mov     r1, rPC
12185    bl      dvmJitEndTraceSelect              @ (self, pc)
12186    mov     r0, r10
12187    b       common_invokeMethodRange     @ whew, finally!
12188#else
12189    bne     common_invokeMethodRange     @ (r0=method, r9="this")
12190    b       common_exceptionThrown            @ yes, handle exception
12191#endif
12192
12193/* continuation for OP_FLOAT_TO_LONG */
12194/*
12195 * Convert the float in r0 to a long in r0/r1.
12196 *
12197 * We have to clip values to long min/max per the specification.  The
12198 * expected common case is a "reasonable" value that converts directly
12199 * to modest integer.  The EABI convert function isn't doing this for us.
12200 */
12201f2l_doconv:
12202    stmfd   sp!, {r4, lr}
12203    mov     r1, #0x5f000000             @ (float)maxlong
12204    mov     r4, r0
12205    bl      __aeabi_fcmpge              @ is arg >= maxlong?
12206    cmp     r0, #0                      @ nonzero == yes
12207    mvnne   r0, #0                      @ return maxlong (7fffffff)
12208    mvnne   r1, #0x80000000
12209    ldmnefd sp!, {r4, pc}
12210
12211    mov     r0, r4                      @ recover arg
12212    mov     r1, #0xdf000000             @ (float)minlong
12213    bl      __aeabi_fcmple              @ is arg <= minlong?
12214    cmp     r0, #0                      @ nonzero == yes
12215    movne   r0, #0                      @ return minlong (80000000)
12216    movne   r1, #0x80000000
12217    ldmnefd sp!, {r4, pc}
12218
12219    mov     r0, r4                      @ recover arg
12220    mov     r1, r4
12221    bl      __aeabi_fcmpeq              @ is arg == self?
12222    cmp     r0, #0                      @ zero == no
12223    moveq   r1, #0                      @ return zero for NaN
12224    ldmeqfd sp!, {r4, pc}
12225
12226    mov     r0, r4                      @ recover arg
12227    bl      __aeabi_f2lz                @ convert float to long
12228    ldmfd   sp!, {r4, pc}
12229
12230/* continuation for OP_DOUBLE_TO_LONG */
12231/*
12232 * Convert the double in r0/r1 to a long in r0/r1.
12233 *
12234 * We have to clip values to long min/max per the specification.  The
12235 * expected common case is a "reasonable" value that converts directly
12236 * to modest integer.  The EABI convert function isn't doing this for us.
12237 */
12238d2l_doconv:
12239    stmfd   sp!, {r4, r5, lr}           @ save regs
12240    mov     r3, #0x43000000             @ maxlong, as a double (high word)
12241    add     r3, #0x00e00000             @  0x43e00000
12242    mov     r2, #0                      @ maxlong, as a double (low word)
12243    sub     sp, sp, #4                  @ align for EABI
12244    mov     r4, r0                      @ save a copy of r0
12245    mov     r5, r1                      @  and r1
12246    bl      __aeabi_dcmpge              @ is arg >= maxlong?
12247    cmp     r0, #0                      @ nonzero == yes
12248    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
12249    mvnne   r1, #0x80000000
12250    bne     1f
12251
12252    mov     r0, r4                      @ recover arg
12253    mov     r1, r5
12254    mov     r3, #0xc3000000             @ minlong, as a double (high word)
12255    add     r3, #0x00e00000             @  0xc3e00000
12256    mov     r2, #0                      @ minlong, as a double (low word)
12257    bl      __aeabi_dcmple              @ is arg <= minlong?
12258    cmp     r0, #0                      @ nonzero == yes
12259    movne   r0, #0                      @ return minlong (8000000000000000)
12260    movne   r1, #0x80000000
12261    bne     1f
12262
12263    mov     r0, r4                      @ recover arg
12264    mov     r1, r5
12265    mov     r2, r4                      @ compare against self
12266    mov     r3, r5
12267    bl      __aeabi_dcmpeq              @ is arg == self?
12268    cmp     r0, #0                      @ zero == no
12269    moveq   r1, #0                      @ return zero for NaN
12270    beq     1f
12271
12272    mov     r0, r4                      @ recover arg
12273    mov     r1, r5
12274    bl      __aeabi_d2lz                @ convert double to long
12275
122761:
12277    add     sp, sp, #4
12278    ldmfd   sp!, {r4, r5, pc}
12279
12280/* continuation for OP_MUL_LONG */
12281
12282.LOP_MUL_LONG_finish:
12283    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12284    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
12285    GOTO_OPCODE(ip)                     @ jump to next instruction
12286
12287/* continuation for OP_SHL_LONG */
12288
12289.LOP_SHL_LONG_finish:
12290    mov     r0, r0, asl r2              @  r0<- r0 << r2
12291    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12292    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12293    GOTO_OPCODE(ip)                     @ jump to next instruction
12294
12295/* continuation for OP_SHR_LONG */
12296
12297.LOP_SHR_LONG_finish:
12298    mov     r1, r1, asr r2              @  r1<- r1 >> r2
12299    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12300    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12301    GOTO_OPCODE(ip)                     @ jump to next instruction
12302
12303/* continuation for OP_USHR_LONG */
12304
12305.LOP_USHR_LONG_finish:
12306    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
12307    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12308    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12309    GOTO_OPCODE(ip)                     @ jump to next instruction
12310
12311/* continuation for OP_SHL_LONG_2ADDR */
12312
12313.LOP_SHL_LONG_2ADDR_finish:
12314    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12315    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12316    GOTO_OPCODE(ip)                     @ jump to next instruction
12317
12318/* continuation for OP_SHR_LONG_2ADDR */
12319
12320.LOP_SHR_LONG_2ADDR_finish:
12321    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12322    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12323    GOTO_OPCODE(ip)                     @ jump to next instruction
12324
12325/* continuation for OP_USHR_LONG_2ADDR */
12326
12327.LOP_USHR_LONG_2ADDR_finish:
12328    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12329    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12330    GOTO_OPCODE(ip)                     @ jump to next instruction
12331
12332/* continuation for OP_IGET_VOLATILE */
12333
12334    /*
12335     * Currently:
12336     *  r0 holds resolved field
12337     *  r9 holds object
12338     */
12339.LOP_IGET_VOLATILE_finish:
12340    @bl      common_squeak0
12341    cmp     r9, #0                      @ check object for null
12342    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12343    beq     common_errNullObject        @ object was null
12344    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12345    SMP_DMB                            @ acquiring load
12346    mov     r2, rINST, lsr #8           @ r2<- A+
12347    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12348    and     r2, r2, #15                 @ r2<- A
12349    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12350    SET_VREG(r0, r2)                    @ fp[A]<- r0
12351    GOTO_OPCODE(ip)                     @ jump to next instruction
12352
12353/* continuation for OP_IPUT_VOLATILE */
12354
12355    /*
12356     * Currently:
12357     *  r0 holds resolved field
12358     *  r9 holds object
12359     */
12360.LOP_IPUT_VOLATILE_finish:
12361    @bl      common_squeak0
12362    mov     r1, rINST, lsr #8           @ r1<- A+
12363    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12364    and     r1, r1, #15                 @ r1<- A
12365    cmp     r9, #0                      @ check object for null
12366    GET_VREG(r0, r1)                    @ r0<- fp[A]
12367    beq     common_errNullObject        @ object was null
12368    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12369    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12370    SMP_DMB_ST                        @ releasing store
12371    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12372    SMP_DMB
12373    GOTO_OPCODE(ip)                     @ jump to next instruction
12374
12375/* continuation for OP_SGET_VOLATILE */
12376
12377    /*
12378     * Continuation if the field has not yet been resolved.
12379     *  r1:  BBBB field ref
12380     *  r10: dvmDex->pResFields
12381     */
12382.LOP_SGET_VOLATILE_resolve:
12383    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12384#if defined(WITH_JIT)
12385    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12386#endif
12387    EXPORT_PC()                         @ resolve() could throw, so export now
12388    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12389    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12390    cmp     r0, #0                      @ success?
12391    beq     common_exceptionThrown      @ no, handle exception
12392#if defined(WITH_JIT)
12393    /*
12394     * If the JIT is actively building a trace we need to make sure
12395     * that the field is fully resolved before including this instruction.
12396     */
12397    bl      common_verifyField
12398#endif
12399    b       .LOP_SGET_VOLATILE_finish
12400
12401/* continuation for OP_SPUT_VOLATILE */
12402
12403    /*
12404     * Continuation if the field has not yet been resolved.
12405     *  r1:  BBBB field ref
12406     *  r10: dvmDex->pResFields
12407     */
12408.LOP_SPUT_VOLATILE_resolve:
12409    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12410#if defined(WITH_JIT)
12411    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12412#endif
12413    EXPORT_PC()                         @ resolve() could throw, so export now
12414    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12415    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12416    cmp     r0, #0                      @ success?
12417    beq     common_exceptionThrown      @ no, handle exception
12418#if defined(WITH_JIT)
12419    /*
12420     * If the JIT is actively building a trace we need to make sure
12421     * that the field is fully resolved before including this instruction.
12422     */
12423    bl      common_verifyField
12424#endif
12425    b       .LOP_SPUT_VOLATILE_finish          @ resume
12426
12427/* continuation for OP_IGET_OBJECT_VOLATILE */
12428
12429    /*
12430     * Currently:
12431     *  r0 holds resolved field
12432     *  r9 holds object
12433     */
12434.LOP_IGET_OBJECT_VOLATILE_finish:
12435    @bl      common_squeak0
12436    cmp     r9, #0                      @ check object for null
12437    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12438    beq     common_errNullObject        @ object was null
12439    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12440    SMP_DMB                            @ acquiring load
12441    mov     r2, rINST, lsr #8           @ r2<- A+
12442    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12443    and     r2, r2, #15                 @ r2<- A
12444    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12445    SET_VREG(r0, r2)                    @ fp[A]<- r0
12446    GOTO_OPCODE(ip)                     @ jump to next instruction
12447
12448/* continuation for OP_IGET_WIDE_VOLATILE */
12449
12450    /*
12451     * Currently:
12452     *  r0 holds resolved field
12453     *  r9 holds object
12454     */
12455.LOP_IGET_WIDE_VOLATILE_finish:
12456    cmp     r9, #0                      @ check object for null
12457    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12458    beq     common_errNullObject        @ object was null
12459    .if     1
12460    add     r0, r9, r3                  @ r0<- address of field
12461    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
12462    .else
12463    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
12464    .endif
12465    mov     r2, rINST, lsr #8           @ r2<- A+
12466    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12467    and     r2, r2, #15                 @ r2<- A
12468    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
12469    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12470    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
12471    GOTO_OPCODE(ip)                     @ jump to next instruction
12472
12473/* continuation for OP_IPUT_WIDE_VOLATILE */
12474
12475    /*
12476     * Currently:
12477     *  r0 holds resolved field
12478     *  r9 holds object
12479     */
12480.LOP_IPUT_WIDE_VOLATILE_finish:
12481    mov     r2, rINST, lsr #8           @ r2<- A+
12482    cmp     r9, #0                      @ check object for null
12483    and     r2, r2, #15                 @ r2<- A
12484    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12485    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
12486    beq     common_errNullObject        @ object was null
12487    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12488    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
12489    GET_INST_OPCODE(r10)                @ extract opcode from rINST
12490    .if     1
12491    add     r2, r9, r3                  @ r2<- target address
12492    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
12493    .else
12494    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
12495    .endif
12496    GOTO_OPCODE(r10)                    @ jump to next instruction
12497
12498/* continuation for OP_SGET_WIDE_VOLATILE */
12499
12500    /*
12501     * Continuation if the field has not yet been resolved.
12502     *  r1:  BBBB field ref
12503     *  r10: dvmDex->pResFields
12504     *
12505     * Returns StaticField pointer in r0.
12506     */
12507.LOP_SGET_WIDE_VOLATILE_resolve:
12508    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12509#if defined(WITH_JIT)
12510    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
12511#endif
12512    EXPORT_PC()                         @ resolve() could throw, so export now
12513    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12514    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12515    cmp     r0, #0                      @ success?
12516    beq     common_exceptionThrown      @ no, handle exception
12517#if defined(WITH_JIT)
12518    /*
12519     * If the JIT is actively building a trace we need to make sure
12520     * that the field is fully resolved before including this instruction.
12521     */
12522    bl      common_verifyField
12523#endif
12524    b       .LOP_SGET_WIDE_VOLATILE_finish          @ resume
12525
12526/* continuation for OP_SPUT_WIDE_VOLATILE */
12527
12528    /*
12529     * Continuation if the field has not yet been resolved.
12530     *  r1:  BBBB field ref
12531     *  r9:  &fp[AA]
12532     *  r10: dvmDex->pResFields
12533     *
12534     * Returns StaticField pointer in r2.
12535     */
12536.LOP_SPUT_WIDE_VOLATILE_resolve:
12537    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12538#if defined(WITH_JIT)
12539    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12540#endif
12541    EXPORT_PC()                         @ resolve() could throw, so export now
12542    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12543    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12544    cmp     r0, #0                      @ success?
12545    mov     r2, r0                      @ copy to r2
12546    beq     common_exceptionThrown      @ no, handle exception
12547#if defined(WITH_JIT)
12548    /*
12549     * If the JIT is actively building a trace we need to make sure
12550     * that the field is fully resolved before including this instruction.
12551     */
12552    bl      common_verifyField
12553#endif
12554    b       .LOP_SPUT_WIDE_VOLATILE_finish          @ resume
12555
12556/* continuation for OP_EXECUTE_INLINE */
12557
12558    /*
12559     * Extract args, call function.
12560     *  r0 = #of args (0-4)
12561     *  r10 = call index
12562     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
12563     *
12564     * Other ideas:
12565     * - Use a jump table from the main piece to jump directly into the
12566     *   AND/LDR pairs.  Costs a data load, saves a branch.
12567     * - Have five separate pieces that do the loading, so we can work the
12568     *   interleave a little better.  Increases code size.
12569     */
12570.LOP_EXECUTE_INLINE_continue:
12571    rsb     r0, r0, #4                  @ r0<- 4-r0
12572    FETCH(rINST, 2)                     @ rINST<- FEDC
12573    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
12574    bl      common_abort                @ (skipped due to ARM prefetch)
125754:  and     ip, rINST, #0xf000          @ isolate F
12576    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
125773:  and     ip, rINST, #0x0f00          @ isolate E
12578    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
125792:  and     ip, rINST, #0x00f0          @ isolate D
12580    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
125811:  and     ip, rINST, #0x000f          @ isolate C
12582    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
125830:
12584    ldr     rINST, .LOP_EXECUTE_INLINE_table    @ table of InlineOperation
12585    ldr     pc, [rINST, r10, lsl #4]    @ sizeof=16, "func" is first entry
12586    @ (not reached)
12587
12588    /*
12589     * We're debugging or profiling.
12590     * r10: opIndex
12591     */
12592.LOP_EXECUTE_INLINE_debugmode:
12593    mov     r0, r10
12594    bl      dvmResolveInlineNative
12595    cmp     r0, #0                      @ did it resolve?
12596    beq     .LOP_EXECUTE_INLINE_resume          @ no, just move on
12597    mov     r9, r0                      @ remember method
12598    mov     r1, rSELF
12599    bl      dvmFastMethodTraceEnter     @ (method, self)
12600    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
12601    sub     sp, sp, #8                  @ make room for arg, +64 bit align
12602    mov     r0, rINST, lsr #12          @ r0<- B
12603    str     r1, [sp]                    @ push &self->retval
12604    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
12605    mov     rINST, r0                   @ save result of inline
12606    add     sp, sp, #8                  @ pop stack
12607    mov     r0, r9                      @ r0<- method
12608    mov     r1, rSELF
12609    bl      dvmFastNativeMethodTraceExit @ (method, self)
12610    cmp     rINST, #0                   @ test boolean result of inline
12611    beq     common_exceptionThrown      @ returned false, handle exception
12612    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
12613    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12614    GOTO_OPCODE(ip)                     @ jump to next instruction
12615
12616
12617
12618
12619.LOP_EXECUTE_INLINE_table:
12620    .word   gDvmInlineOpsTable
12621
12622/* continuation for OP_EXECUTE_INLINE_RANGE */
12623
12624    /*
12625     * Extract args, call function.
12626     *  r0 = #of args (0-4)
12627     *  r10 = call index
12628     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
12629     */
12630.LOP_EXECUTE_INLINE_RANGE_continue:
12631    rsb     r0, r0, #4                  @ r0<- 4-r0
12632    FETCH(r9, 2)                        @ r9<- CCCC
12633    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
12634    bl      common_abort                @ (skipped due to ARM prefetch)
126354:  add     ip, r9, #3                  @ base+3
12636    GET_VREG(r3, ip)                    @ r3<- vBase[3]
126373:  add     ip, r9, #2                  @ base+2
12638    GET_VREG(r2, ip)                    @ r2<- vBase[2]
126392:  add     ip, r9, #1                  @ base+1
12640    GET_VREG(r1, ip)                    @ r1<- vBase[1]
126411:  add     ip, r9, #0                  @ (nop)
12642    GET_VREG(r0, ip)                    @ r0<- vBase[0]
126430:
12644    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
12645    ldr     pc, [r9, r10, lsl #4]       @ sizeof=16, "func" is first entry
12646    @ (not reached)
12647
12648
12649    /*
12650     * We're debugging or profiling.
12651     * r10: opIndex
12652     */
12653.LOP_EXECUTE_INLINE_RANGE_debugmode:
12654    mov     r0, r10
12655    bl      dvmResolveInlineNative
12656    cmp     r0, #0                      @ did it resolve?
12657    beq     .LOP_EXECUTE_INLINE_RANGE_resume          @ no, just move on
12658    mov     r9, r0                      @ remember method
12659    mov     r1, rSELF
12660    bl      dvmFastMethodTraceEnter     @ (method, self)
12661    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
12662    sub     sp, sp, #8                  @ make room for arg, +64 bit align
12663    mov     r0, rINST, lsr #8           @ r0<- B
12664    mov     rINST, r9                   @ rINST<- method
12665    str     r1, [sp]                    @ push &self->retval
12666    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
12667    mov     r9, r0                      @ save result of inline
12668    add     sp, sp, #8                  @ pop stack
12669    mov     r0, rINST                   @ r0<- method
12670    mov     r1, rSELF
12671    bl      dvmFastNativeMethodTraceExit  @ (method, self)
12672    cmp     r9, #0                      @ test boolean result of inline
12673    beq     common_exceptionThrown      @ returned false, handle exception
12674    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
12675    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12676    GOTO_OPCODE(ip)                     @ jump to next instruction
12677
12678
12679
12680
12681.LOP_EXECUTE_INLINE_RANGE_table:
12682    .word   gDvmInlineOpsTable
12683
12684
12685/* continuation for OP_INVOKE_OBJECT_INIT_RANGE */
12686
12687.LOP_INVOKE_OBJECT_INIT_RANGE_setFinal:
12688    EXPORT_PC()                         @ can throw
12689    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
12690    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
12691    cmp     r0, #0                      @ exception pending?
12692    bne     common_exceptionThrown      @ yes, handle it
12693    b       .LOP_INVOKE_OBJECT_INIT_RANGE_finish
12694
12695    /*
12696     * A debugger is attached, so we need to go ahead and do
12697     * this.  For simplicity, we'll just jump directly to the
12698     * corresponding handler.  Note that we can't use
12699     * rIBASE here because it may be in single-step mode.
12700     * Load the primary table base directly.
12701     */
12702.LOP_INVOKE_OBJECT_INIT_RANGE_debugger:
12703    ldr     r1, [rSELF, #offThread_mainHandlerTable]
12704    .if 0
12705    mov     ip, #OP_INVOKE_DIRECT_JUMBO
12706    .else
12707    mov     ip, #OP_INVOKE_DIRECT_RANGE
12708    .endif
12709    GOTO_OPCODE_BASE(r1,ip)             @ execute it
12710
12711/* continuation for OP_IPUT_OBJECT_VOLATILE */
12712
12713    /*
12714     * Currently:
12715     *  r0 holds resolved field
12716     *  r9 holds object
12717     */
12718.LOP_IPUT_OBJECT_VOLATILE_finish:
12719    @bl      common_squeak0
12720    mov     r1, rINST, lsr #8           @ r1<- A+
12721    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12722    and     r1, r1, #15                 @ r1<- A
12723    cmp     r9, #0                      @ check object for null
12724    GET_VREG(r0, r1)                    @ r0<- fp[A]
12725    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
12726    beq     common_errNullObject        @ object was null
12727    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12728    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12729    SMP_DMB_ST                        @ releasing store
12730    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
12731    SMP_DMB
12732    cmp     r0, #0                      @ stored a null reference?
12733    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
12734    GOTO_OPCODE(ip)                     @ jump to next instruction
12735
12736/* continuation for OP_SGET_OBJECT_VOLATILE */
12737
12738    /*
12739     * Continuation if the field has not yet been resolved.
12740     *  r1:  BBBB field ref
12741     *  r10: dvmDex->pResFields
12742     */
12743.LOP_SGET_OBJECT_VOLATILE_resolve:
12744    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12745#if defined(WITH_JIT)
12746    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12747#endif
12748    EXPORT_PC()                         @ resolve() could throw, so export now
12749    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12750    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12751    cmp     r0, #0                      @ success?
12752    beq     common_exceptionThrown      @ no, handle exception
12753#if defined(WITH_JIT)
12754    /*
12755     * If the JIT is actively building a trace we need to make sure
12756     * that the field is fully resolved before including this instruction.
12757     */
12758    bl      common_verifyField
12759#endif
12760    b       .LOP_SGET_OBJECT_VOLATILE_finish
12761
12762/* continuation for OP_SPUT_OBJECT_VOLATILE */
12763
12764
12765.LOP_SPUT_OBJECT_VOLATILE_end:
12766    str     r1, [r0, #offStaticField_value]  @ field<- vAA
12767    SMP_DMB
12768    cmp     r1, #0                      @ stored a null object?
12769    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
12770    GOTO_OPCODE(ip)                     @ jump to next instruction
12771
12772    /* Continuation if the field has not yet been resolved.
12773     * r1:  BBBB field ref
12774     * r10: dvmDex->pResFields
12775     */
12776.LOP_SPUT_OBJECT_VOLATILE_resolve:
12777    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12778#if defined(WITH_JIT)
12779    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12780#endif
12781    EXPORT_PC()                         @ resolve() could throw, so export now
12782    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12783    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12784    cmp     r0, #0                      @ success?
12785    beq     common_exceptionThrown      @ no, handle exception
12786#if defined(WITH_JIT)
12787    /*
12788     * If the JIT is actively building a trace we need to make sure
12789     * that the field is fully resolved before including this instruction.
12790     */
12791    bl      common_verifyField
12792#endif
12793    b       .LOP_SPUT_OBJECT_VOLATILE_finish          @ resume
12794
12795
12796/* continuation for OP_CONST_CLASS_JUMBO */
12797
12798    /*
12799     * Continuation if the Class has not yet been resolved.
12800     *  r1: AAAAAAAA (Class ref)
12801     *  r9: target register
12802     */
12803.LOP_CONST_CLASS_JUMBO_resolve:
12804    EXPORT_PC()
12805    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
12806    mov     r2, #1                      @ r2<- true
12807    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
12808    bl      dvmResolveClass             @ r0<- Class reference
12809    cmp     r0, #0                      @ failed?
12810    beq     common_exceptionThrown      @ yup, handle the exception
12811    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12812    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12813    SET_VREG(r0, r9)                    @ vBBBB<- r0
12814    GOTO_OPCODE(ip)                     @ jump to next instruction
12815
12816/* continuation for OP_CHECK_CAST_JUMBO */
12817
12818    /*
12819     * Trivial test failed, need to perform full check.  This is common.
12820     *  r0 holds obj->clazz
12821     *  r1 holds desired class resolved from AAAAAAAA
12822     *  r9 holds object
12823     */
12824.LOP_CHECK_CAST_JUMBO_fullcheck:
12825    mov     r10, r1                     @ avoid ClassObject getting clobbered
12826    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
12827    cmp     r0, #0                      @ failed?
12828    bne     .LOP_CHECK_CAST_JUMBO_okay            @ no, success
12829
12830    @ A cast has failed.  We need to throw a ClassCastException.
12831    EXPORT_PC()                         @ about to throw
12832    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
12833    mov     r1, r10                     @ r1<- desired class
12834    bl      dvmThrowClassCastException
12835    b       common_exceptionThrown
12836
12837    /*
12838     * Advance PC and get the next opcode.
12839     */
12840.LOP_CHECK_CAST_JUMBO_okay:
12841    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12842    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12843    GOTO_OPCODE(ip)                     @ jump to next instruction
12844
12845    /*
12846     * Resolution required.  This is the least-likely path.
12847     *
12848     *  r2 holds AAAAAAAA
12849     *  r9 holds object
12850     */
12851.LOP_CHECK_CAST_JUMBO_resolve:
12852    EXPORT_PC()                         @ resolve() could throw
12853    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12854    mov     r1, r2                      @ r1<- AAAAAAAA
12855    mov     r2, #0                      @ r2<- false
12856    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12857    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12858    cmp     r0, #0                      @ got null?
12859    beq     common_exceptionThrown      @ yes, handle exception
12860    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
12861    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
12862    b       .LOP_CHECK_CAST_JUMBO_resolved        @ pick up where we left off
12863
12864/* continuation for OP_INSTANCE_OF_JUMBO */
12865
12866    /*
12867     * Class resolved, determine type of check necessary.  This is common.
12868     *  r0 holds obj->clazz
12869     *  r1 holds class resolved from AAAAAAAA
12870     *  r9 holds BBBB
12871     */
12872.LOP_INSTANCE_OF_JUMBO_resolved:
12873    cmp     r0, r1                      @ same class (trivial success)?
12874    beq     .LOP_INSTANCE_OF_JUMBO_trivial         @ yes, trivial finish
12875    @ fall through to OP_INSTANCE_OF_JUMBO_fullcheck
12876
12877    /*
12878     * Trivial test failed, need to perform full check.  This is common.
12879     *  r0 holds obj->clazz
12880     *  r1 holds class resolved from AAAAAAAA
12881     *  r9 holds BBBB
12882     */
12883.LOP_INSTANCE_OF_JUMBO_fullcheck:
12884    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
12885    @ fall through to OP_INSTANCE_OF_JUMBO_store
12886
12887    /*
12888     * r0 holds boolean result
12889     * r9 holds BBBB
12890     */
12891.LOP_INSTANCE_OF_JUMBO_store:
12892    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
12893    SET_VREG(r0, r9)                    @ vBBBB<- r0
12894    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12895    GOTO_OPCODE(ip)                     @ jump to next instruction
12896
12897    /*
12898     * Trivial test succeeded, save and bail.
12899     *  r9 holds BBBB
12900     */
12901.LOP_INSTANCE_OF_JUMBO_trivial:
12902    mov     r0, #1                      @ indicate success
12903    @ could b OP_INSTANCE_OF_JUMBO_store, but copying is faster and cheaper
12904    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
12905    SET_VREG(r0, r9)                    @ vBBBB<- r0
12906    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12907    GOTO_OPCODE(ip)                     @ jump to next instruction
12908
12909    /*
12910     * Resolution required.  This is the least-likely path.
12911     *
12912     *  r3 holds AAAAAAAA
12913     *  r9 holds BBBB
12914     */
12915
12916.LOP_INSTANCE_OF_JUMBO_resolve:
12917    EXPORT_PC()                         @ resolve() could throw
12918    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
12919    mov     r1, r3                      @ r1<- AAAAAAAA
12920    mov     r2, #1                      @ r2<- true
12921    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
12922    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12923    cmp     r0, #0                      @ got null?
12924    beq     common_exceptionThrown      @ yes, handle exception
12925    FETCH(r3, 4)                        @ r3<- vCCCC
12926    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
12927    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
12928    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
12929    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ pick up where we left off
12930
12931/* continuation for OP_NEW_INSTANCE_JUMBO */
12932
12933    .balign 32                          @ minimize cache lines
12934.LOP_NEW_INSTANCE_JUMBO_finish: @ r0=new object
12935    FETCH(r3, 3)                        @ r3<- BBBB
12936    cmp     r0, #0                      @ failed?
12937#if defined(WITH_JIT)
12938    /*
12939     * The JIT needs the class to be fully resolved before it can
12940     * include this instruction in a trace.
12941     */
12942    ldrh    r1, [rSELF, #offThread_subMode]
12943    beq     common_exceptionThrown      @ yes, handle the exception
12944    ands    r1, #kSubModeJitTraceBuild  @ under construction?
12945    bne     .LOP_NEW_INSTANCE_JUMBO_jitCheck
12946#else
12947    beq     common_exceptionThrown      @ yes, handle the exception
12948#endif
12949.LOP_NEW_INSTANCE_JUMBO_end:
12950    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12951    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12952    SET_VREG(r0, r3)                    @ vBBBB<- r0
12953    GOTO_OPCODE(ip)                     @ jump to next instruction
12954
12955#if defined(WITH_JIT)
12956    /*
12957     * Check to see if we need to stop the trace building early.
12958     * r0: new object
12959     * r3: vAA
12960     */
12961.LOP_NEW_INSTANCE_JUMBO_jitCheck:
12962    ldr     r1, [r10]                   @ reload resolved class
12963    cmp     r1, #0                      @ okay?
12964    bne     .LOP_NEW_INSTANCE_JUMBO_end             @ yes, finish
12965    mov     r9, r0                      @ preserve new object
12966    mov     r10, r3                     @ preserve vAA
12967    mov     r0, rSELF
12968    mov     r1, rPC
12969    bl      dvmJitEndTraceSelect        @ (self, pc)
12970    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12971    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12972    SET_VREG(r9, r10)                   @ vAA<- new object
12973    GOTO_OPCODE(ip)                     @ jump to next instruction
12974#endif
12975
12976    /*
12977     * Class initialization required.
12978     *
12979     *  r0 holds class object
12980     */
12981.LOP_NEW_INSTANCE_JUMBO_needinit:
12982    mov     r9, r0                      @ save r0
12983    bl      dvmInitClass                @ initialize class
12984    cmp     r0, #0                      @ check boolean result
12985    mov     r0, r9                      @ restore r0
12986    bne     .LOP_NEW_INSTANCE_JUMBO_initialized     @ success, continue
12987    b       common_exceptionThrown      @ failed, deal with init exception
12988
12989    /*
12990     * Resolution required.  This is the least-likely path.
12991     *
12992     *  r1 holds AAAAAAAA
12993     */
12994.LOP_NEW_INSTANCE_JUMBO_resolve:
12995    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12996    mov     r2, #0                      @ r2<- false
12997    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12998    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12999    cmp     r0, #0                      @ got null?
13000    bne     .LOP_NEW_INSTANCE_JUMBO_resolved        @ no, continue
13001    b       common_exceptionThrown      @ yes, handle exception
13002
13003/* continuation for OP_NEW_ARRAY_JUMBO */
13004
13005
13006    /*
13007     * Resolve class.  (This is an uncommon case.)
13008     *
13009     *  r1 holds array length
13010     *  r2 holds class ref AAAAAAAA
13011     */
13012.LOP_NEW_ARRAY_JUMBO_resolve:
13013    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13014    mov     r9, r1                      @ r9<- length (save)
13015    mov     r1, r2                      @ r1<- AAAAAAAA
13016    mov     r2, #0                      @ r2<- false
13017    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13018    bl      dvmResolveClass             @ r0<- call(clazz, ref)
13019    cmp     r0, #0                      @ got null?
13020    mov     r1, r9                      @ r1<- length (restore)
13021    beq     common_exceptionThrown      @ yes, handle exception
13022    @ fall through to OP_NEW_ARRAY_JUMBO_finish
13023
13024    /*
13025     * Finish allocation.
13026     *
13027     *  r0 holds class
13028     *  r1 holds array length
13029     */
13030.LOP_NEW_ARRAY_JUMBO_finish:
13031    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
13032    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
13033    cmp     r0, #0                      @ failed?
13034    FETCH(r2, 3)                        @ r2<- vBBBB
13035    beq     common_exceptionThrown      @ yes, handle the exception
13036    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13037    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13038    SET_VREG(r0, r2)                    @ vBBBB<- r0
13039    GOTO_OPCODE(ip)                     @ jump to next instruction
13040
13041/* continuation for OP_FILLED_NEW_ARRAY_JUMBO */
13042
13043    /*
13044     * On entry:
13045     *  r0 holds array class
13046     */
13047.LOP_FILLED_NEW_ARRAY_JUMBO_continue:
13048    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
13049    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
13050    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
13051    FETCH(r1, 3)                        @ r1<- BBBB (length)
13052    cmp     rINST, #'I'                 @ array of ints?
13053    cmpne   rINST, #'L'                 @ array of objects?
13054    cmpne   rINST, #'['                 @ array of arrays?
13055    mov     r9, r1                      @ save length in r9
13056    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_notimpl         @ no, not handled yet
13057    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
13058    cmp     r0, #0                      @ null return?
13059    beq     common_exceptionThrown      @ alloc failed, handle exception
13060
13061    FETCH(r1, 4)                        @ r1<- CCCC
13062    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
13063    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
13064    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
13065    subs    r9, r9, #1                  @ length--, check for neg
13066    FETCH_ADVANCE_INST(5)               @ advance to next instr, load rINST
13067    bmi     2f                          @ was zero, bail
13068
13069    @ copy values from registers into the array
13070    @ r0=array, r1=CCCC, r9=BBBB (length)
13071    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
130721:  ldr     r3, [r2], #4                @ r3<- *r2++
13073    subs    r9, r9, #1                  @ count--
13074    str     r3, [r0], #4                @ *contents++ = vX
13075    bpl     1b
13076
130772:  ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
13078    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
13079    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13080    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
13081    cmp     r1, #'I'                         @ Is int array?
13082    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
13083    GOTO_OPCODE(ip)                          @ execute it
13084
13085    /*
13086     * Throw an exception indicating that we have not implemented this
13087     * mode of filled-new-array.
13088     */
13089.LOP_FILLED_NEW_ARRAY_JUMBO_notimpl:
13090    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO
13091    bl      dvmThrowInternalError
13092    b       common_exceptionThrown
13093
13094    /*
13095     * Ideally we'd only define this once, but depending on layout we can
13096     * exceed the range of the load above.
13097     */
13098
13099.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO:
13100    .word   .LstrFilledNewArrayNotImpl
13101
13102/* continuation for OP_IGET_JUMBO */
13103
13104    /*
13105     * Currently:
13106     *  r0 holds resolved field
13107     *  r9 holds object
13108     */
13109.LOP_IGET_JUMBO_resolved:
13110    cmp     r0, #0                      @ resolution unsuccessful?
13111    beq     common_exceptionThrown      @ yes, throw exception
13112    @ fall through to OP_IGET_JUMBO_finish
13113
13114    /*
13115     * Currently:
13116     *  r0 holds resolved field
13117     *  r9 holds object
13118     */
13119.LOP_IGET_JUMBO_finish:
13120    @bl      common_squeak0
13121    cmp     r9, #0                      @ check object for null
13122    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13123    beq     common_errNullObject        @ object was null
13124    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13125    @ no-op                             @ acquiring load
13126    FETCH(r2, 3)                        @ r2<- BBBB
13127    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13128    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13129    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13130    GOTO_OPCODE(ip)                     @ jump to next instruction
13131
13132/* continuation for OP_IGET_WIDE_JUMBO */
13133
13134    /*
13135     * Currently:
13136     *  r0 holds resolved field
13137     *  r9 holds object
13138     */
13139.LOP_IGET_WIDE_JUMBO_resolved:
13140    cmp     r0, #0                      @ resolution unsuccessful?
13141    beq     common_exceptionThrown      @ yes, throw exception
13142    @ fall through to OP_IGET_WIDE_JUMBO_finish
13143
13144    /*
13145     * Currently:
13146     *  r0 holds resolved field
13147     *  r9 holds object
13148     */
13149.LOP_IGET_WIDE_JUMBO_finish:
13150    cmp     r9, #0                      @ check object for null
13151    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13152    beq     common_errNullObject        @ object was null
13153    .if     0
13154    add     r0, r9, r3                  @ r0<- address of field
13155    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
13156    .else
13157    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
13158    .endif
13159    FETCH(r2, 3)                        @ r2<- BBBB
13160    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13161    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13162    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13163    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
13164    GOTO_OPCODE(ip)                     @ jump to next instruction
13165
13166/* continuation for OP_IGET_OBJECT_JUMBO */
13167
13168    /*
13169     * Currently:
13170     *  r0 holds resolved field
13171     *  r9 holds object
13172     */
13173.LOP_IGET_OBJECT_JUMBO_resolved:
13174    cmp     r0, #0                      @ resolution unsuccessful?
13175    beq     common_exceptionThrown      @ yes, throw exception
13176    @ fall through to OP_IGET_OBJECT_JUMBO_finish
13177
13178    /*
13179     * Currently:
13180     *  r0 holds resolved field
13181     *  r9 holds object
13182     */
13183.LOP_IGET_OBJECT_JUMBO_finish:
13184    @bl      common_squeak0
13185    cmp     r9, #0                      @ check object for null
13186    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13187    beq     common_errNullObject        @ object was null
13188    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13189    @ no-op                             @ acquiring load
13190    FETCH(r2, 3)                        @ r2<- BBBB
13191    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13192    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13193    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13194    GOTO_OPCODE(ip)                     @ jump to next instruction
13195
13196/* continuation for OP_IGET_BOOLEAN_JUMBO */
13197
13198    /*
13199     * Currently:
13200     *  r0 holds resolved field
13201     *  r9 holds object
13202     */
13203.LOP_IGET_BOOLEAN_JUMBO_resolved:
13204    cmp     r0, #0                      @ resolution unsuccessful?
13205    beq     common_exceptionThrown      @ yes, throw exception
13206    @ fall through to OP_IGET_BOOLEAN_JUMBO_finish
13207
13208    /*
13209     * Currently:
13210     *  r0 holds resolved field
13211     *  r9 holds object
13212     */
13213.LOP_IGET_BOOLEAN_JUMBO_finish:
13214    @bl      common_squeak1
13215    cmp     r9, #0                      @ check object for null
13216    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13217    beq     common_errNullObject        @ object was null
13218    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13219    @ no-op                             @ acquiring load
13220    FETCH(r2, 3)                        @ r2<- BBBB
13221    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13222    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13223    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13224    GOTO_OPCODE(ip)                     @ jump to next instruction
13225
13226/* continuation for OP_IGET_BYTE_JUMBO */
13227
13228    /*
13229     * Currently:
13230     *  r0 holds resolved field
13231     *  r9 holds object
13232     */
13233.LOP_IGET_BYTE_JUMBO_resolved:
13234    cmp     r0, #0                      @ resolution unsuccessful?
13235    beq     common_exceptionThrown      @ yes, throw exception
13236    @ fall through to OP_IGET_BYTE_JUMBO_finish
13237
13238    /*
13239     * Currently:
13240     *  r0 holds resolved field
13241     *  r9 holds object
13242     */
13243.LOP_IGET_BYTE_JUMBO_finish:
13244    @bl      common_squeak2
13245    cmp     r9, #0                      @ check object for null
13246    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13247    beq     common_errNullObject        @ object was null
13248    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13249    @ no-op                             @ acquiring load
13250    FETCH(r2, 3)                        @ r2<- BBBB
13251    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13252    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13253    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13254    GOTO_OPCODE(ip)                     @ jump to next instruction
13255
13256/* continuation for OP_IGET_CHAR_JUMBO */
13257
13258    /*
13259     * Currently:
13260     *  r0 holds resolved field
13261     *  r9 holds object
13262     */
13263.LOP_IGET_CHAR_JUMBO_resolved:
13264    cmp     r0, #0                      @ resolution unsuccessful?
13265    beq     common_exceptionThrown      @ yes, throw exception
13266    @ fall through to OP_IGET_CHAR_JUMBO_finish
13267
13268    /*
13269     * Currently:
13270     *  r0 holds resolved field
13271     *  r9 holds object
13272     */
13273.LOP_IGET_CHAR_JUMBO_finish:
13274    @bl      common_squeak3
13275    cmp     r9, #0                      @ check object for null
13276    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13277    beq     common_errNullObject        @ object was null
13278    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13279    @ no-op                             @ acquiring load
13280    FETCH(r2, 3)                        @ r2<- BBBB
13281    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13282    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13283    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13284    GOTO_OPCODE(ip)                     @ jump to next instruction
13285
13286/* continuation for OP_IGET_SHORT_JUMBO */
13287
13288    /*
13289     * Currently:
13290     *  r0 holds resolved field
13291     *  r9 holds object
13292     */
13293.LOP_IGET_SHORT_JUMBO_resolved:
13294    cmp     r0, #0                      @ resolution unsuccessful?
13295    beq     common_exceptionThrown      @ yes, throw exception
13296    @ fall through to OP_IGET_SHORT_JUMBO_finish
13297
13298    /*
13299     * Currently:
13300     *  r0 holds resolved field
13301     *  r9 holds object
13302     */
13303.LOP_IGET_SHORT_JUMBO_finish:
13304    @bl      common_squeak4
13305    cmp     r9, #0                      @ check object for null
13306    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13307    beq     common_errNullObject        @ object was null
13308    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13309    @ no-op                             @ acquiring load
13310    FETCH(r2, 3)                        @ r2<- BBBB
13311    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13312    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13313    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13314    GOTO_OPCODE(ip)                     @ jump to next instruction
13315
13316/* continuation for OP_IPUT_JUMBO */
13317
13318    /*
13319     * Currently:
13320     *  r0 holds resolved field
13321     *  r9 holds object
13322     */
13323.LOP_IPUT_JUMBO_resolved:
13324     cmp     r0, #0                     @ resolution unsuccessful?
13325     beq     common_exceptionThrown     @ yes, throw exception
13326     @ fall through to OP_IPUT_JUMBO_finish
13327
13328    /*
13329     * Currently:
13330     *  r0 holds resolved field
13331     *  r9 holds object
13332     */
13333.LOP_IPUT_JUMBO_finish:
13334    @bl      common_squeak0
13335    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13336    FETCH(r1, 3)                        @ r1<- BBBB
13337    cmp     r9, #0                      @ check object for null
13338    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13339    beq     common_errNullObject        @ object was null
13340    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13341    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13342    @ no-op                          @ releasing store
13343    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13344    @ no-op
13345    GOTO_OPCODE(ip)                     @ jump to next instruction
13346
13347/* continuation for OP_IPUT_WIDE_JUMBO */
13348
13349    /*
13350     * Currently:
13351     *  r0 holds resolved field
13352     *  r9 holds object
13353     */
13354.LOP_IPUT_WIDE_JUMBO_resolved:
13355     cmp     r0, #0                     @ resolution unsuccessful?
13356     beq     common_exceptionThrown     @ yes, throw exception
13357     @ fall through to OP_IPUT_WIDE_JUMBO_finish
13358
13359    /*
13360     * Currently:
13361     *  r0 holds resolved field
13362     *  r9 holds object
13363     */
13364.LOP_IPUT_WIDE_JUMBO_finish:
13365    cmp     r9, #0                      @ check object for null
13366    FETCH(r2, 3)                        @ r1<- BBBB
13367    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13368    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13369    beq     common_errNullObject        @ object was null
13370    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13371    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
13372    GET_INST_OPCODE(r10)                @ extract opcode from rINST
13373    .if     0
13374    add     r2, r9, r3                  @ r2<- target address
13375    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
13376    .else
13377    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
13378    .endif
13379    GOTO_OPCODE(r10)                    @ jump to next instruction
13380
13381/* continuation for OP_IPUT_OBJECT_JUMBO */
13382
13383    /*
13384     * Currently:
13385     *  r0 holds resolved field
13386     *  r9 holds object
13387     */
13388.LOP_IPUT_OBJECT_JUMBO_resolved:
13389     cmp     r0, #0                     @ resolution unsuccessful?
13390     beq     common_exceptionThrown     @ yes, throw exception
13391     @ fall through to OP_IPUT_OBJECT_JUMBO_finish
13392
13393    /*
13394     * Currently:
13395     *  r0 holds resolved field
13396     *  r9 holds object
13397     */
13398.LOP_IPUT_OBJECT_JUMBO_finish:
13399    @bl      common_squeak0
13400    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13401    FETCH(r1, 3)                        @ r1<- BBBB
13402    cmp     r9, #0                      @ check object for null
13403    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13404    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13405    beq     common_errNullObject        @ object was null
13406    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13407    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13408    @ no-op                         @ releasing store
13409    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
13410    @ no-op
13411    cmp     r0, #0                      @ stored a null reference?
13412    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
13413    GOTO_OPCODE(ip)                     @ jump to next instruction
13414
13415/* continuation for OP_IPUT_BOOLEAN_JUMBO */
13416
13417    /*
13418     * Currently:
13419     *  r0 holds resolved field
13420     *  r9 holds object
13421     */
13422.LOP_IPUT_BOOLEAN_JUMBO_resolved:
13423     cmp     r0, #0                     @ resolution unsuccessful?
13424     beq     common_exceptionThrown     @ yes, throw exception
13425     @ fall through to OP_IPUT_BOOLEAN_JUMBO_finish
13426
13427    /*
13428     * Currently:
13429     *  r0 holds resolved field
13430     *  r9 holds object
13431     */
13432.LOP_IPUT_BOOLEAN_JUMBO_finish:
13433    @bl      common_squeak1
13434    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13435    FETCH(r1, 3)                        @ r1<- BBBB
13436    cmp     r9, #0                      @ check object for null
13437    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13438    beq     common_errNullObject        @ object was null
13439    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13440    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13441    @ no-op                          @ releasing store
13442    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13443    @ no-op
13444    GOTO_OPCODE(ip)                     @ jump to next instruction
13445
13446/* continuation for OP_IPUT_BYTE_JUMBO */
13447
13448    /*
13449     * Currently:
13450     *  r0 holds resolved field
13451     *  r9 holds object
13452     */
13453.LOP_IPUT_BYTE_JUMBO_resolved:
13454     cmp     r0, #0                     @ resolution unsuccessful?
13455     beq     common_exceptionThrown     @ yes, throw exception
13456     @ fall through to OP_IPUT_BYTE_JUMBO_finish
13457
13458    /*
13459     * Currently:
13460     *  r0 holds resolved field
13461     *  r9 holds object
13462     */
13463.LOP_IPUT_BYTE_JUMBO_finish:
13464    @bl      common_squeak2
13465    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13466    FETCH(r1, 3)                        @ r1<- BBBB
13467    cmp     r9, #0                      @ check object for null
13468    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13469    beq     common_errNullObject        @ object was null
13470    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13471    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13472    @ no-op                          @ releasing store
13473    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13474    @ no-op
13475    GOTO_OPCODE(ip)                     @ jump to next instruction
13476
13477/* continuation for OP_IPUT_CHAR_JUMBO */
13478
13479    /*
13480     * Currently:
13481     *  r0 holds resolved field
13482     *  r9 holds object
13483     */
13484.LOP_IPUT_CHAR_JUMBO_resolved:
13485     cmp     r0, #0                     @ resolution unsuccessful?
13486     beq     common_exceptionThrown     @ yes, throw exception
13487     @ fall through to OP_IPUT_CHAR_JUMBO_finish
13488
13489    /*
13490     * Currently:
13491     *  r0 holds resolved field
13492     *  r9 holds object
13493     */
13494.LOP_IPUT_CHAR_JUMBO_finish:
13495    @bl      common_squeak3
13496    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13497    FETCH(r1, 3)                        @ r1<- BBBB
13498    cmp     r9, #0                      @ check object for null
13499    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13500    beq     common_errNullObject        @ object was null
13501    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13502    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13503    @ no-op                          @ releasing store
13504    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13505    @ no-op
13506    GOTO_OPCODE(ip)                     @ jump to next instruction
13507
13508/* continuation for OP_IPUT_SHORT_JUMBO */
13509
13510    /*
13511     * Currently:
13512     *  r0 holds resolved field
13513     *  r9 holds object
13514     */
13515.LOP_IPUT_SHORT_JUMBO_resolved:
13516     cmp     r0, #0                     @ resolution unsuccessful?
13517     beq     common_exceptionThrown     @ yes, throw exception
13518     @ fall through to OP_IPUT_SHORT_JUMBO_finish
13519
13520    /*
13521     * Currently:
13522     *  r0 holds resolved field
13523     *  r9 holds object
13524     */
13525.LOP_IPUT_SHORT_JUMBO_finish:
13526    @bl      common_squeak4
13527    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13528    FETCH(r1, 3)                        @ r1<- BBBB
13529    cmp     r9, #0                      @ check object for null
13530    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13531    beq     common_errNullObject        @ object was null
13532    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13533    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13534    @ no-op                          @ releasing store
13535    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13536    @ no-op
13537    GOTO_OPCODE(ip)                     @ jump to next instruction
13538
13539/* continuation for OP_SGET_JUMBO */
13540
13541    /*
13542     * Continuation if the field has not yet been resolved.
13543     *  r1:  AAAAAAAA field ref
13544     *  r10: dvmDex->pResFields
13545     */
13546.LOP_SGET_JUMBO_resolve:
13547    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13548#if defined(WITH_JIT)
13549    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13550#endif
13551    EXPORT_PC()                         @ resolve() could throw, so export now
13552    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13553    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13554    cmp     r0, #0                      @ success?
13555    beq     common_exceptionThrown      @ no, handle exception
13556#if defined(WITH_JIT)
13557    /*
13558     * If the JIT is actively building a trace we need to make sure
13559     * that the field is fully resolved before including this instruction.
13560     */
13561    bl      common_verifyField
13562#endif
13563    b       .LOP_SGET_JUMBO_finish          @ resume
13564
13565/* continuation for OP_SGET_WIDE_JUMBO */
13566
13567    /*
13568     * Continuation if the field has not yet been resolved.
13569     *  r1: AAAAAAAA field ref
13570     *
13571     * Returns StaticField pointer in r0.
13572     */
13573.LOP_SGET_WIDE_JUMBO_resolve:
13574    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13575    EXPORT_PC()                         @ resolve() could throw, so export now
13576    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13577    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13578    cmp     r0, #0                      @ success?
13579    bne     .LOP_SGET_WIDE_JUMBO_finish          @ yes, finish
13580    b       common_exceptionThrown      @ no, handle exception
13581
13582/* continuation for OP_SGET_OBJECT_JUMBO */
13583
13584    /*
13585     * Continuation if the field has not yet been resolved.
13586     *  r1:  AAAAAAAA field ref
13587     *  r10: dvmDex->pResFields
13588     */
13589.LOP_SGET_OBJECT_JUMBO_resolve:
13590    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13591#if defined(WITH_JIT)
13592    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13593#endif
13594    EXPORT_PC()                         @ resolve() could throw, so export now
13595    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13596    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13597    cmp     r0, #0                      @ success?
13598    beq     common_exceptionThrown      @ no, handle exception
13599#if defined(WITH_JIT)
13600    /*
13601     * If the JIT is actively building a trace we need to make sure
13602     * that the field is fully resolved before including this instruction.
13603     */
13604    bl      common_verifyField
13605#endif
13606    b       .LOP_SGET_OBJECT_JUMBO_finish          @ resume
13607
13608/* continuation for OP_SGET_BOOLEAN_JUMBO */
13609
13610    /*
13611     * Continuation if the field has not yet been resolved.
13612     *  r1:  AAAAAAAA field ref
13613     *  r10: dvmDex->pResFields
13614     */
13615.LOP_SGET_BOOLEAN_JUMBO_resolve:
13616    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13617#if defined(WITH_JIT)
13618    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13619#endif
13620    EXPORT_PC()                         @ resolve() could throw, so export now
13621    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13622    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13623    cmp     r0, #0                      @ success?
13624    beq     common_exceptionThrown      @ no, handle exception
13625#if defined(WITH_JIT)
13626    /*
13627     * If the JIT is actively building a trace we need to make sure
13628     * that the field is fully resolved before including this instruction.
13629     */
13630    bl      common_verifyField
13631#endif
13632    b       .LOP_SGET_BOOLEAN_JUMBO_finish          @ resume
13633
13634/* continuation for OP_SGET_BYTE_JUMBO */
13635
13636    /*
13637     * Continuation if the field has not yet been resolved.
13638     *  r1:  AAAAAAAA field ref
13639     *  r10: dvmDex->pResFields
13640     */
13641.LOP_SGET_BYTE_JUMBO_resolve:
13642    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13643#if defined(WITH_JIT)
13644    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13645#endif
13646    EXPORT_PC()                         @ resolve() could throw, so export now
13647    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13648    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13649    cmp     r0, #0                      @ success?
13650    beq     common_exceptionThrown      @ no, handle exception
13651#if defined(WITH_JIT)
13652    /*
13653     * If the JIT is actively building a trace we need to make sure
13654     * that the field is fully resolved before including this instruction.
13655     */
13656    bl      common_verifyField
13657#endif
13658    b       .LOP_SGET_BYTE_JUMBO_finish          @ resume
13659
13660/* continuation for OP_SGET_CHAR_JUMBO */
13661
13662    /*
13663     * Continuation if the field has not yet been resolved.
13664     *  r1:  AAAAAAAA field ref
13665     *  r10: dvmDex->pResFields
13666     */
13667.LOP_SGET_CHAR_JUMBO_resolve:
13668    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13669#if defined(WITH_JIT)
13670    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13671#endif
13672    EXPORT_PC()                         @ resolve() could throw, so export now
13673    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13674    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13675    cmp     r0, #0                      @ success?
13676    beq     common_exceptionThrown      @ no, handle exception
13677#if defined(WITH_JIT)
13678    /*
13679     * If the JIT is actively building a trace we need to make sure
13680     * that the field is fully resolved before including this instruction.
13681     */
13682    bl      common_verifyField
13683#endif
13684    b       .LOP_SGET_CHAR_JUMBO_finish          @ resume
13685
13686/* continuation for OP_SGET_SHORT_JUMBO */
13687
13688    /*
13689     * Continuation if the field has not yet been resolved.
13690     *  r1:  AAAAAAAA field ref
13691     *  r10: dvmDex->pResFields
13692     */
13693.LOP_SGET_SHORT_JUMBO_resolve:
13694    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13695#if defined(WITH_JIT)
13696    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13697#endif
13698    EXPORT_PC()                         @ resolve() could throw, so export now
13699    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13700    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13701    cmp     r0, #0                      @ success?
13702    beq     common_exceptionThrown      @ no, handle exception
13703#if defined(WITH_JIT)
13704    /*
13705     * If the JIT is actively building a trace we need to make sure
13706     * that the field is fully resolved before including this instruction.
13707     */
13708    bl      common_verifyField
13709#endif
13710    b       .LOP_SGET_SHORT_JUMBO_finish          @ resume
13711
13712/* continuation for OP_SPUT_JUMBO */
13713
13714    /*
13715     * Continuation if the field has not yet been resolved.
13716     *  r1:  AAAAAAAA field ref
13717     *  r10: dvmDex->pResFields
13718     */
13719.LOP_SPUT_JUMBO_resolve:
13720    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13721#if defined(WITH_JIT)
13722    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13723#endif
13724    EXPORT_PC()                         @ resolve() could throw, so export now
13725    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13726    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13727    cmp     r0, #0                      @ success?
13728    beq     common_exceptionThrown      @ no, handle exception
13729#if defined(WITH_JIT)
13730    /*
13731     * If the JIT is actively building a trace we need to make sure
13732     * that the field is fully resolved before including this instruction.
13733     */
13734    bl      common_verifyField
13735#endif
13736    b       .LOP_SPUT_JUMBO_finish          @ resume
13737
13738/* continuation for OP_SPUT_WIDE_JUMBO */
13739
13740    /*
13741     * Continuation if the field has not yet been resolved.
13742     *  r1:  AAAAAAAA field ref
13743     *  r9:  &fp[BBBB]
13744     *  r10: dvmDex->pResFields
13745     *
13746     * Returns StaticField pointer in r2.
13747     */
13748.LOP_SPUT_WIDE_JUMBO_resolve:
13749    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13750#if defined(WITH_JIT)
13751    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13752#endif
13753    EXPORT_PC()                         @ resolve() could throw, so export now
13754    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13755    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13756    cmp     r0, #0                      @ success?
13757    mov     r2, r0                      @ copy to r2
13758    beq     common_exceptionThrown      @ no, handle exception
13759#if defined(WITH_JIT)
13760    /*
13761     * If the JIT is actively building a trace we need to make sure
13762     * that the field is fully resolved before including this instruction.
13763     */
13764    bl      common_verifyField
13765#endif
13766    b       .LOP_SPUT_WIDE_JUMBO_finish          @ resume
13767
13768/* continuation for OP_SPUT_OBJECT_JUMBO */
13769
13770
13771.LOP_SPUT_OBJECT_JUMBO_end:
13772    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
13773    @ no-op
13774    cmp     r1, #0                      @ stored a null object?
13775    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
13776    GOTO_OPCODE(ip)                     @ jump to next instruction
13777
13778    /* Continuation if the field has not yet been resolved.
13779     * r1:  AAAAaaaa field ref
13780     * r10: dvmDex->pResFields
13781     */
13782.LOP_SPUT_OBJECT_JUMBO_resolve:
13783    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
13784#if defined(WITH_JIT)
13785    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13786#endif
13787    EXPORT_PC()                         @ resolve() could throw, so export now
13788    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13789    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13790    cmp     r0, #0                      @ success?
13791    beq     common_exceptionThrown      @ no, handle exception
13792#if defined(WITH_JIT)
13793    /*
13794     * If the JIT is actively building a trace we need to make sure
13795     * that the field is fully resolved before including this instruction.
13796     */
13797    bl      common_verifyField
13798#endif
13799    b       .LOP_SPUT_OBJECT_JUMBO_finish          @ resume
13800
13801
13802/* continuation for OP_SPUT_BOOLEAN_JUMBO */
13803
13804    /*
13805     * Continuation if the field has not yet been resolved.
13806     *  r1:  AAAAAAAA field ref
13807     *  r10: dvmDex->pResFields
13808     */
13809.LOP_SPUT_BOOLEAN_JUMBO_resolve:
13810    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13811#if defined(WITH_JIT)
13812    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13813#endif
13814    EXPORT_PC()                         @ resolve() could throw, so export now
13815    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13816    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13817    cmp     r0, #0                      @ success?
13818    beq     common_exceptionThrown      @ no, handle exception
13819#if defined(WITH_JIT)
13820    /*
13821     * If the JIT is actively building a trace we need to make sure
13822     * that the field is fully resolved before including this instruction.
13823     */
13824    bl      common_verifyField
13825#endif
13826    b       .LOP_SPUT_BOOLEAN_JUMBO_finish          @ resume
13827
13828/* continuation for OP_SPUT_BYTE_JUMBO */
13829
13830    /*
13831     * Continuation if the field has not yet been resolved.
13832     *  r1:  AAAAAAAA field ref
13833     *  r10: dvmDex->pResFields
13834     */
13835.LOP_SPUT_BYTE_JUMBO_resolve:
13836    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13837#if defined(WITH_JIT)
13838    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13839#endif
13840    EXPORT_PC()                         @ resolve() could throw, so export now
13841    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13842    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13843    cmp     r0, #0                      @ success?
13844    beq     common_exceptionThrown      @ no, handle exception
13845#if defined(WITH_JIT)
13846    /*
13847     * If the JIT is actively building a trace we need to make sure
13848     * that the field is fully resolved before including this instruction.
13849     */
13850    bl      common_verifyField
13851#endif
13852    b       .LOP_SPUT_BYTE_JUMBO_finish          @ resume
13853
13854/* continuation for OP_SPUT_CHAR_JUMBO */
13855
13856    /*
13857     * Continuation if the field has not yet been resolved.
13858     *  r1:  AAAAAAAA field ref
13859     *  r10: dvmDex->pResFields
13860     */
13861.LOP_SPUT_CHAR_JUMBO_resolve:
13862    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13863#if defined(WITH_JIT)
13864    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13865#endif
13866    EXPORT_PC()                         @ resolve() could throw, so export now
13867    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13868    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13869    cmp     r0, #0                      @ success?
13870    beq     common_exceptionThrown      @ no, handle exception
13871#if defined(WITH_JIT)
13872    /*
13873     * If the JIT is actively building a trace we need to make sure
13874     * that the field is fully resolved before including this instruction.
13875     */
13876    bl      common_verifyField
13877#endif
13878    b       .LOP_SPUT_CHAR_JUMBO_finish          @ resume
13879
13880/* continuation for OP_SPUT_SHORT_JUMBO */
13881
13882    /*
13883     * Continuation if the field has not yet been resolved.
13884     *  r1:  AAAAAAAA field ref
13885     *  r10: dvmDex->pResFields
13886     */
13887.LOP_SPUT_SHORT_JUMBO_resolve:
13888    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13889#if defined(WITH_JIT)
13890    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13891#endif
13892    EXPORT_PC()                         @ resolve() could throw, so export now
13893    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13894    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13895    cmp     r0, #0                      @ success?
13896    beq     common_exceptionThrown      @ no, handle exception
13897#if defined(WITH_JIT)
13898    /*
13899     * If the JIT is actively building a trace we need to make sure
13900     * that the field is fully resolved before including this instruction.
13901     */
13902    bl      common_verifyField
13903#endif
13904    b       .LOP_SPUT_SHORT_JUMBO_finish          @ resume
13905
13906/* continuation for OP_INVOKE_VIRTUAL_JUMBO */
13907
13908    /*
13909     * At this point:
13910     *  r0 = resolved base method
13911     */
13912.LOP_INVOKE_VIRTUAL_JUMBO_continue:
13913    FETCH(r10, 4)                       @ r10<- CCCC
13914    GET_VREG(r9, r10)                   @ r9<- "this" ptr
13915    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
13916    cmp     r9, #0                      @ is "this" null?
13917    beq     common_errNullObject        @ null "this", throw exception
13918    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
13919    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
13920    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
13921    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
13922
13923/* continuation for OP_INVOKE_SUPER_JUMBO */
13924
13925    /*
13926     * At this point:
13927     *  r0 = resolved base method
13928     *  r10 = method->clazz
13929     */
13930.LOP_INVOKE_SUPER_JUMBO_continue:
13931    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
13932    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
13933    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
13934    EXPORT_PC()                         @ must export for invoke
13935    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
13936    bcs     .LOP_INVOKE_SUPER_JUMBO_nsm             @ method not present in superclass
13937    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
13938    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
13939    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
13940
13941.LOP_INVOKE_SUPER_JUMBO_resolve:
13942    mov     r0, r10                     @ r0<- method->clazz
13943    mov     r2, #METHOD_VIRTUAL         @ resolver method type
13944    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
13945    cmp     r0, #0                      @ got null?
13946    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ no, continue
13947    b       common_exceptionThrown      @ yes, handle exception
13948
13949    /*
13950     * Throw a NoSuchMethodError with the method name as the message.
13951     *  r0 = resolved base method
13952     */
13953.LOP_INVOKE_SUPER_JUMBO_nsm:
13954    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
13955    b       common_errNoSuchMethod
13956
13957/* continuation for OP_INVOKE_DIRECT_JUMBO */
13958
13959    /*
13960     * On entry:
13961     *  r1 = reference (CCCC)
13962     *  r10 = "this" register
13963     */
13964.LOP_INVOKE_DIRECT_JUMBO_resolve:
13965    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13966    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13967    mov     r2, #METHOD_DIRECT          @ resolver method type
13968    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
13969    cmp     r0, #0                      @ got null?
13970    bne     .LOP_INVOKE_DIRECT_JUMBO_finish          @ no, continue
13971    b       common_exceptionThrown      @ yes, handle exception
13972
13973/* continuation for OP_INVOKE_STATIC_JUMBO */
13974
13975
13976.LOP_INVOKE_STATIC_JUMBO_resolve:
13977    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13978    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13979    mov     r2, #METHOD_STATIC          @ resolver method type
13980    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
13981    cmp     r0, #0                      @ got null?
13982#if defined(WITH_JIT)
13983    /*
13984     * Check to see if we're actively building a trace.  If so,
13985     * we need to keep this instruction out of it.
13986     * r10: &resolved_methodToCall
13987     */
13988    ldrh    r2, [rSELF, #offThread_subMode]
13989    beq     common_exceptionThrown            @ null, handle exception
13990    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
13991    beq     common_invokeMethodJumboNoThis    @ no (r0=method, r9="this")
13992    ldr     r1, [r10]                         @ reload resolved method
13993    cmp     r1, #0                            @ finished resolving?
13994    bne     common_invokeMethodJumboNoThis    @ yes (r0=method, r9="this")
13995    mov     r10, r0                           @ preserve method
13996    mov     r0, rSELF
13997    mov     r1, rPC
13998    bl      dvmJitEndTraceSelect              @ (self, pc)
13999    mov     r0, r10
14000    b       common_invokeMethodJumboNoThis    @ whew, finally!
14001#else
14002    bne     common_invokeMethodJumboNoThis    @ (r0=method, r9="this")
14003    b       common_exceptionThrown            @ yes, handle exception
14004#endif
14005
14006/* continuation for OP_INVOKE_OBJECT_INIT_JUMBO */
14007
14008.LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal:
14009    EXPORT_PC()                         @ can throw
14010    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
14011    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
14012    cmp     r0, #0                      @ exception pending?
14013    bne     common_exceptionThrown      @ yes, handle it
14014    b       .LOP_INVOKE_OBJECT_INIT_JUMBO_finish
14015
14016    /*
14017     * A debugger is attached, so we need to go ahead and do
14018     * this.  For simplicity, we'll just jump directly to the
14019     * corresponding handler.  Note that we can't use
14020     * rIBASE here because it may be in single-step mode.
14021     * Load the primary table base directly.
14022     */
14023.LOP_INVOKE_OBJECT_INIT_JUMBO_debugger:
14024    ldr     r1, [rSELF, #offThread_mainHandlerTable]
14025    .if 1
14026    mov     ip, #OP_INVOKE_DIRECT_JUMBO
14027    .else
14028    mov     ip, #OP_INVOKE_DIRECT_RANGE
14029    .endif
14030    GOTO_OPCODE_BASE(r1,ip)             @ execute it
14031
14032/* continuation for OP_IGET_VOLATILE_JUMBO */
14033
14034    /*
14035     * Currently:
14036     *  r0 holds resolved field
14037     *  r9 holds object
14038     */
14039.LOP_IGET_VOLATILE_JUMBO_resolved:
14040    cmp     r0, #0                      @ resolution unsuccessful?
14041    beq     common_exceptionThrown      @ yes, throw exception
14042    @ fall through to OP_IGET_VOLATILE_JUMBO_finish
14043
14044    /*
14045     * Currently:
14046     *  r0 holds resolved field
14047     *  r9 holds object
14048     */
14049.LOP_IGET_VOLATILE_JUMBO_finish:
14050    @bl      common_squeak0
14051    cmp     r9, #0                      @ check object for null
14052    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14053    beq     common_errNullObject        @ object was null
14054    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14055    SMP_DMB                            @ acquiring load
14056    FETCH(r2, 3)                        @ r2<- BBBB
14057    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14058    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14059    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14060    GOTO_OPCODE(ip)                     @ jump to next instruction
14061
14062/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
14063
14064    /*
14065     * Currently:
14066     *  r0 holds resolved field
14067     *  r9 holds object
14068     */
14069.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
14070    cmp     r0, #0                      @ resolution unsuccessful?
14071    beq     common_exceptionThrown      @ yes, throw exception
14072    @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
14073
14074    /*
14075     * Currently:
14076     *  r0 holds resolved field
14077     *  r9 holds object
14078     */
14079.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
14080    cmp     r9, #0                      @ check object for null
14081    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14082    beq     common_errNullObject        @ object was null
14083    .if     1
14084    add     r0, r9, r3                  @ r0<- address of field
14085    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
14086    .else
14087    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
14088    .endif
14089    FETCH(r2, 3)                        @ r2<- BBBB
14090    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14091    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14092    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14093    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
14094    GOTO_OPCODE(ip)                     @ jump to next instruction
14095
14096/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
14097
14098    /*
14099     * Currently:
14100     *  r0 holds resolved field
14101     *  r9 holds object
14102     */
14103.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
14104    cmp     r0, #0                      @ resolution unsuccessful?
14105    beq     common_exceptionThrown      @ yes, throw exception
14106    @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
14107
14108    /*
14109     * Currently:
14110     *  r0 holds resolved field
14111     *  r9 holds object
14112     */
14113.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
14114    @bl      common_squeak0
14115    cmp     r9, #0                      @ check object for null
14116    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14117    beq     common_errNullObject        @ object was null
14118    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14119    SMP_DMB                            @ acquiring load
14120    FETCH(r2, 3)                        @ r2<- BBBB
14121    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14122    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14123    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14124    GOTO_OPCODE(ip)                     @ jump to next instruction
14125
14126/* continuation for OP_IPUT_VOLATILE_JUMBO */
14127
14128    /*
14129     * Currently:
14130     *  r0 holds resolved field
14131     *  r9 holds object
14132     */
14133.LOP_IPUT_VOLATILE_JUMBO_resolved:
14134     cmp     r0, #0                     @ resolution unsuccessful?
14135     beq     common_exceptionThrown     @ yes, throw exception
14136     @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
14137
14138    /*
14139     * Currently:
14140     *  r0 holds resolved field
14141     *  r9 holds object
14142     */
14143.LOP_IPUT_VOLATILE_JUMBO_finish:
14144    @bl      common_squeak0
14145    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14146    FETCH(r1, 3)                        @ r1<- BBBB
14147    cmp     r9, #0                      @ check object for null
14148    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14149    beq     common_errNullObject        @ object was null
14150    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14151    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14152    SMP_DMB_ST                         @ releasing store
14153    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14154    SMP_DMB
14155    GOTO_OPCODE(ip)                     @ jump to next instruction
14156
14157/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
14158
14159    /*
14160     * Currently:
14161     *  r0 holds resolved field
14162     *  r9 holds object
14163     */
14164.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
14165     cmp     r0, #0                     @ resolution unsuccessful?
14166     beq     common_exceptionThrown     @ yes, throw exception
14167     @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
14168
14169    /*
14170     * Currently:
14171     *  r0 holds resolved field
14172     *  r9 holds object
14173     */
14174.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
14175    cmp     r9, #0                      @ check object for null
14176    FETCH(r2, 3)                        @ r1<- BBBB
14177    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14178    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14179    beq     common_errNullObject        @ object was null
14180    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14181    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
14182    GET_INST_OPCODE(r10)                @ extract opcode from rINST
14183    .if     1
14184    add     r2, r9, r3                  @ r2<- target address
14185    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
14186    .else
14187    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
14188    .endif
14189    GOTO_OPCODE(r10)                    @ jump to next instruction
14190
14191/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
14192
14193    /*
14194     * Currently:
14195     *  r0 holds resolved field
14196     *  r9 holds object
14197     */
14198.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
14199     cmp     r0, #0                     @ resolution unsuccessful?
14200     beq     common_exceptionThrown     @ yes, throw exception
14201     @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
14202
14203    /*
14204     * Currently:
14205     *  r0 holds resolved field
14206     *  r9 holds object
14207     */
14208.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
14209    @bl      common_squeak0
14210    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14211    FETCH(r1, 3)                        @ r1<- BBBB
14212    cmp     r9, #0                      @ check object for null
14213    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14214    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
14215    beq     common_errNullObject        @ object was null
14216    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14217    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14218    SMP_DMB_ST                        @ releasing store
14219    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
14220    SMP_DMB
14221    cmp     r0, #0                      @ stored a null reference?
14222    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
14223    GOTO_OPCODE(ip)                     @ jump to next instruction
14224
14225/* continuation for OP_SGET_VOLATILE_JUMBO */
14226
14227    /*
14228     * Continuation if the field has not yet been resolved.
14229     *  r1:  AAAAAAAA field ref
14230     *  r10: dvmDex->pResFields
14231     */
14232.LOP_SGET_VOLATILE_JUMBO_resolve:
14233    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14234#if defined(WITH_JIT)
14235    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14236#endif
14237    EXPORT_PC()                         @ resolve() could throw, so export now
14238    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14239    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14240    cmp     r0, #0                      @ success?
14241    beq     common_exceptionThrown      @ no, handle exception
14242#if defined(WITH_JIT)
14243    /*
14244     * If the JIT is actively building a trace we need to make sure
14245     * that the field is fully resolved before including this instruction.
14246     */
14247    bl      common_verifyField
14248#endif
14249    b       .LOP_SGET_VOLATILE_JUMBO_finish          @ resume
14250
14251/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
14252
14253    /*
14254     * Continuation if the field has not yet been resolved.
14255     *  r1: AAAAAAAA field ref
14256     *
14257     * Returns StaticField pointer in r0.
14258     */
14259.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
14260    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14261    EXPORT_PC()                         @ resolve() could throw, so export now
14262    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14263    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14264    cmp     r0, #0                      @ success?
14265    bne     .LOP_SGET_WIDE_VOLATILE_JUMBO_finish          @ yes, finish
14266    b       common_exceptionThrown      @ no, handle exception
14267
14268/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
14269
14270    /*
14271     * Continuation if the field has not yet been resolved.
14272     *  r1:  AAAAAAAA field ref
14273     *  r10: dvmDex->pResFields
14274     */
14275.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
14276    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14277#if defined(WITH_JIT)
14278    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14279#endif
14280    EXPORT_PC()                         @ resolve() could throw, so export now
14281    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14282    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14283    cmp     r0, #0                      @ success?
14284    beq     common_exceptionThrown      @ no, handle exception
14285#if defined(WITH_JIT)
14286    /*
14287     * If the JIT is actively building a trace we need to make sure
14288     * that the field is fully resolved before including this instruction.
14289     */
14290    bl      common_verifyField
14291#endif
14292    b       .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish          @ resume
14293
14294/* continuation for OP_SPUT_VOLATILE_JUMBO */
14295
14296    /*
14297     * Continuation if the field has not yet been resolved.
14298     *  r1:  AAAAAAAA field ref
14299     *  r10: dvmDex->pResFields
14300     */
14301.LOP_SPUT_VOLATILE_JUMBO_resolve:
14302    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14303#if defined(WITH_JIT)
14304    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14305#endif
14306    EXPORT_PC()                         @ resolve() could throw, so export now
14307    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14308    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14309    cmp     r0, #0                      @ success?
14310    beq     common_exceptionThrown      @ no, handle exception
14311#if defined(WITH_JIT)
14312    /*
14313     * If the JIT is actively building a trace we need to make sure
14314     * that the field is fully resolved before including this instruction.
14315     */
14316    bl      common_verifyField
14317#endif
14318    b       .LOP_SPUT_VOLATILE_JUMBO_finish          @ resume
14319
14320/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
14321
14322    /*
14323     * Continuation if the field has not yet been resolved.
14324     *  r1:  AAAAAAAA field ref
14325     *  r9:  &fp[BBBB]
14326     *  r10: dvmDex->pResFields
14327     *
14328     * Returns StaticField pointer in r2.
14329     */
14330.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
14331    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14332#if defined(WITH_JIT)
14333    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14334#endif
14335    EXPORT_PC()                         @ resolve() could throw, so export now
14336    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14337    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14338    cmp     r0, #0                      @ success?
14339    mov     r2, r0                      @ copy to r2
14340    beq     common_exceptionThrown      @ no, handle exception
14341#if defined(WITH_JIT)
14342    /*
14343     * If the JIT is actively building a trace we need to make sure
14344     * that the field is fully resolved before including this instruction.
14345     */
14346    bl      common_verifyField
14347#endif
14348    b       .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish          @ resume
14349
14350/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
14351
14352
14353.LOP_SPUT_OBJECT_VOLATILE_JUMBO_end:
14354    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
14355    SMP_DMB
14356    cmp     r1, #0                      @ stored a null object?
14357    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
14358    GOTO_OPCODE(ip)                     @ jump to next instruction
14359
14360    /* Continuation if the field has not yet been resolved.
14361     * r1:  AAAAaaaa field ref
14362     * r10: dvmDex->pResFields
14363     */
14364.LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve:
14365    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
14366#if defined(WITH_JIT)
14367    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14368#endif
14369    EXPORT_PC()                         @ resolve() could throw, so export now
14370    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14371    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14372    cmp     r0, #0                      @ success?
14373    beq     common_exceptionThrown      @ no, handle exception
14374#if defined(WITH_JIT)
14375    /*
14376     * If the JIT is actively building a trace we need to make sure
14377     * that the field is fully resolved before including this instruction.
14378     */
14379    bl      common_verifyField
14380#endif
14381    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish          @ resume
14382
14383
14384    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
14385    .global dvmAsmSisterEnd
14386dvmAsmSisterEnd:
14387
14388
14389    .global dvmAsmAltInstructionStart
14390    .type   dvmAsmAltInstructionStart, %function
14391    .text
14392
14393dvmAsmAltInstructionStart = .L_ALT_OP_NOP
14394/* ------------------------------ */
14395    .balign 64
14396.L_ALT_OP_NOP: /* 0x00 */
14397/* File: armv5te/alt_stub.S */
14398/*
14399 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14400 * any interesting requests and then jump to the real instruction
14401 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14402 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14403 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14404 * bail to the real handler if breakFlags==0.
14405 */
14406    ldrb   r3, [rSELF, #offThread_breakFlags]
14407    adrl   lr, dvmAsmInstructionStart + (0 * 64)
14408    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14409    cmp    r3, #0
14410    bxeq   lr                   @ nothing to do - jump to real handler
14411    EXPORT_PC()
14412    mov    r0, rPC              @ arg0
14413    mov    r1, rFP              @ arg1
14414    mov    r2, rSELF            @ arg2
14415    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14416
14417/* ------------------------------ */
14418    .balign 64
14419.L_ALT_OP_MOVE: /* 0x01 */
14420/* File: armv5te/alt_stub.S */
14421/*
14422 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14423 * any interesting requests and then jump to the real instruction
14424 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14425 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14426 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14427 * bail to the real handler if breakFlags==0.
14428 */
14429    ldrb   r3, [rSELF, #offThread_breakFlags]
14430    adrl   lr, dvmAsmInstructionStart + (1 * 64)
14431    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14432    cmp    r3, #0
14433    bxeq   lr                   @ nothing to do - jump to real handler
14434    EXPORT_PC()
14435    mov    r0, rPC              @ arg0
14436    mov    r1, rFP              @ arg1
14437    mov    r2, rSELF            @ arg2
14438    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14439
14440/* ------------------------------ */
14441    .balign 64
14442.L_ALT_OP_MOVE_FROM16: /* 0x02 */
14443/* File: armv5te/alt_stub.S */
14444/*
14445 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14446 * any interesting requests and then jump to the real instruction
14447 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14448 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14449 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14450 * bail to the real handler if breakFlags==0.
14451 */
14452    ldrb   r3, [rSELF, #offThread_breakFlags]
14453    adrl   lr, dvmAsmInstructionStart + (2 * 64)
14454    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14455    cmp    r3, #0
14456    bxeq   lr                   @ nothing to do - jump to real handler
14457    EXPORT_PC()
14458    mov    r0, rPC              @ arg0
14459    mov    r1, rFP              @ arg1
14460    mov    r2, rSELF            @ arg2
14461    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14462
14463/* ------------------------------ */
14464    .balign 64
14465.L_ALT_OP_MOVE_16: /* 0x03 */
14466/* File: armv5te/alt_stub.S */
14467/*
14468 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14469 * any interesting requests and then jump to the real instruction
14470 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14471 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14472 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14473 * bail to the real handler if breakFlags==0.
14474 */
14475    ldrb   r3, [rSELF, #offThread_breakFlags]
14476    adrl   lr, dvmAsmInstructionStart + (3 * 64)
14477    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14478    cmp    r3, #0
14479    bxeq   lr                   @ nothing to do - jump to real handler
14480    EXPORT_PC()
14481    mov    r0, rPC              @ arg0
14482    mov    r1, rFP              @ arg1
14483    mov    r2, rSELF            @ arg2
14484    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14485
14486/* ------------------------------ */
14487    .balign 64
14488.L_ALT_OP_MOVE_WIDE: /* 0x04 */
14489/* File: armv5te/alt_stub.S */
14490/*
14491 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14492 * any interesting requests and then jump to the real instruction
14493 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14494 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14495 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14496 * bail to the real handler if breakFlags==0.
14497 */
14498    ldrb   r3, [rSELF, #offThread_breakFlags]
14499    adrl   lr, dvmAsmInstructionStart + (4 * 64)
14500    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14501    cmp    r3, #0
14502    bxeq   lr                   @ nothing to do - jump to real handler
14503    EXPORT_PC()
14504    mov    r0, rPC              @ arg0
14505    mov    r1, rFP              @ arg1
14506    mov    r2, rSELF            @ arg2
14507    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14508
14509/* ------------------------------ */
14510    .balign 64
14511.L_ALT_OP_MOVE_WIDE_FROM16: /* 0x05 */
14512/* File: armv5te/alt_stub.S */
14513/*
14514 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14515 * any interesting requests and then jump to the real instruction
14516 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14517 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14518 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14519 * bail to the real handler if breakFlags==0.
14520 */
14521    ldrb   r3, [rSELF, #offThread_breakFlags]
14522    adrl   lr, dvmAsmInstructionStart + (5 * 64)
14523    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14524    cmp    r3, #0
14525    bxeq   lr                   @ nothing to do - jump to real handler
14526    EXPORT_PC()
14527    mov    r0, rPC              @ arg0
14528    mov    r1, rFP              @ arg1
14529    mov    r2, rSELF            @ arg2
14530    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14531
14532/* ------------------------------ */
14533    .balign 64
14534.L_ALT_OP_MOVE_WIDE_16: /* 0x06 */
14535/* File: armv5te/alt_stub.S */
14536/*
14537 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14538 * any interesting requests and then jump to the real instruction
14539 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14540 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14541 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14542 * bail to the real handler if breakFlags==0.
14543 */
14544    ldrb   r3, [rSELF, #offThread_breakFlags]
14545    adrl   lr, dvmAsmInstructionStart + (6 * 64)
14546    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14547    cmp    r3, #0
14548    bxeq   lr                   @ nothing to do - jump to real handler
14549    EXPORT_PC()
14550    mov    r0, rPC              @ arg0
14551    mov    r1, rFP              @ arg1
14552    mov    r2, rSELF            @ arg2
14553    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14554
14555/* ------------------------------ */
14556    .balign 64
14557.L_ALT_OP_MOVE_OBJECT: /* 0x07 */
14558/* File: armv5te/alt_stub.S */
14559/*
14560 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14561 * any interesting requests and then jump to the real instruction
14562 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14563 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14564 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14565 * bail to the real handler if breakFlags==0.
14566 */
14567    ldrb   r3, [rSELF, #offThread_breakFlags]
14568    adrl   lr, dvmAsmInstructionStart + (7 * 64)
14569    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14570    cmp    r3, #0
14571    bxeq   lr                   @ nothing to do - jump to real handler
14572    EXPORT_PC()
14573    mov    r0, rPC              @ arg0
14574    mov    r1, rFP              @ arg1
14575    mov    r2, rSELF            @ arg2
14576    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14577
14578/* ------------------------------ */
14579    .balign 64
14580.L_ALT_OP_MOVE_OBJECT_FROM16: /* 0x08 */
14581/* File: armv5te/alt_stub.S */
14582/*
14583 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14584 * any interesting requests and then jump to the real instruction
14585 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14586 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14587 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14588 * bail to the real handler if breakFlags==0.
14589 */
14590    ldrb   r3, [rSELF, #offThread_breakFlags]
14591    adrl   lr, dvmAsmInstructionStart + (8 * 64)
14592    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14593    cmp    r3, #0
14594    bxeq   lr                   @ nothing to do - jump to real handler
14595    EXPORT_PC()
14596    mov    r0, rPC              @ arg0
14597    mov    r1, rFP              @ arg1
14598    mov    r2, rSELF            @ arg2
14599    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14600
14601/* ------------------------------ */
14602    .balign 64
14603.L_ALT_OP_MOVE_OBJECT_16: /* 0x09 */
14604/* File: armv5te/alt_stub.S */
14605/*
14606 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14607 * any interesting requests and then jump to the real instruction
14608 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14609 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14610 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14611 * bail to the real handler if breakFlags==0.
14612 */
14613    ldrb   r3, [rSELF, #offThread_breakFlags]
14614    adrl   lr, dvmAsmInstructionStart + (9 * 64)
14615    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14616    cmp    r3, #0
14617    bxeq   lr                   @ nothing to do - jump to real handler
14618    EXPORT_PC()
14619    mov    r0, rPC              @ arg0
14620    mov    r1, rFP              @ arg1
14621    mov    r2, rSELF            @ arg2
14622    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14623
14624/* ------------------------------ */
14625    .balign 64
14626.L_ALT_OP_MOVE_RESULT: /* 0x0a */
14627/* File: armv5te/alt_stub.S */
14628/*
14629 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14630 * any interesting requests and then jump to the real instruction
14631 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14632 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14633 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14634 * bail to the real handler if breakFlags==0.
14635 */
14636    ldrb   r3, [rSELF, #offThread_breakFlags]
14637    adrl   lr, dvmAsmInstructionStart + (10 * 64)
14638    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14639    cmp    r3, #0
14640    bxeq   lr                   @ nothing to do - jump to real handler
14641    EXPORT_PC()
14642    mov    r0, rPC              @ arg0
14643    mov    r1, rFP              @ arg1
14644    mov    r2, rSELF            @ arg2
14645    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14646
14647/* ------------------------------ */
14648    .balign 64
14649.L_ALT_OP_MOVE_RESULT_WIDE: /* 0x0b */
14650/* File: armv5te/alt_stub.S */
14651/*
14652 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14653 * any interesting requests and then jump to the real instruction
14654 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14655 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14656 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14657 * bail to the real handler if breakFlags==0.
14658 */
14659    ldrb   r3, [rSELF, #offThread_breakFlags]
14660    adrl   lr, dvmAsmInstructionStart + (11 * 64)
14661    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14662    cmp    r3, #0
14663    bxeq   lr                   @ nothing to do - jump to real handler
14664    EXPORT_PC()
14665    mov    r0, rPC              @ arg0
14666    mov    r1, rFP              @ arg1
14667    mov    r2, rSELF            @ arg2
14668    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14669
14670/* ------------------------------ */
14671    .balign 64
14672.L_ALT_OP_MOVE_RESULT_OBJECT: /* 0x0c */
14673/* File: armv5te/alt_stub.S */
14674/*
14675 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14676 * any interesting requests and then jump to the real instruction
14677 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14678 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14679 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14680 * bail to the real handler if breakFlags==0.
14681 */
14682    ldrb   r3, [rSELF, #offThread_breakFlags]
14683    adrl   lr, dvmAsmInstructionStart + (12 * 64)
14684    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14685    cmp    r3, #0
14686    bxeq   lr                   @ nothing to do - jump to real handler
14687    EXPORT_PC()
14688    mov    r0, rPC              @ arg0
14689    mov    r1, rFP              @ arg1
14690    mov    r2, rSELF            @ arg2
14691    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14692
14693/* ------------------------------ */
14694    .balign 64
14695.L_ALT_OP_MOVE_EXCEPTION: /* 0x0d */
14696/* File: armv5te/alt_stub.S */
14697/*
14698 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14699 * any interesting requests and then jump to the real instruction
14700 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14701 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14702 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14703 * bail to the real handler if breakFlags==0.
14704 */
14705    ldrb   r3, [rSELF, #offThread_breakFlags]
14706    adrl   lr, dvmAsmInstructionStart + (13 * 64)
14707    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14708    cmp    r3, #0
14709    bxeq   lr                   @ nothing to do - jump to real handler
14710    EXPORT_PC()
14711    mov    r0, rPC              @ arg0
14712    mov    r1, rFP              @ arg1
14713    mov    r2, rSELF            @ arg2
14714    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14715
14716/* ------------------------------ */
14717    .balign 64
14718.L_ALT_OP_RETURN_VOID: /* 0x0e */
14719/* File: armv5te/alt_stub.S */
14720/*
14721 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14722 * any interesting requests and then jump to the real instruction
14723 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14724 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14725 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14726 * bail to the real handler if breakFlags==0.
14727 */
14728    ldrb   r3, [rSELF, #offThread_breakFlags]
14729    adrl   lr, dvmAsmInstructionStart + (14 * 64)
14730    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14731    cmp    r3, #0
14732    bxeq   lr                   @ nothing to do - jump to real handler
14733    EXPORT_PC()
14734    mov    r0, rPC              @ arg0
14735    mov    r1, rFP              @ arg1
14736    mov    r2, rSELF            @ arg2
14737    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14738
14739/* ------------------------------ */
14740    .balign 64
14741.L_ALT_OP_RETURN: /* 0x0f */
14742/* File: armv5te/alt_stub.S */
14743/*
14744 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14745 * any interesting requests and then jump to the real instruction
14746 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14747 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14748 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14749 * bail to the real handler if breakFlags==0.
14750 */
14751    ldrb   r3, [rSELF, #offThread_breakFlags]
14752    adrl   lr, dvmAsmInstructionStart + (15 * 64)
14753    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14754    cmp    r3, #0
14755    bxeq   lr                   @ nothing to do - jump to real handler
14756    EXPORT_PC()
14757    mov    r0, rPC              @ arg0
14758    mov    r1, rFP              @ arg1
14759    mov    r2, rSELF            @ arg2
14760    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14761
14762/* ------------------------------ */
14763    .balign 64
14764.L_ALT_OP_RETURN_WIDE: /* 0x10 */
14765/* File: armv5te/alt_stub.S */
14766/*
14767 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14768 * any interesting requests and then jump to the real instruction
14769 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14770 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14771 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14772 * bail to the real handler if breakFlags==0.
14773 */
14774    ldrb   r3, [rSELF, #offThread_breakFlags]
14775    adrl   lr, dvmAsmInstructionStart + (16 * 64)
14776    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14777    cmp    r3, #0
14778    bxeq   lr                   @ nothing to do - jump to real handler
14779    EXPORT_PC()
14780    mov    r0, rPC              @ arg0
14781    mov    r1, rFP              @ arg1
14782    mov    r2, rSELF            @ arg2
14783    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14784
14785/* ------------------------------ */
14786    .balign 64
14787.L_ALT_OP_RETURN_OBJECT: /* 0x11 */
14788/* File: armv5te/alt_stub.S */
14789/*
14790 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14791 * any interesting requests and then jump to the real instruction
14792 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14793 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14794 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14795 * bail to the real handler if breakFlags==0.
14796 */
14797    ldrb   r3, [rSELF, #offThread_breakFlags]
14798    adrl   lr, dvmAsmInstructionStart + (17 * 64)
14799    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14800    cmp    r3, #0
14801    bxeq   lr                   @ nothing to do - jump to real handler
14802    EXPORT_PC()
14803    mov    r0, rPC              @ arg0
14804    mov    r1, rFP              @ arg1
14805    mov    r2, rSELF            @ arg2
14806    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14807
14808/* ------------------------------ */
14809    .balign 64
14810.L_ALT_OP_CONST_4: /* 0x12 */
14811/* File: armv5te/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    ldrb   r3, [rSELF, #offThread_breakFlags]
14821    adrl   lr, dvmAsmInstructionStart + (18 * 64)
14822    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14823    cmp    r3, #0
14824    bxeq   lr                   @ nothing to do - jump to real handler
14825    EXPORT_PC()
14826    mov    r0, rPC              @ arg0
14827    mov    r1, rFP              @ arg1
14828    mov    r2, rSELF            @ arg2
14829    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14830
14831/* ------------------------------ */
14832    .balign 64
14833.L_ALT_OP_CONST_16: /* 0x13 */
14834/* File: armv5te/alt_stub.S */
14835/*
14836 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14837 * any interesting requests and then jump to the real instruction
14838 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14839 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14840 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14841 * bail to the real handler if breakFlags==0.
14842 */
14843    ldrb   r3, [rSELF, #offThread_breakFlags]
14844    adrl   lr, dvmAsmInstructionStart + (19 * 64)
14845    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14846    cmp    r3, #0
14847    bxeq   lr                   @ nothing to do - jump to real handler
14848    EXPORT_PC()
14849    mov    r0, rPC              @ arg0
14850    mov    r1, rFP              @ arg1
14851    mov    r2, rSELF            @ arg2
14852    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14853
14854/* ------------------------------ */
14855    .balign 64
14856.L_ALT_OP_CONST: /* 0x14 */
14857/* File: armv5te/alt_stub.S */
14858/*
14859 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14860 * any interesting requests and then jump to the real instruction
14861 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14862 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14863 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14864 * bail to the real handler if breakFlags==0.
14865 */
14866    ldrb   r3, [rSELF, #offThread_breakFlags]
14867    adrl   lr, dvmAsmInstructionStart + (20 * 64)
14868    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14869    cmp    r3, #0
14870    bxeq   lr                   @ nothing to do - jump to real handler
14871    EXPORT_PC()
14872    mov    r0, rPC              @ arg0
14873    mov    r1, rFP              @ arg1
14874    mov    r2, rSELF            @ arg2
14875    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14876
14877/* ------------------------------ */
14878    .balign 64
14879.L_ALT_OP_CONST_HIGH16: /* 0x15 */
14880/* File: armv5te/alt_stub.S */
14881/*
14882 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14883 * any interesting requests and then jump to the real instruction
14884 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14885 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14886 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14887 * bail to the real handler if breakFlags==0.
14888 */
14889    ldrb   r3, [rSELF, #offThread_breakFlags]
14890    adrl   lr, dvmAsmInstructionStart + (21 * 64)
14891    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14892    cmp    r3, #0
14893    bxeq   lr                   @ nothing to do - jump to real handler
14894    EXPORT_PC()
14895    mov    r0, rPC              @ arg0
14896    mov    r1, rFP              @ arg1
14897    mov    r2, rSELF            @ arg2
14898    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14899
14900/* ------------------------------ */
14901    .balign 64
14902.L_ALT_OP_CONST_WIDE_16: /* 0x16 */
14903/* File: armv5te/alt_stub.S */
14904/*
14905 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14906 * any interesting requests and then jump to the real instruction
14907 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14908 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14909 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14910 * bail to the real handler if breakFlags==0.
14911 */
14912    ldrb   r3, [rSELF, #offThread_breakFlags]
14913    adrl   lr, dvmAsmInstructionStart + (22 * 64)
14914    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14915    cmp    r3, #0
14916    bxeq   lr                   @ nothing to do - jump to real handler
14917    EXPORT_PC()
14918    mov    r0, rPC              @ arg0
14919    mov    r1, rFP              @ arg1
14920    mov    r2, rSELF            @ arg2
14921    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14922
14923/* ------------------------------ */
14924    .balign 64
14925.L_ALT_OP_CONST_WIDE_32: /* 0x17 */
14926/* File: armv5te/alt_stub.S */
14927/*
14928 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14929 * any interesting requests and then jump to the real instruction
14930 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14931 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14932 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14933 * bail to the real handler if breakFlags==0.
14934 */
14935    ldrb   r3, [rSELF, #offThread_breakFlags]
14936    adrl   lr, dvmAsmInstructionStart + (23 * 64)
14937    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14938    cmp    r3, #0
14939    bxeq   lr                   @ nothing to do - jump to real handler
14940    EXPORT_PC()
14941    mov    r0, rPC              @ arg0
14942    mov    r1, rFP              @ arg1
14943    mov    r2, rSELF            @ arg2
14944    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14945
14946/* ------------------------------ */
14947    .balign 64
14948.L_ALT_OP_CONST_WIDE: /* 0x18 */
14949/* File: armv5te/alt_stub.S */
14950/*
14951 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14952 * any interesting requests and then jump to the real instruction
14953 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14954 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14955 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14956 * bail to the real handler if breakFlags==0.
14957 */
14958    ldrb   r3, [rSELF, #offThread_breakFlags]
14959    adrl   lr, dvmAsmInstructionStart + (24 * 64)
14960    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14961    cmp    r3, #0
14962    bxeq   lr                   @ nothing to do - jump to real handler
14963    EXPORT_PC()
14964    mov    r0, rPC              @ arg0
14965    mov    r1, rFP              @ arg1
14966    mov    r2, rSELF            @ arg2
14967    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14968
14969/* ------------------------------ */
14970    .balign 64
14971.L_ALT_OP_CONST_WIDE_HIGH16: /* 0x19 */
14972/* File: armv5te/alt_stub.S */
14973/*
14974 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14975 * any interesting requests and then jump to the real instruction
14976 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14977 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14978 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14979 * bail to the real handler if breakFlags==0.
14980 */
14981    ldrb   r3, [rSELF, #offThread_breakFlags]
14982    adrl   lr, dvmAsmInstructionStart + (25 * 64)
14983    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14984    cmp    r3, #0
14985    bxeq   lr                   @ nothing to do - jump to real handler
14986    EXPORT_PC()
14987    mov    r0, rPC              @ arg0
14988    mov    r1, rFP              @ arg1
14989    mov    r2, rSELF            @ arg2
14990    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14991
14992/* ------------------------------ */
14993    .balign 64
14994.L_ALT_OP_CONST_STRING: /* 0x1a */
14995/* File: armv5te/alt_stub.S */
14996/*
14997 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14998 * any interesting requests and then jump to the real instruction
14999 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15000 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15001 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15002 * bail to the real handler if breakFlags==0.
15003 */
15004    ldrb   r3, [rSELF, #offThread_breakFlags]
15005    adrl   lr, dvmAsmInstructionStart + (26 * 64)
15006    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15007    cmp    r3, #0
15008    bxeq   lr                   @ nothing to do - jump to real handler
15009    EXPORT_PC()
15010    mov    r0, rPC              @ arg0
15011    mov    r1, rFP              @ arg1
15012    mov    r2, rSELF            @ arg2
15013    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15014
15015/* ------------------------------ */
15016    .balign 64
15017.L_ALT_OP_CONST_STRING_JUMBO: /* 0x1b */
15018/* File: armv5te/alt_stub.S */
15019/*
15020 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15021 * any interesting requests and then jump to the real instruction
15022 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15023 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15024 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15025 * bail to the real handler if breakFlags==0.
15026 */
15027    ldrb   r3, [rSELF, #offThread_breakFlags]
15028    adrl   lr, dvmAsmInstructionStart + (27 * 64)
15029    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15030    cmp    r3, #0
15031    bxeq   lr                   @ nothing to do - jump to real handler
15032    EXPORT_PC()
15033    mov    r0, rPC              @ arg0
15034    mov    r1, rFP              @ arg1
15035    mov    r2, rSELF            @ arg2
15036    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15037
15038/* ------------------------------ */
15039    .balign 64
15040.L_ALT_OP_CONST_CLASS: /* 0x1c */
15041/* File: armv5te/alt_stub.S */
15042/*
15043 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15044 * any interesting requests and then jump to the real instruction
15045 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15046 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15047 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15048 * bail to the real handler if breakFlags==0.
15049 */
15050    ldrb   r3, [rSELF, #offThread_breakFlags]
15051    adrl   lr, dvmAsmInstructionStart + (28 * 64)
15052    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15053    cmp    r3, #0
15054    bxeq   lr                   @ nothing to do - jump to real handler
15055    EXPORT_PC()
15056    mov    r0, rPC              @ arg0
15057    mov    r1, rFP              @ arg1
15058    mov    r2, rSELF            @ arg2
15059    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15060
15061/* ------------------------------ */
15062    .balign 64
15063.L_ALT_OP_MONITOR_ENTER: /* 0x1d */
15064/* File: armv5te/alt_stub.S */
15065/*
15066 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15067 * any interesting requests and then jump to the real instruction
15068 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15069 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15070 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15071 * bail to the real handler if breakFlags==0.
15072 */
15073    ldrb   r3, [rSELF, #offThread_breakFlags]
15074    adrl   lr, dvmAsmInstructionStart + (29 * 64)
15075    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15076    cmp    r3, #0
15077    bxeq   lr                   @ nothing to do - jump to real handler
15078    EXPORT_PC()
15079    mov    r0, rPC              @ arg0
15080    mov    r1, rFP              @ arg1
15081    mov    r2, rSELF            @ arg2
15082    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15083
15084/* ------------------------------ */
15085    .balign 64
15086.L_ALT_OP_MONITOR_EXIT: /* 0x1e */
15087/* File: armv5te/alt_stub.S */
15088/*
15089 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15090 * any interesting requests and then jump to the real instruction
15091 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15092 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15093 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15094 * bail to the real handler if breakFlags==0.
15095 */
15096    ldrb   r3, [rSELF, #offThread_breakFlags]
15097    adrl   lr, dvmAsmInstructionStart + (30 * 64)
15098    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15099    cmp    r3, #0
15100    bxeq   lr                   @ nothing to do - jump to real handler
15101    EXPORT_PC()
15102    mov    r0, rPC              @ arg0
15103    mov    r1, rFP              @ arg1
15104    mov    r2, rSELF            @ arg2
15105    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15106
15107/* ------------------------------ */
15108    .balign 64
15109.L_ALT_OP_CHECK_CAST: /* 0x1f */
15110/* File: armv5te/alt_stub.S */
15111/*
15112 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15113 * any interesting requests and then jump to the real instruction
15114 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15115 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15116 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15117 * bail to the real handler if breakFlags==0.
15118 */
15119    ldrb   r3, [rSELF, #offThread_breakFlags]
15120    adrl   lr, dvmAsmInstructionStart + (31 * 64)
15121    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15122    cmp    r3, #0
15123    bxeq   lr                   @ nothing to do - jump to real handler
15124    EXPORT_PC()
15125    mov    r0, rPC              @ arg0
15126    mov    r1, rFP              @ arg1
15127    mov    r2, rSELF            @ arg2
15128    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15129
15130/* ------------------------------ */
15131    .balign 64
15132.L_ALT_OP_INSTANCE_OF: /* 0x20 */
15133/* File: armv5te/alt_stub.S */
15134/*
15135 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15136 * any interesting requests and then jump to the real instruction
15137 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15138 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15139 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15140 * bail to the real handler if breakFlags==0.
15141 */
15142    ldrb   r3, [rSELF, #offThread_breakFlags]
15143    adrl   lr, dvmAsmInstructionStart + (32 * 64)
15144    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15145    cmp    r3, #0
15146    bxeq   lr                   @ nothing to do - jump to real handler
15147    EXPORT_PC()
15148    mov    r0, rPC              @ arg0
15149    mov    r1, rFP              @ arg1
15150    mov    r2, rSELF            @ arg2
15151    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15152
15153/* ------------------------------ */
15154    .balign 64
15155.L_ALT_OP_ARRAY_LENGTH: /* 0x21 */
15156/* File: armv5te/alt_stub.S */
15157/*
15158 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15159 * any interesting requests and then jump to the real instruction
15160 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15161 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15162 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15163 * bail to the real handler if breakFlags==0.
15164 */
15165    ldrb   r3, [rSELF, #offThread_breakFlags]
15166    adrl   lr, dvmAsmInstructionStart + (33 * 64)
15167    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15168    cmp    r3, #0
15169    bxeq   lr                   @ nothing to do - jump to real handler
15170    EXPORT_PC()
15171    mov    r0, rPC              @ arg0
15172    mov    r1, rFP              @ arg1
15173    mov    r2, rSELF            @ arg2
15174    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15175
15176/* ------------------------------ */
15177    .balign 64
15178.L_ALT_OP_NEW_INSTANCE: /* 0x22 */
15179/* File: armv5te/alt_stub.S */
15180/*
15181 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15182 * any interesting requests and then jump to the real instruction
15183 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15184 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15185 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15186 * bail to the real handler if breakFlags==0.
15187 */
15188    ldrb   r3, [rSELF, #offThread_breakFlags]
15189    adrl   lr, dvmAsmInstructionStart + (34 * 64)
15190    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15191    cmp    r3, #0
15192    bxeq   lr                   @ nothing to do - jump to real handler
15193    EXPORT_PC()
15194    mov    r0, rPC              @ arg0
15195    mov    r1, rFP              @ arg1
15196    mov    r2, rSELF            @ arg2
15197    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15198
15199/* ------------------------------ */
15200    .balign 64
15201.L_ALT_OP_NEW_ARRAY: /* 0x23 */
15202/* File: armv5te/alt_stub.S */
15203/*
15204 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15205 * any interesting requests and then jump to the real instruction
15206 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15207 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15208 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15209 * bail to the real handler if breakFlags==0.
15210 */
15211    ldrb   r3, [rSELF, #offThread_breakFlags]
15212    adrl   lr, dvmAsmInstructionStart + (35 * 64)
15213    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15214    cmp    r3, #0
15215    bxeq   lr                   @ nothing to do - jump to real handler
15216    EXPORT_PC()
15217    mov    r0, rPC              @ arg0
15218    mov    r1, rFP              @ arg1
15219    mov    r2, rSELF            @ arg2
15220    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15221
15222/* ------------------------------ */
15223    .balign 64
15224.L_ALT_OP_FILLED_NEW_ARRAY: /* 0x24 */
15225/* File: armv5te/alt_stub.S */
15226/*
15227 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15228 * any interesting requests and then jump to the real instruction
15229 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15230 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15231 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15232 * bail to the real handler if breakFlags==0.
15233 */
15234    ldrb   r3, [rSELF, #offThread_breakFlags]
15235    adrl   lr, dvmAsmInstructionStart + (36 * 64)
15236    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15237    cmp    r3, #0
15238    bxeq   lr                   @ nothing to do - jump to real handler
15239    EXPORT_PC()
15240    mov    r0, rPC              @ arg0
15241    mov    r1, rFP              @ arg1
15242    mov    r2, rSELF            @ arg2
15243    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15244
15245/* ------------------------------ */
15246    .balign 64
15247.L_ALT_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
15248/* File: armv5te/alt_stub.S */
15249/*
15250 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15251 * any interesting requests and then jump to the real instruction
15252 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15253 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15254 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15255 * bail to the real handler if breakFlags==0.
15256 */
15257    ldrb   r3, [rSELF, #offThread_breakFlags]
15258    adrl   lr, dvmAsmInstructionStart + (37 * 64)
15259    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15260    cmp    r3, #0
15261    bxeq   lr                   @ nothing to do - jump to real handler
15262    EXPORT_PC()
15263    mov    r0, rPC              @ arg0
15264    mov    r1, rFP              @ arg1
15265    mov    r2, rSELF            @ arg2
15266    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15267
15268/* ------------------------------ */
15269    .balign 64
15270.L_ALT_OP_FILL_ARRAY_DATA: /* 0x26 */
15271/* File: armv5te/alt_stub.S */
15272/*
15273 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15274 * any interesting requests and then jump to the real instruction
15275 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15276 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15277 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15278 * bail to the real handler if breakFlags==0.
15279 */
15280    ldrb   r3, [rSELF, #offThread_breakFlags]
15281    adrl   lr, dvmAsmInstructionStart + (38 * 64)
15282    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15283    cmp    r3, #0
15284    bxeq   lr                   @ nothing to do - jump to real handler
15285    EXPORT_PC()
15286    mov    r0, rPC              @ arg0
15287    mov    r1, rFP              @ arg1
15288    mov    r2, rSELF            @ arg2
15289    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15290
15291/* ------------------------------ */
15292    .balign 64
15293.L_ALT_OP_THROW: /* 0x27 */
15294/* File: armv5te/alt_stub.S */
15295/*
15296 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15297 * any interesting requests and then jump to the real instruction
15298 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15299 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15300 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15301 * bail to the real handler if breakFlags==0.
15302 */
15303    ldrb   r3, [rSELF, #offThread_breakFlags]
15304    adrl   lr, dvmAsmInstructionStart + (39 * 64)
15305    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15306    cmp    r3, #0
15307    bxeq   lr                   @ nothing to do - jump to real handler
15308    EXPORT_PC()
15309    mov    r0, rPC              @ arg0
15310    mov    r1, rFP              @ arg1
15311    mov    r2, rSELF            @ arg2
15312    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15313
15314/* ------------------------------ */
15315    .balign 64
15316.L_ALT_OP_GOTO: /* 0x28 */
15317/* File: armv5te/alt_stub.S */
15318/*
15319 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15320 * any interesting requests and then jump to the real instruction
15321 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15322 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15323 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15324 * bail to the real handler if breakFlags==0.
15325 */
15326    ldrb   r3, [rSELF, #offThread_breakFlags]
15327    adrl   lr, dvmAsmInstructionStart + (40 * 64)
15328    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15329    cmp    r3, #0
15330    bxeq   lr                   @ nothing to do - jump to real handler
15331    EXPORT_PC()
15332    mov    r0, rPC              @ arg0
15333    mov    r1, rFP              @ arg1
15334    mov    r2, rSELF            @ arg2
15335    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15336
15337/* ------------------------------ */
15338    .balign 64
15339.L_ALT_OP_GOTO_16: /* 0x29 */
15340/* File: armv5te/alt_stub.S */
15341/*
15342 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15343 * any interesting requests and then jump to the real instruction
15344 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15345 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15346 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15347 * bail to the real handler if breakFlags==0.
15348 */
15349    ldrb   r3, [rSELF, #offThread_breakFlags]
15350    adrl   lr, dvmAsmInstructionStart + (41 * 64)
15351    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15352    cmp    r3, #0
15353    bxeq   lr                   @ nothing to do - jump to real handler
15354    EXPORT_PC()
15355    mov    r0, rPC              @ arg0
15356    mov    r1, rFP              @ arg1
15357    mov    r2, rSELF            @ arg2
15358    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15359
15360/* ------------------------------ */
15361    .balign 64
15362.L_ALT_OP_GOTO_32: /* 0x2a */
15363/* File: armv5te/alt_stub.S */
15364/*
15365 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15366 * any interesting requests and then jump to the real instruction
15367 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15368 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15369 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15370 * bail to the real handler if breakFlags==0.
15371 */
15372    ldrb   r3, [rSELF, #offThread_breakFlags]
15373    adrl   lr, dvmAsmInstructionStart + (42 * 64)
15374    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15375    cmp    r3, #0
15376    bxeq   lr                   @ nothing to do - jump to real handler
15377    EXPORT_PC()
15378    mov    r0, rPC              @ arg0
15379    mov    r1, rFP              @ arg1
15380    mov    r2, rSELF            @ arg2
15381    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15382
15383/* ------------------------------ */
15384    .balign 64
15385.L_ALT_OP_PACKED_SWITCH: /* 0x2b */
15386/* File: armv5te/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    ldrb   r3, [rSELF, #offThread_breakFlags]
15396    adrl   lr, dvmAsmInstructionStart + (43 * 64)
15397    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15398    cmp    r3, #0
15399    bxeq   lr                   @ nothing to do - jump to real handler
15400    EXPORT_PC()
15401    mov    r0, rPC              @ arg0
15402    mov    r1, rFP              @ arg1
15403    mov    r2, rSELF            @ arg2
15404    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15405
15406/* ------------------------------ */
15407    .balign 64
15408.L_ALT_OP_SPARSE_SWITCH: /* 0x2c */
15409/* File: armv5te/alt_stub.S */
15410/*
15411 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15412 * any interesting requests and then jump to the real instruction
15413 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15414 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15415 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15416 * bail to the real handler if breakFlags==0.
15417 */
15418    ldrb   r3, [rSELF, #offThread_breakFlags]
15419    adrl   lr, dvmAsmInstructionStart + (44 * 64)
15420    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15421    cmp    r3, #0
15422    bxeq   lr                   @ nothing to do - jump to real handler
15423    EXPORT_PC()
15424    mov    r0, rPC              @ arg0
15425    mov    r1, rFP              @ arg1
15426    mov    r2, rSELF            @ arg2
15427    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15428
15429/* ------------------------------ */
15430    .balign 64
15431.L_ALT_OP_CMPL_FLOAT: /* 0x2d */
15432/* File: armv5te/alt_stub.S */
15433/*
15434 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15435 * any interesting requests and then jump to the real instruction
15436 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15437 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15438 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15439 * bail to the real handler if breakFlags==0.
15440 */
15441    ldrb   r3, [rSELF, #offThread_breakFlags]
15442    adrl   lr, dvmAsmInstructionStart + (45 * 64)
15443    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15444    cmp    r3, #0
15445    bxeq   lr                   @ nothing to do - jump to real handler
15446    EXPORT_PC()
15447    mov    r0, rPC              @ arg0
15448    mov    r1, rFP              @ arg1
15449    mov    r2, rSELF            @ arg2
15450    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15451
15452/* ------------------------------ */
15453    .balign 64
15454.L_ALT_OP_CMPG_FLOAT: /* 0x2e */
15455/* File: armv5te/alt_stub.S */
15456/*
15457 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15458 * any interesting requests and then jump to the real instruction
15459 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15460 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15461 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15462 * bail to the real handler if breakFlags==0.
15463 */
15464    ldrb   r3, [rSELF, #offThread_breakFlags]
15465    adrl   lr, dvmAsmInstructionStart + (46 * 64)
15466    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15467    cmp    r3, #0
15468    bxeq   lr                   @ nothing to do - jump to real handler
15469    EXPORT_PC()
15470    mov    r0, rPC              @ arg0
15471    mov    r1, rFP              @ arg1
15472    mov    r2, rSELF            @ arg2
15473    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15474
15475/* ------------------------------ */
15476    .balign 64
15477.L_ALT_OP_CMPL_DOUBLE: /* 0x2f */
15478/* File: armv5te/alt_stub.S */
15479/*
15480 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15481 * any interesting requests and then jump to the real instruction
15482 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15483 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15484 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15485 * bail to the real handler if breakFlags==0.
15486 */
15487    ldrb   r3, [rSELF, #offThread_breakFlags]
15488    adrl   lr, dvmAsmInstructionStart + (47 * 64)
15489    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15490    cmp    r3, #0
15491    bxeq   lr                   @ nothing to do - jump to real handler
15492    EXPORT_PC()
15493    mov    r0, rPC              @ arg0
15494    mov    r1, rFP              @ arg1
15495    mov    r2, rSELF            @ arg2
15496    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15497
15498/* ------------------------------ */
15499    .balign 64
15500.L_ALT_OP_CMPG_DOUBLE: /* 0x30 */
15501/* File: armv5te/alt_stub.S */
15502/*
15503 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15504 * any interesting requests and then jump to the real instruction
15505 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15506 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15507 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15508 * bail to the real handler if breakFlags==0.
15509 */
15510    ldrb   r3, [rSELF, #offThread_breakFlags]
15511    adrl   lr, dvmAsmInstructionStart + (48 * 64)
15512    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15513    cmp    r3, #0
15514    bxeq   lr                   @ nothing to do - jump to real handler
15515    EXPORT_PC()
15516    mov    r0, rPC              @ arg0
15517    mov    r1, rFP              @ arg1
15518    mov    r2, rSELF            @ arg2
15519    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15520
15521/* ------------------------------ */
15522    .balign 64
15523.L_ALT_OP_CMP_LONG: /* 0x31 */
15524/* File: armv5te/alt_stub.S */
15525/*
15526 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15527 * any interesting requests and then jump to the real instruction
15528 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15529 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15530 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15531 * bail to the real handler if breakFlags==0.
15532 */
15533    ldrb   r3, [rSELF, #offThread_breakFlags]
15534    adrl   lr, dvmAsmInstructionStart + (49 * 64)
15535    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15536    cmp    r3, #0
15537    bxeq   lr                   @ nothing to do - jump to real handler
15538    EXPORT_PC()
15539    mov    r0, rPC              @ arg0
15540    mov    r1, rFP              @ arg1
15541    mov    r2, rSELF            @ arg2
15542    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15543
15544/* ------------------------------ */
15545    .balign 64
15546.L_ALT_OP_IF_EQ: /* 0x32 */
15547/* File: armv5te/alt_stub.S */
15548/*
15549 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15550 * any interesting requests and then jump to the real instruction
15551 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15552 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15553 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15554 * bail to the real handler if breakFlags==0.
15555 */
15556    ldrb   r3, [rSELF, #offThread_breakFlags]
15557    adrl   lr, dvmAsmInstructionStart + (50 * 64)
15558    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15559    cmp    r3, #0
15560    bxeq   lr                   @ nothing to do - jump to real handler
15561    EXPORT_PC()
15562    mov    r0, rPC              @ arg0
15563    mov    r1, rFP              @ arg1
15564    mov    r2, rSELF            @ arg2
15565    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15566
15567/* ------------------------------ */
15568    .balign 64
15569.L_ALT_OP_IF_NE: /* 0x33 */
15570/* File: armv5te/alt_stub.S */
15571/*
15572 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15573 * any interesting requests and then jump to the real instruction
15574 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15575 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15576 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15577 * bail to the real handler if breakFlags==0.
15578 */
15579    ldrb   r3, [rSELF, #offThread_breakFlags]
15580    adrl   lr, dvmAsmInstructionStart + (51 * 64)
15581    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15582    cmp    r3, #0
15583    bxeq   lr                   @ nothing to do - jump to real handler
15584    EXPORT_PC()
15585    mov    r0, rPC              @ arg0
15586    mov    r1, rFP              @ arg1
15587    mov    r2, rSELF            @ arg2
15588    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15589
15590/* ------------------------------ */
15591    .balign 64
15592.L_ALT_OP_IF_LT: /* 0x34 */
15593/* File: armv5te/alt_stub.S */
15594/*
15595 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15596 * any interesting requests and then jump to the real instruction
15597 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15598 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15599 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15600 * bail to the real handler if breakFlags==0.
15601 */
15602    ldrb   r3, [rSELF, #offThread_breakFlags]
15603    adrl   lr, dvmAsmInstructionStart + (52 * 64)
15604    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15605    cmp    r3, #0
15606    bxeq   lr                   @ nothing to do - jump to real handler
15607    EXPORT_PC()
15608    mov    r0, rPC              @ arg0
15609    mov    r1, rFP              @ arg1
15610    mov    r2, rSELF            @ arg2
15611    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15612
15613/* ------------------------------ */
15614    .balign 64
15615.L_ALT_OP_IF_GE: /* 0x35 */
15616/* File: armv5te/alt_stub.S */
15617/*
15618 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15619 * any interesting requests and then jump to the real instruction
15620 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15621 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15622 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15623 * bail to the real handler if breakFlags==0.
15624 */
15625    ldrb   r3, [rSELF, #offThread_breakFlags]
15626    adrl   lr, dvmAsmInstructionStart + (53 * 64)
15627    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15628    cmp    r3, #0
15629    bxeq   lr                   @ nothing to do - jump to real handler
15630    EXPORT_PC()
15631    mov    r0, rPC              @ arg0
15632    mov    r1, rFP              @ arg1
15633    mov    r2, rSELF            @ arg2
15634    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15635
15636/* ------------------------------ */
15637    .balign 64
15638.L_ALT_OP_IF_GT: /* 0x36 */
15639/* File: armv5te/alt_stub.S */
15640/*
15641 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15642 * any interesting requests and then jump to the real instruction
15643 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15644 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15645 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15646 * bail to the real handler if breakFlags==0.
15647 */
15648    ldrb   r3, [rSELF, #offThread_breakFlags]
15649    adrl   lr, dvmAsmInstructionStart + (54 * 64)
15650    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15651    cmp    r3, #0
15652    bxeq   lr                   @ nothing to do - jump to real handler
15653    EXPORT_PC()
15654    mov    r0, rPC              @ arg0
15655    mov    r1, rFP              @ arg1
15656    mov    r2, rSELF            @ arg2
15657    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15658
15659/* ------------------------------ */
15660    .balign 64
15661.L_ALT_OP_IF_LE: /* 0x37 */
15662/* File: armv5te/alt_stub.S */
15663/*
15664 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15665 * any interesting requests and then jump to the real instruction
15666 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15667 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15668 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15669 * bail to the real handler if breakFlags==0.
15670 */
15671    ldrb   r3, [rSELF, #offThread_breakFlags]
15672    adrl   lr, dvmAsmInstructionStart + (55 * 64)
15673    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15674    cmp    r3, #0
15675    bxeq   lr                   @ nothing to do - jump to real handler
15676    EXPORT_PC()
15677    mov    r0, rPC              @ arg0
15678    mov    r1, rFP              @ arg1
15679    mov    r2, rSELF            @ arg2
15680    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15681
15682/* ------------------------------ */
15683    .balign 64
15684.L_ALT_OP_IF_EQZ: /* 0x38 */
15685/* File: armv5te/alt_stub.S */
15686/*
15687 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15688 * any interesting requests and then jump to the real instruction
15689 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15690 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15691 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15692 * bail to the real handler if breakFlags==0.
15693 */
15694    ldrb   r3, [rSELF, #offThread_breakFlags]
15695    adrl   lr, dvmAsmInstructionStart + (56 * 64)
15696    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15697    cmp    r3, #0
15698    bxeq   lr                   @ nothing to do - jump to real handler
15699    EXPORT_PC()
15700    mov    r0, rPC              @ arg0
15701    mov    r1, rFP              @ arg1
15702    mov    r2, rSELF            @ arg2
15703    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15704
15705/* ------------------------------ */
15706    .balign 64
15707.L_ALT_OP_IF_NEZ: /* 0x39 */
15708/* File: armv5te/alt_stub.S */
15709/*
15710 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15711 * any interesting requests and then jump to the real instruction
15712 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15713 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15714 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15715 * bail to the real handler if breakFlags==0.
15716 */
15717    ldrb   r3, [rSELF, #offThread_breakFlags]
15718    adrl   lr, dvmAsmInstructionStart + (57 * 64)
15719    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15720    cmp    r3, #0
15721    bxeq   lr                   @ nothing to do - jump to real handler
15722    EXPORT_PC()
15723    mov    r0, rPC              @ arg0
15724    mov    r1, rFP              @ arg1
15725    mov    r2, rSELF            @ arg2
15726    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15727
15728/* ------------------------------ */
15729    .balign 64
15730.L_ALT_OP_IF_LTZ: /* 0x3a */
15731/* File: armv5te/alt_stub.S */
15732/*
15733 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15734 * any interesting requests and then jump to the real instruction
15735 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15736 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15737 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15738 * bail to the real handler if breakFlags==0.
15739 */
15740    ldrb   r3, [rSELF, #offThread_breakFlags]
15741    adrl   lr, dvmAsmInstructionStart + (58 * 64)
15742    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15743    cmp    r3, #0
15744    bxeq   lr                   @ nothing to do - jump to real handler
15745    EXPORT_PC()
15746    mov    r0, rPC              @ arg0
15747    mov    r1, rFP              @ arg1
15748    mov    r2, rSELF            @ arg2
15749    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15750
15751/* ------------------------------ */
15752    .balign 64
15753.L_ALT_OP_IF_GEZ: /* 0x3b */
15754/* File: armv5te/alt_stub.S */
15755/*
15756 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15757 * any interesting requests and then jump to the real instruction
15758 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15759 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15760 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15761 * bail to the real handler if breakFlags==0.
15762 */
15763    ldrb   r3, [rSELF, #offThread_breakFlags]
15764    adrl   lr, dvmAsmInstructionStart + (59 * 64)
15765    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15766    cmp    r3, #0
15767    bxeq   lr                   @ nothing to do - jump to real handler
15768    EXPORT_PC()
15769    mov    r0, rPC              @ arg0
15770    mov    r1, rFP              @ arg1
15771    mov    r2, rSELF            @ arg2
15772    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15773
15774/* ------------------------------ */
15775    .balign 64
15776.L_ALT_OP_IF_GTZ: /* 0x3c */
15777/* File: armv5te/alt_stub.S */
15778/*
15779 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15780 * any interesting requests and then jump to the real instruction
15781 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15782 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15783 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15784 * bail to the real handler if breakFlags==0.
15785 */
15786    ldrb   r3, [rSELF, #offThread_breakFlags]
15787    adrl   lr, dvmAsmInstructionStart + (60 * 64)
15788    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15789    cmp    r3, #0
15790    bxeq   lr                   @ nothing to do - jump to real handler
15791    EXPORT_PC()
15792    mov    r0, rPC              @ arg0
15793    mov    r1, rFP              @ arg1
15794    mov    r2, rSELF            @ arg2
15795    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15796
15797/* ------------------------------ */
15798    .balign 64
15799.L_ALT_OP_IF_LEZ: /* 0x3d */
15800/* File: armv5te/alt_stub.S */
15801/*
15802 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15803 * any interesting requests and then jump to the real instruction
15804 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15805 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15806 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15807 * bail to the real handler if breakFlags==0.
15808 */
15809    ldrb   r3, [rSELF, #offThread_breakFlags]
15810    adrl   lr, dvmAsmInstructionStart + (61 * 64)
15811    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15812    cmp    r3, #0
15813    bxeq   lr                   @ nothing to do - jump to real handler
15814    EXPORT_PC()
15815    mov    r0, rPC              @ arg0
15816    mov    r1, rFP              @ arg1
15817    mov    r2, rSELF            @ arg2
15818    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15819
15820/* ------------------------------ */
15821    .balign 64
15822.L_ALT_OP_UNUSED_3E: /* 0x3e */
15823/* File: armv5te/alt_stub.S */
15824/*
15825 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15826 * any interesting requests and then jump to the real instruction
15827 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15828 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15829 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15830 * bail to the real handler if breakFlags==0.
15831 */
15832    ldrb   r3, [rSELF, #offThread_breakFlags]
15833    adrl   lr, dvmAsmInstructionStart + (62 * 64)
15834    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15835    cmp    r3, #0
15836    bxeq   lr                   @ nothing to do - jump to real handler
15837    EXPORT_PC()
15838    mov    r0, rPC              @ arg0
15839    mov    r1, rFP              @ arg1
15840    mov    r2, rSELF            @ arg2
15841    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15842
15843/* ------------------------------ */
15844    .balign 64
15845.L_ALT_OP_UNUSED_3F: /* 0x3f */
15846/* File: armv5te/alt_stub.S */
15847/*
15848 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15849 * any interesting requests and then jump to the real instruction
15850 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15851 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15852 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15853 * bail to the real handler if breakFlags==0.
15854 */
15855    ldrb   r3, [rSELF, #offThread_breakFlags]
15856    adrl   lr, dvmAsmInstructionStart + (63 * 64)
15857    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15858    cmp    r3, #0
15859    bxeq   lr                   @ nothing to do - jump to real handler
15860    EXPORT_PC()
15861    mov    r0, rPC              @ arg0
15862    mov    r1, rFP              @ arg1
15863    mov    r2, rSELF            @ arg2
15864    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15865
15866/* ------------------------------ */
15867    .balign 64
15868.L_ALT_OP_UNUSED_40: /* 0x40 */
15869/* File: armv5te/alt_stub.S */
15870/*
15871 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15872 * any interesting requests and then jump to the real instruction
15873 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15874 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15875 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15876 * bail to the real handler if breakFlags==0.
15877 */
15878    ldrb   r3, [rSELF, #offThread_breakFlags]
15879    adrl   lr, dvmAsmInstructionStart + (64 * 64)
15880    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15881    cmp    r3, #0
15882    bxeq   lr                   @ nothing to do - jump to real handler
15883    EXPORT_PC()
15884    mov    r0, rPC              @ arg0
15885    mov    r1, rFP              @ arg1
15886    mov    r2, rSELF            @ arg2
15887    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15888
15889/* ------------------------------ */
15890    .balign 64
15891.L_ALT_OP_UNUSED_41: /* 0x41 */
15892/* File: armv5te/alt_stub.S */
15893/*
15894 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15895 * any interesting requests and then jump to the real instruction
15896 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15897 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15898 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15899 * bail to the real handler if breakFlags==0.
15900 */
15901    ldrb   r3, [rSELF, #offThread_breakFlags]
15902    adrl   lr, dvmAsmInstructionStart + (65 * 64)
15903    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15904    cmp    r3, #0
15905    bxeq   lr                   @ nothing to do - jump to real handler
15906    EXPORT_PC()
15907    mov    r0, rPC              @ arg0
15908    mov    r1, rFP              @ arg1
15909    mov    r2, rSELF            @ arg2
15910    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15911
15912/* ------------------------------ */
15913    .balign 64
15914.L_ALT_OP_UNUSED_42: /* 0x42 */
15915/* File: armv5te/alt_stub.S */
15916/*
15917 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15918 * any interesting requests and then jump to the real instruction
15919 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15920 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15921 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15922 * bail to the real handler if breakFlags==0.
15923 */
15924    ldrb   r3, [rSELF, #offThread_breakFlags]
15925    adrl   lr, dvmAsmInstructionStart + (66 * 64)
15926    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15927    cmp    r3, #0
15928    bxeq   lr                   @ nothing to do - jump to real handler
15929    EXPORT_PC()
15930    mov    r0, rPC              @ arg0
15931    mov    r1, rFP              @ arg1
15932    mov    r2, rSELF            @ arg2
15933    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15934
15935/* ------------------------------ */
15936    .balign 64
15937.L_ALT_OP_UNUSED_43: /* 0x43 */
15938/* File: armv5te/alt_stub.S */
15939/*
15940 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15941 * any interesting requests and then jump to the real instruction
15942 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15943 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15944 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15945 * bail to the real handler if breakFlags==0.
15946 */
15947    ldrb   r3, [rSELF, #offThread_breakFlags]
15948    adrl   lr, dvmAsmInstructionStart + (67 * 64)
15949    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15950    cmp    r3, #0
15951    bxeq   lr                   @ nothing to do - jump to real handler
15952    EXPORT_PC()
15953    mov    r0, rPC              @ arg0
15954    mov    r1, rFP              @ arg1
15955    mov    r2, rSELF            @ arg2
15956    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15957
15958/* ------------------------------ */
15959    .balign 64
15960.L_ALT_OP_AGET: /* 0x44 */
15961/* File: armv5te/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    ldrb   r3, [rSELF, #offThread_breakFlags]
15971    adrl   lr, dvmAsmInstructionStart + (68 * 64)
15972    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15973    cmp    r3, #0
15974    bxeq   lr                   @ nothing to do - jump to real handler
15975    EXPORT_PC()
15976    mov    r0, rPC              @ arg0
15977    mov    r1, rFP              @ arg1
15978    mov    r2, rSELF            @ arg2
15979    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15980
15981/* ------------------------------ */
15982    .balign 64
15983.L_ALT_OP_AGET_WIDE: /* 0x45 */
15984/* File: armv5te/alt_stub.S */
15985/*
15986 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15987 * any interesting requests and then jump to the real instruction
15988 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15989 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15990 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15991 * bail to the real handler if breakFlags==0.
15992 */
15993    ldrb   r3, [rSELF, #offThread_breakFlags]
15994    adrl   lr, dvmAsmInstructionStart + (69 * 64)
15995    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15996    cmp    r3, #0
15997    bxeq   lr                   @ nothing to do - jump to real handler
15998    EXPORT_PC()
15999    mov    r0, rPC              @ arg0
16000    mov    r1, rFP              @ arg1
16001    mov    r2, rSELF            @ arg2
16002    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16003
16004/* ------------------------------ */
16005    .balign 64
16006.L_ALT_OP_AGET_OBJECT: /* 0x46 */
16007/* File: armv5te/alt_stub.S */
16008/*
16009 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16010 * any interesting requests and then jump to the real instruction
16011 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16012 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16013 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16014 * bail to the real handler if breakFlags==0.
16015 */
16016    ldrb   r3, [rSELF, #offThread_breakFlags]
16017    adrl   lr, dvmAsmInstructionStart + (70 * 64)
16018    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16019    cmp    r3, #0
16020    bxeq   lr                   @ nothing to do - jump to real handler
16021    EXPORT_PC()
16022    mov    r0, rPC              @ arg0
16023    mov    r1, rFP              @ arg1
16024    mov    r2, rSELF            @ arg2
16025    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16026
16027/* ------------------------------ */
16028    .balign 64
16029.L_ALT_OP_AGET_BOOLEAN: /* 0x47 */
16030/* File: armv5te/alt_stub.S */
16031/*
16032 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16033 * any interesting requests and then jump to the real instruction
16034 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16035 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16036 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16037 * bail to the real handler if breakFlags==0.
16038 */
16039    ldrb   r3, [rSELF, #offThread_breakFlags]
16040    adrl   lr, dvmAsmInstructionStart + (71 * 64)
16041    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16042    cmp    r3, #0
16043    bxeq   lr                   @ nothing to do - jump to real handler
16044    EXPORT_PC()
16045    mov    r0, rPC              @ arg0
16046    mov    r1, rFP              @ arg1
16047    mov    r2, rSELF            @ arg2
16048    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16049
16050/* ------------------------------ */
16051    .balign 64
16052.L_ALT_OP_AGET_BYTE: /* 0x48 */
16053/* File: armv5te/alt_stub.S */
16054/*
16055 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16056 * any interesting requests and then jump to the real instruction
16057 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16058 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16059 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16060 * bail to the real handler if breakFlags==0.
16061 */
16062    ldrb   r3, [rSELF, #offThread_breakFlags]
16063    adrl   lr, dvmAsmInstructionStart + (72 * 64)
16064    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16065    cmp    r3, #0
16066    bxeq   lr                   @ nothing to do - jump to real handler
16067    EXPORT_PC()
16068    mov    r0, rPC              @ arg0
16069    mov    r1, rFP              @ arg1
16070    mov    r2, rSELF            @ arg2
16071    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16072
16073/* ------------------------------ */
16074    .balign 64
16075.L_ALT_OP_AGET_CHAR: /* 0x49 */
16076/* File: armv5te/alt_stub.S */
16077/*
16078 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16079 * any interesting requests and then jump to the real instruction
16080 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16081 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16082 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16083 * bail to the real handler if breakFlags==0.
16084 */
16085    ldrb   r3, [rSELF, #offThread_breakFlags]
16086    adrl   lr, dvmAsmInstructionStart + (73 * 64)
16087    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16088    cmp    r3, #0
16089    bxeq   lr                   @ nothing to do - jump to real handler
16090    EXPORT_PC()
16091    mov    r0, rPC              @ arg0
16092    mov    r1, rFP              @ arg1
16093    mov    r2, rSELF            @ arg2
16094    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16095
16096/* ------------------------------ */
16097    .balign 64
16098.L_ALT_OP_AGET_SHORT: /* 0x4a */
16099/* File: armv5te/alt_stub.S */
16100/*
16101 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16102 * any interesting requests and then jump to the real instruction
16103 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16104 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16105 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16106 * bail to the real handler if breakFlags==0.
16107 */
16108    ldrb   r3, [rSELF, #offThread_breakFlags]
16109    adrl   lr, dvmAsmInstructionStart + (74 * 64)
16110    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16111    cmp    r3, #0
16112    bxeq   lr                   @ nothing to do - jump to real handler
16113    EXPORT_PC()
16114    mov    r0, rPC              @ arg0
16115    mov    r1, rFP              @ arg1
16116    mov    r2, rSELF            @ arg2
16117    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16118
16119/* ------------------------------ */
16120    .balign 64
16121.L_ALT_OP_APUT: /* 0x4b */
16122/* File: armv5te/alt_stub.S */
16123/*
16124 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16125 * any interesting requests and then jump to the real instruction
16126 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16127 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16128 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16129 * bail to the real handler if breakFlags==0.
16130 */
16131    ldrb   r3, [rSELF, #offThread_breakFlags]
16132    adrl   lr, dvmAsmInstructionStart + (75 * 64)
16133    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16134    cmp    r3, #0
16135    bxeq   lr                   @ nothing to do - jump to real handler
16136    EXPORT_PC()
16137    mov    r0, rPC              @ arg0
16138    mov    r1, rFP              @ arg1
16139    mov    r2, rSELF            @ arg2
16140    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16141
16142/* ------------------------------ */
16143    .balign 64
16144.L_ALT_OP_APUT_WIDE: /* 0x4c */
16145/* File: armv5te/alt_stub.S */
16146/*
16147 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16148 * any interesting requests and then jump to the real instruction
16149 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16150 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16151 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16152 * bail to the real handler if breakFlags==0.
16153 */
16154    ldrb   r3, [rSELF, #offThread_breakFlags]
16155    adrl   lr, dvmAsmInstructionStart + (76 * 64)
16156    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16157    cmp    r3, #0
16158    bxeq   lr                   @ nothing to do - jump to real handler
16159    EXPORT_PC()
16160    mov    r0, rPC              @ arg0
16161    mov    r1, rFP              @ arg1
16162    mov    r2, rSELF            @ arg2
16163    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16164
16165/* ------------------------------ */
16166    .balign 64
16167.L_ALT_OP_APUT_OBJECT: /* 0x4d */
16168/* File: armv5te/alt_stub.S */
16169/*
16170 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16171 * any interesting requests and then jump to the real instruction
16172 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16173 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16174 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16175 * bail to the real handler if breakFlags==0.
16176 */
16177    ldrb   r3, [rSELF, #offThread_breakFlags]
16178    adrl   lr, dvmAsmInstructionStart + (77 * 64)
16179    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16180    cmp    r3, #0
16181    bxeq   lr                   @ nothing to do - jump to real handler
16182    EXPORT_PC()
16183    mov    r0, rPC              @ arg0
16184    mov    r1, rFP              @ arg1
16185    mov    r2, rSELF            @ arg2
16186    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16187
16188/* ------------------------------ */
16189    .balign 64
16190.L_ALT_OP_APUT_BOOLEAN: /* 0x4e */
16191/* File: armv5te/alt_stub.S */
16192/*
16193 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16194 * any interesting requests and then jump to the real instruction
16195 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16196 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16197 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16198 * bail to the real handler if breakFlags==0.
16199 */
16200    ldrb   r3, [rSELF, #offThread_breakFlags]
16201    adrl   lr, dvmAsmInstructionStart + (78 * 64)
16202    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16203    cmp    r3, #0
16204    bxeq   lr                   @ nothing to do - jump to real handler
16205    EXPORT_PC()
16206    mov    r0, rPC              @ arg0
16207    mov    r1, rFP              @ arg1
16208    mov    r2, rSELF            @ arg2
16209    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16210
16211/* ------------------------------ */
16212    .balign 64
16213.L_ALT_OP_APUT_BYTE: /* 0x4f */
16214/* File: armv5te/alt_stub.S */
16215/*
16216 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16217 * any interesting requests and then jump to the real instruction
16218 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16219 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16220 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16221 * bail to the real handler if breakFlags==0.
16222 */
16223    ldrb   r3, [rSELF, #offThread_breakFlags]
16224    adrl   lr, dvmAsmInstructionStart + (79 * 64)
16225    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16226    cmp    r3, #0
16227    bxeq   lr                   @ nothing to do - jump to real handler
16228    EXPORT_PC()
16229    mov    r0, rPC              @ arg0
16230    mov    r1, rFP              @ arg1
16231    mov    r2, rSELF            @ arg2
16232    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16233
16234/* ------------------------------ */
16235    .balign 64
16236.L_ALT_OP_APUT_CHAR: /* 0x50 */
16237/* File: armv5te/alt_stub.S */
16238/*
16239 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16240 * any interesting requests and then jump to the real instruction
16241 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16242 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16243 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16244 * bail to the real handler if breakFlags==0.
16245 */
16246    ldrb   r3, [rSELF, #offThread_breakFlags]
16247    adrl   lr, dvmAsmInstructionStart + (80 * 64)
16248    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16249    cmp    r3, #0
16250    bxeq   lr                   @ nothing to do - jump to real handler
16251    EXPORT_PC()
16252    mov    r0, rPC              @ arg0
16253    mov    r1, rFP              @ arg1
16254    mov    r2, rSELF            @ arg2
16255    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16256
16257/* ------------------------------ */
16258    .balign 64
16259.L_ALT_OP_APUT_SHORT: /* 0x51 */
16260/* File: armv5te/alt_stub.S */
16261/*
16262 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16263 * any interesting requests and then jump to the real instruction
16264 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16265 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16266 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16267 * bail to the real handler if breakFlags==0.
16268 */
16269    ldrb   r3, [rSELF, #offThread_breakFlags]
16270    adrl   lr, dvmAsmInstructionStart + (81 * 64)
16271    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16272    cmp    r3, #0
16273    bxeq   lr                   @ nothing to do - jump to real handler
16274    EXPORT_PC()
16275    mov    r0, rPC              @ arg0
16276    mov    r1, rFP              @ arg1
16277    mov    r2, rSELF            @ arg2
16278    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16279
16280/* ------------------------------ */
16281    .balign 64
16282.L_ALT_OP_IGET: /* 0x52 */
16283/* File: armv5te/alt_stub.S */
16284/*
16285 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16286 * any interesting requests and then jump to the real instruction
16287 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16288 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16289 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16290 * bail to the real handler if breakFlags==0.
16291 */
16292    ldrb   r3, [rSELF, #offThread_breakFlags]
16293    adrl   lr, dvmAsmInstructionStart + (82 * 64)
16294    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16295    cmp    r3, #0
16296    bxeq   lr                   @ nothing to do - jump to real handler
16297    EXPORT_PC()
16298    mov    r0, rPC              @ arg0
16299    mov    r1, rFP              @ arg1
16300    mov    r2, rSELF            @ arg2
16301    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16302
16303/* ------------------------------ */
16304    .balign 64
16305.L_ALT_OP_IGET_WIDE: /* 0x53 */
16306/* File: armv5te/alt_stub.S */
16307/*
16308 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16309 * any interesting requests and then jump to the real instruction
16310 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16311 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16312 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16313 * bail to the real handler if breakFlags==0.
16314 */
16315    ldrb   r3, [rSELF, #offThread_breakFlags]
16316    adrl   lr, dvmAsmInstructionStart + (83 * 64)
16317    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16318    cmp    r3, #0
16319    bxeq   lr                   @ nothing to do - jump to real handler
16320    EXPORT_PC()
16321    mov    r0, rPC              @ arg0
16322    mov    r1, rFP              @ arg1
16323    mov    r2, rSELF            @ arg2
16324    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16325
16326/* ------------------------------ */
16327    .balign 64
16328.L_ALT_OP_IGET_OBJECT: /* 0x54 */
16329/* File: armv5te/alt_stub.S */
16330/*
16331 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16332 * any interesting requests and then jump to the real instruction
16333 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16334 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16335 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16336 * bail to the real handler if breakFlags==0.
16337 */
16338    ldrb   r3, [rSELF, #offThread_breakFlags]
16339    adrl   lr, dvmAsmInstructionStart + (84 * 64)
16340    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16341    cmp    r3, #0
16342    bxeq   lr                   @ nothing to do - jump to real handler
16343    EXPORT_PC()
16344    mov    r0, rPC              @ arg0
16345    mov    r1, rFP              @ arg1
16346    mov    r2, rSELF            @ arg2
16347    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16348
16349/* ------------------------------ */
16350    .balign 64
16351.L_ALT_OP_IGET_BOOLEAN: /* 0x55 */
16352/* File: armv5te/alt_stub.S */
16353/*
16354 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16355 * any interesting requests and then jump to the real instruction
16356 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16357 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16358 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16359 * bail to the real handler if breakFlags==0.
16360 */
16361    ldrb   r3, [rSELF, #offThread_breakFlags]
16362    adrl   lr, dvmAsmInstructionStart + (85 * 64)
16363    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16364    cmp    r3, #0
16365    bxeq   lr                   @ nothing to do - jump to real handler
16366    EXPORT_PC()
16367    mov    r0, rPC              @ arg0
16368    mov    r1, rFP              @ arg1
16369    mov    r2, rSELF            @ arg2
16370    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16371
16372/* ------------------------------ */
16373    .balign 64
16374.L_ALT_OP_IGET_BYTE: /* 0x56 */
16375/* File: armv5te/alt_stub.S */
16376/*
16377 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16378 * any interesting requests and then jump to the real instruction
16379 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16380 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16381 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16382 * bail to the real handler if breakFlags==0.
16383 */
16384    ldrb   r3, [rSELF, #offThread_breakFlags]
16385    adrl   lr, dvmAsmInstructionStart + (86 * 64)
16386    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16387    cmp    r3, #0
16388    bxeq   lr                   @ nothing to do - jump to real handler
16389    EXPORT_PC()
16390    mov    r0, rPC              @ arg0
16391    mov    r1, rFP              @ arg1
16392    mov    r2, rSELF            @ arg2
16393    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16394
16395/* ------------------------------ */
16396    .balign 64
16397.L_ALT_OP_IGET_CHAR: /* 0x57 */
16398/* File: armv5te/alt_stub.S */
16399/*
16400 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16401 * any interesting requests and then jump to the real instruction
16402 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16403 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16404 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16405 * bail to the real handler if breakFlags==0.
16406 */
16407    ldrb   r3, [rSELF, #offThread_breakFlags]
16408    adrl   lr, dvmAsmInstructionStart + (87 * 64)
16409    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16410    cmp    r3, #0
16411    bxeq   lr                   @ nothing to do - jump to real handler
16412    EXPORT_PC()
16413    mov    r0, rPC              @ arg0
16414    mov    r1, rFP              @ arg1
16415    mov    r2, rSELF            @ arg2
16416    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16417
16418/* ------------------------------ */
16419    .balign 64
16420.L_ALT_OP_IGET_SHORT: /* 0x58 */
16421/* File: armv5te/alt_stub.S */
16422/*
16423 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16424 * any interesting requests and then jump to the real instruction
16425 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16426 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16427 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16428 * bail to the real handler if breakFlags==0.
16429 */
16430    ldrb   r3, [rSELF, #offThread_breakFlags]
16431    adrl   lr, dvmAsmInstructionStart + (88 * 64)
16432    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16433    cmp    r3, #0
16434    bxeq   lr                   @ nothing to do - jump to real handler
16435    EXPORT_PC()
16436    mov    r0, rPC              @ arg0
16437    mov    r1, rFP              @ arg1
16438    mov    r2, rSELF            @ arg2
16439    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16440
16441/* ------------------------------ */
16442    .balign 64
16443.L_ALT_OP_IPUT: /* 0x59 */
16444/* File: armv5te/alt_stub.S */
16445/*
16446 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16447 * any interesting requests and then jump to the real instruction
16448 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16449 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16450 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16451 * bail to the real handler if breakFlags==0.
16452 */
16453    ldrb   r3, [rSELF, #offThread_breakFlags]
16454    adrl   lr, dvmAsmInstructionStart + (89 * 64)
16455    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16456    cmp    r3, #0
16457    bxeq   lr                   @ nothing to do - jump to real handler
16458    EXPORT_PC()
16459    mov    r0, rPC              @ arg0
16460    mov    r1, rFP              @ arg1
16461    mov    r2, rSELF            @ arg2
16462    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16463
16464/* ------------------------------ */
16465    .balign 64
16466.L_ALT_OP_IPUT_WIDE: /* 0x5a */
16467/* File: armv5te/alt_stub.S */
16468/*
16469 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16470 * any interesting requests and then jump to the real instruction
16471 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16472 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16473 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16474 * bail to the real handler if breakFlags==0.
16475 */
16476    ldrb   r3, [rSELF, #offThread_breakFlags]
16477    adrl   lr, dvmAsmInstructionStart + (90 * 64)
16478    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16479    cmp    r3, #0
16480    bxeq   lr                   @ nothing to do - jump to real handler
16481    EXPORT_PC()
16482    mov    r0, rPC              @ arg0
16483    mov    r1, rFP              @ arg1
16484    mov    r2, rSELF            @ arg2
16485    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16486
16487/* ------------------------------ */
16488    .balign 64
16489.L_ALT_OP_IPUT_OBJECT: /* 0x5b */
16490/* File: armv5te/alt_stub.S */
16491/*
16492 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16493 * any interesting requests and then jump to the real instruction
16494 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16495 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16496 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16497 * bail to the real handler if breakFlags==0.
16498 */
16499    ldrb   r3, [rSELF, #offThread_breakFlags]
16500    adrl   lr, dvmAsmInstructionStart + (91 * 64)
16501    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16502    cmp    r3, #0
16503    bxeq   lr                   @ nothing to do - jump to real handler
16504    EXPORT_PC()
16505    mov    r0, rPC              @ arg0
16506    mov    r1, rFP              @ arg1
16507    mov    r2, rSELF            @ arg2
16508    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16509
16510/* ------------------------------ */
16511    .balign 64
16512.L_ALT_OP_IPUT_BOOLEAN: /* 0x5c */
16513/* File: armv5te/alt_stub.S */
16514/*
16515 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16516 * any interesting requests and then jump to the real instruction
16517 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16518 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16519 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16520 * bail to the real handler if breakFlags==0.
16521 */
16522    ldrb   r3, [rSELF, #offThread_breakFlags]
16523    adrl   lr, dvmAsmInstructionStart + (92 * 64)
16524    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16525    cmp    r3, #0
16526    bxeq   lr                   @ nothing to do - jump to real handler
16527    EXPORT_PC()
16528    mov    r0, rPC              @ arg0
16529    mov    r1, rFP              @ arg1
16530    mov    r2, rSELF            @ arg2
16531    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16532
16533/* ------------------------------ */
16534    .balign 64
16535.L_ALT_OP_IPUT_BYTE: /* 0x5d */
16536/* File: armv5te/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    ldrb   r3, [rSELF, #offThread_breakFlags]
16546    adrl   lr, dvmAsmInstructionStart + (93 * 64)
16547    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16548    cmp    r3, #0
16549    bxeq   lr                   @ nothing to do - jump to real handler
16550    EXPORT_PC()
16551    mov    r0, rPC              @ arg0
16552    mov    r1, rFP              @ arg1
16553    mov    r2, rSELF            @ arg2
16554    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16555
16556/* ------------------------------ */
16557    .balign 64
16558.L_ALT_OP_IPUT_CHAR: /* 0x5e */
16559/* File: armv5te/alt_stub.S */
16560/*
16561 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16562 * any interesting requests and then jump to the real instruction
16563 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16564 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16565 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16566 * bail to the real handler if breakFlags==0.
16567 */
16568    ldrb   r3, [rSELF, #offThread_breakFlags]
16569    adrl   lr, dvmAsmInstructionStart + (94 * 64)
16570    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16571    cmp    r3, #0
16572    bxeq   lr                   @ nothing to do - jump to real handler
16573    EXPORT_PC()
16574    mov    r0, rPC              @ arg0
16575    mov    r1, rFP              @ arg1
16576    mov    r2, rSELF            @ arg2
16577    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16578
16579/* ------------------------------ */
16580    .balign 64
16581.L_ALT_OP_IPUT_SHORT: /* 0x5f */
16582/* File: armv5te/alt_stub.S */
16583/*
16584 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16585 * any interesting requests and then jump to the real instruction
16586 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16587 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16588 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16589 * bail to the real handler if breakFlags==0.
16590 */
16591    ldrb   r3, [rSELF, #offThread_breakFlags]
16592    adrl   lr, dvmAsmInstructionStart + (95 * 64)
16593    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16594    cmp    r3, #0
16595    bxeq   lr                   @ nothing to do - jump to real handler
16596    EXPORT_PC()
16597    mov    r0, rPC              @ arg0
16598    mov    r1, rFP              @ arg1
16599    mov    r2, rSELF            @ arg2
16600    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16601
16602/* ------------------------------ */
16603    .balign 64
16604.L_ALT_OP_SGET: /* 0x60 */
16605/* File: armv5te/alt_stub.S */
16606/*
16607 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16608 * any interesting requests and then jump to the real instruction
16609 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16610 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16611 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16612 * bail to the real handler if breakFlags==0.
16613 */
16614    ldrb   r3, [rSELF, #offThread_breakFlags]
16615    adrl   lr, dvmAsmInstructionStart + (96 * 64)
16616    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16617    cmp    r3, #0
16618    bxeq   lr                   @ nothing to do - jump to real handler
16619    EXPORT_PC()
16620    mov    r0, rPC              @ arg0
16621    mov    r1, rFP              @ arg1
16622    mov    r2, rSELF            @ arg2
16623    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16624
16625/* ------------------------------ */
16626    .balign 64
16627.L_ALT_OP_SGET_WIDE: /* 0x61 */
16628/* File: armv5te/alt_stub.S */
16629/*
16630 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16631 * any interesting requests and then jump to the real instruction
16632 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16633 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16634 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16635 * bail to the real handler if breakFlags==0.
16636 */
16637    ldrb   r3, [rSELF, #offThread_breakFlags]
16638    adrl   lr, dvmAsmInstructionStart + (97 * 64)
16639    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16640    cmp    r3, #0
16641    bxeq   lr                   @ nothing to do - jump to real handler
16642    EXPORT_PC()
16643    mov    r0, rPC              @ arg0
16644    mov    r1, rFP              @ arg1
16645    mov    r2, rSELF            @ arg2
16646    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16647
16648/* ------------------------------ */
16649    .balign 64
16650.L_ALT_OP_SGET_OBJECT: /* 0x62 */
16651/* File: armv5te/alt_stub.S */
16652/*
16653 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16654 * any interesting requests and then jump to the real instruction
16655 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16656 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16657 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16658 * bail to the real handler if breakFlags==0.
16659 */
16660    ldrb   r3, [rSELF, #offThread_breakFlags]
16661    adrl   lr, dvmAsmInstructionStart + (98 * 64)
16662    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16663    cmp    r3, #0
16664    bxeq   lr                   @ nothing to do - jump to real handler
16665    EXPORT_PC()
16666    mov    r0, rPC              @ arg0
16667    mov    r1, rFP              @ arg1
16668    mov    r2, rSELF            @ arg2
16669    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16670
16671/* ------------------------------ */
16672    .balign 64
16673.L_ALT_OP_SGET_BOOLEAN: /* 0x63 */
16674/* File: armv5te/alt_stub.S */
16675/*
16676 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16677 * any interesting requests and then jump to the real instruction
16678 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16679 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16680 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16681 * bail to the real handler if breakFlags==0.
16682 */
16683    ldrb   r3, [rSELF, #offThread_breakFlags]
16684    adrl   lr, dvmAsmInstructionStart + (99 * 64)
16685    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16686    cmp    r3, #0
16687    bxeq   lr                   @ nothing to do - jump to real handler
16688    EXPORT_PC()
16689    mov    r0, rPC              @ arg0
16690    mov    r1, rFP              @ arg1
16691    mov    r2, rSELF            @ arg2
16692    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16693
16694/* ------------------------------ */
16695    .balign 64
16696.L_ALT_OP_SGET_BYTE: /* 0x64 */
16697/* File: armv5te/alt_stub.S */
16698/*
16699 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16700 * any interesting requests and then jump to the real instruction
16701 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16702 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16703 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16704 * bail to the real handler if breakFlags==0.
16705 */
16706    ldrb   r3, [rSELF, #offThread_breakFlags]
16707    adrl   lr, dvmAsmInstructionStart + (100 * 64)
16708    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16709    cmp    r3, #0
16710    bxeq   lr                   @ nothing to do - jump to real handler
16711    EXPORT_PC()
16712    mov    r0, rPC              @ arg0
16713    mov    r1, rFP              @ arg1
16714    mov    r2, rSELF            @ arg2
16715    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16716
16717/* ------------------------------ */
16718    .balign 64
16719.L_ALT_OP_SGET_CHAR: /* 0x65 */
16720/* File: armv5te/alt_stub.S */
16721/*
16722 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16723 * any interesting requests and then jump to the real instruction
16724 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16725 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16726 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16727 * bail to the real handler if breakFlags==0.
16728 */
16729    ldrb   r3, [rSELF, #offThread_breakFlags]
16730    adrl   lr, dvmAsmInstructionStart + (101 * 64)
16731    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16732    cmp    r3, #0
16733    bxeq   lr                   @ nothing to do - jump to real handler
16734    EXPORT_PC()
16735    mov    r0, rPC              @ arg0
16736    mov    r1, rFP              @ arg1
16737    mov    r2, rSELF            @ arg2
16738    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16739
16740/* ------------------------------ */
16741    .balign 64
16742.L_ALT_OP_SGET_SHORT: /* 0x66 */
16743/* File: armv5te/alt_stub.S */
16744/*
16745 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16746 * any interesting requests and then jump to the real instruction
16747 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16748 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16749 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16750 * bail to the real handler if breakFlags==0.
16751 */
16752    ldrb   r3, [rSELF, #offThread_breakFlags]
16753    adrl   lr, dvmAsmInstructionStart + (102 * 64)
16754    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16755    cmp    r3, #0
16756    bxeq   lr                   @ nothing to do - jump to real handler
16757    EXPORT_PC()
16758    mov    r0, rPC              @ arg0
16759    mov    r1, rFP              @ arg1
16760    mov    r2, rSELF            @ arg2
16761    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16762
16763/* ------------------------------ */
16764    .balign 64
16765.L_ALT_OP_SPUT: /* 0x67 */
16766/* File: armv5te/alt_stub.S */
16767/*
16768 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16769 * any interesting requests and then jump to the real instruction
16770 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16771 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16772 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16773 * bail to the real handler if breakFlags==0.
16774 */
16775    ldrb   r3, [rSELF, #offThread_breakFlags]
16776    adrl   lr, dvmAsmInstructionStart + (103 * 64)
16777    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16778    cmp    r3, #0
16779    bxeq   lr                   @ nothing to do - jump to real handler
16780    EXPORT_PC()
16781    mov    r0, rPC              @ arg0
16782    mov    r1, rFP              @ arg1
16783    mov    r2, rSELF            @ arg2
16784    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16785
16786/* ------------------------------ */
16787    .balign 64
16788.L_ALT_OP_SPUT_WIDE: /* 0x68 */
16789/* File: armv5te/alt_stub.S */
16790/*
16791 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16792 * any interesting requests and then jump to the real instruction
16793 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16794 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16795 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16796 * bail to the real handler if breakFlags==0.
16797 */
16798    ldrb   r3, [rSELF, #offThread_breakFlags]
16799    adrl   lr, dvmAsmInstructionStart + (104 * 64)
16800    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16801    cmp    r3, #0
16802    bxeq   lr                   @ nothing to do - jump to real handler
16803    EXPORT_PC()
16804    mov    r0, rPC              @ arg0
16805    mov    r1, rFP              @ arg1
16806    mov    r2, rSELF            @ arg2
16807    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16808
16809/* ------------------------------ */
16810    .balign 64
16811.L_ALT_OP_SPUT_OBJECT: /* 0x69 */
16812/* File: armv5te/alt_stub.S */
16813/*
16814 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16815 * any interesting requests and then jump to the real instruction
16816 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16817 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16818 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16819 * bail to the real handler if breakFlags==0.
16820 */
16821    ldrb   r3, [rSELF, #offThread_breakFlags]
16822    adrl   lr, dvmAsmInstructionStart + (105 * 64)
16823    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16824    cmp    r3, #0
16825    bxeq   lr                   @ nothing to do - jump to real handler
16826    EXPORT_PC()
16827    mov    r0, rPC              @ arg0
16828    mov    r1, rFP              @ arg1
16829    mov    r2, rSELF            @ arg2
16830    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16831
16832/* ------------------------------ */
16833    .balign 64
16834.L_ALT_OP_SPUT_BOOLEAN: /* 0x6a */
16835/* File: armv5te/alt_stub.S */
16836/*
16837 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16838 * any interesting requests and then jump to the real instruction
16839 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16840 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16841 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16842 * bail to the real handler if breakFlags==0.
16843 */
16844    ldrb   r3, [rSELF, #offThread_breakFlags]
16845    adrl   lr, dvmAsmInstructionStart + (106 * 64)
16846    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16847    cmp    r3, #0
16848    bxeq   lr                   @ nothing to do - jump to real handler
16849    EXPORT_PC()
16850    mov    r0, rPC              @ arg0
16851    mov    r1, rFP              @ arg1
16852    mov    r2, rSELF            @ arg2
16853    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16854
16855/* ------------------------------ */
16856    .balign 64
16857.L_ALT_OP_SPUT_BYTE: /* 0x6b */
16858/* File: armv5te/alt_stub.S */
16859/*
16860 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16861 * any interesting requests and then jump to the real instruction
16862 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16863 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16864 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16865 * bail to the real handler if breakFlags==0.
16866 */
16867    ldrb   r3, [rSELF, #offThread_breakFlags]
16868    adrl   lr, dvmAsmInstructionStart + (107 * 64)
16869    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16870    cmp    r3, #0
16871    bxeq   lr                   @ nothing to do - jump to real handler
16872    EXPORT_PC()
16873    mov    r0, rPC              @ arg0
16874    mov    r1, rFP              @ arg1
16875    mov    r2, rSELF            @ arg2
16876    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16877
16878/* ------------------------------ */
16879    .balign 64
16880.L_ALT_OP_SPUT_CHAR: /* 0x6c */
16881/* File: armv5te/alt_stub.S */
16882/*
16883 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16884 * any interesting requests and then jump to the real instruction
16885 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16886 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16887 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16888 * bail to the real handler if breakFlags==0.
16889 */
16890    ldrb   r3, [rSELF, #offThread_breakFlags]
16891    adrl   lr, dvmAsmInstructionStart + (108 * 64)
16892    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16893    cmp    r3, #0
16894    bxeq   lr                   @ nothing to do - jump to real handler
16895    EXPORT_PC()
16896    mov    r0, rPC              @ arg0
16897    mov    r1, rFP              @ arg1
16898    mov    r2, rSELF            @ arg2
16899    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16900
16901/* ------------------------------ */
16902    .balign 64
16903.L_ALT_OP_SPUT_SHORT: /* 0x6d */
16904/* File: armv5te/alt_stub.S */
16905/*
16906 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16907 * any interesting requests and then jump to the real instruction
16908 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16909 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16910 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16911 * bail to the real handler if breakFlags==0.
16912 */
16913    ldrb   r3, [rSELF, #offThread_breakFlags]
16914    adrl   lr, dvmAsmInstructionStart + (109 * 64)
16915    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16916    cmp    r3, #0
16917    bxeq   lr                   @ nothing to do - jump to real handler
16918    EXPORT_PC()
16919    mov    r0, rPC              @ arg0
16920    mov    r1, rFP              @ arg1
16921    mov    r2, rSELF            @ arg2
16922    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16923
16924/* ------------------------------ */
16925    .balign 64
16926.L_ALT_OP_INVOKE_VIRTUAL: /* 0x6e */
16927/* File: armv5te/alt_stub.S */
16928/*
16929 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16930 * any interesting requests and then jump to the real instruction
16931 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16932 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16933 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16934 * bail to the real handler if breakFlags==0.
16935 */
16936    ldrb   r3, [rSELF, #offThread_breakFlags]
16937    adrl   lr, dvmAsmInstructionStart + (110 * 64)
16938    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16939    cmp    r3, #0
16940    bxeq   lr                   @ nothing to do - jump to real handler
16941    EXPORT_PC()
16942    mov    r0, rPC              @ arg0
16943    mov    r1, rFP              @ arg1
16944    mov    r2, rSELF            @ arg2
16945    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16946
16947/* ------------------------------ */
16948    .balign 64
16949.L_ALT_OP_INVOKE_SUPER: /* 0x6f */
16950/* File: armv5te/alt_stub.S */
16951/*
16952 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16953 * any interesting requests and then jump to the real instruction
16954 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16955 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16956 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16957 * bail to the real handler if breakFlags==0.
16958 */
16959    ldrb   r3, [rSELF, #offThread_breakFlags]
16960    adrl   lr, dvmAsmInstructionStart + (111 * 64)
16961    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16962    cmp    r3, #0
16963    bxeq   lr                   @ nothing to do - jump to real handler
16964    EXPORT_PC()
16965    mov    r0, rPC              @ arg0
16966    mov    r1, rFP              @ arg1
16967    mov    r2, rSELF            @ arg2
16968    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16969
16970/* ------------------------------ */
16971    .balign 64
16972.L_ALT_OP_INVOKE_DIRECT: /* 0x70 */
16973/* File: armv5te/alt_stub.S */
16974/*
16975 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16976 * any interesting requests and then jump to the real instruction
16977 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16978 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16979 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16980 * bail to the real handler if breakFlags==0.
16981 */
16982    ldrb   r3, [rSELF, #offThread_breakFlags]
16983    adrl   lr, dvmAsmInstructionStart + (112 * 64)
16984    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16985    cmp    r3, #0
16986    bxeq   lr                   @ nothing to do - jump to real handler
16987    EXPORT_PC()
16988    mov    r0, rPC              @ arg0
16989    mov    r1, rFP              @ arg1
16990    mov    r2, rSELF            @ arg2
16991    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16992
16993/* ------------------------------ */
16994    .balign 64
16995.L_ALT_OP_INVOKE_STATIC: /* 0x71 */
16996/* File: armv5te/alt_stub.S */
16997/*
16998 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16999 * any interesting requests and then jump to the real instruction
17000 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17001 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17002 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17003 * bail to the real handler if breakFlags==0.
17004 */
17005    ldrb   r3, [rSELF, #offThread_breakFlags]
17006    adrl   lr, dvmAsmInstructionStart + (113 * 64)
17007    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17008    cmp    r3, #0
17009    bxeq   lr                   @ nothing to do - jump to real handler
17010    EXPORT_PC()
17011    mov    r0, rPC              @ arg0
17012    mov    r1, rFP              @ arg1
17013    mov    r2, rSELF            @ arg2
17014    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17015
17016/* ------------------------------ */
17017    .balign 64
17018.L_ALT_OP_INVOKE_INTERFACE: /* 0x72 */
17019/* File: armv5te/alt_stub.S */
17020/*
17021 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17022 * any interesting requests and then jump to the real instruction
17023 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17024 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17025 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17026 * bail to the real handler if breakFlags==0.
17027 */
17028    ldrb   r3, [rSELF, #offThread_breakFlags]
17029    adrl   lr, dvmAsmInstructionStart + (114 * 64)
17030    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17031    cmp    r3, #0
17032    bxeq   lr                   @ nothing to do - jump to real handler
17033    EXPORT_PC()
17034    mov    r0, rPC              @ arg0
17035    mov    r1, rFP              @ arg1
17036    mov    r2, rSELF            @ arg2
17037    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17038
17039/* ------------------------------ */
17040    .balign 64
17041.L_ALT_OP_UNUSED_73: /* 0x73 */
17042/* File: armv5te/alt_stub.S */
17043/*
17044 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17045 * any interesting requests and then jump to the real instruction
17046 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17047 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17048 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17049 * bail to the real handler if breakFlags==0.
17050 */
17051    ldrb   r3, [rSELF, #offThread_breakFlags]
17052    adrl   lr, dvmAsmInstructionStart + (115 * 64)
17053    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17054    cmp    r3, #0
17055    bxeq   lr                   @ nothing to do - jump to real handler
17056    EXPORT_PC()
17057    mov    r0, rPC              @ arg0
17058    mov    r1, rFP              @ arg1
17059    mov    r2, rSELF            @ arg2
17060    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17061
17062/* ------------------------------ */
17063    .balign 64
17064.L_ALT_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
17065/* File: armv5te/alt_stub.S */
17066/*
17067 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17068 * any interesting requests and then jump to the real instruction
17069 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17070 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17071 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17072 * bail to the real handler if breakFlags==0.
17073 */
17074    ldrb   r3, [rSELF, #offThread_breakFlags]
17075    adrl   lr, dvmAsmInstructionStart + (116 * 64)
17076    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17077    cmp    r3, #0
17078    bxeq   lr                   @ nothing to do - jump to real handler
17079    EXPORT_PC()
17080    mov    r0, rPC              @ arg0
17081    mov    r1, rFP              @ arg1
17082    mov    r2, rSELF            @ arg2
17083    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17084
17085/* ------------------------------ */
17086    .balign 64
17087.L_ALT_OP_INVOKE_SUPER_RANGE: /* 0x75 */
17088/* File: armv5te/alt_stub.S */
17089/*
17090 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17091 * any interesting requests and then jump to the real instruction
17092 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17093 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17094 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17095 * bail to the real handler if breakFlags==0.
17096 */
17097    ldrb   r3, [rSELF, #offThread_breakFlags]
17098    adrl   lr, dvmAsmInstructionStart + (117 * 64)
17099    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17100    cmp    r3, #0
17101    bxeq   lr                   @ nothing to do - jump to real handler
17102    EXPORT_PC()
17103    mov    r0, rPC              @ arg0
17104    mov    r1, rFP              @ arg1
17105    mov    r2, rSELF            @ arg2
17106    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17107
17108/* ------------------------------ */
17109    .balign 64
17110.L_ALT_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
17111/* File: armv5te/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    ldrb   r3, [rSELF, #offThread_breakFlags]
17121    adrl   lr, dvmAsmInstructionStart + (118 * 64)
17122    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17123    cmp    r3, #0
17124    bxeq   lr                   @ nothing to do - jump to real handler
17125    EXPORT_PC()
17126    mov    r0, rPC              @ arg0
17127    mov    r1, rFP              @ arg1
17128    mov    r2, rSELF            @ arg2
17129    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17130
17131/* ------------------------------ */
17132    .balign 64
17133.L_ALT_OP_INVOKE_STATIC_RANGE: /* 0x77 */
17134/* File: armv5te/alt_stub.S */
17135/*
17136 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17137 * any interesting requests and then jump to the real instruction
17138 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17139 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17140 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17141 * bail to the real handler if breakFlags==0.
17142 */
17143    ldrb   r3, [rSELF, #offThread_breakFlags]
17144    adrl   lr, dvmAsmInstructionStart + (119 * 64)
17145    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17146    cmp    r3, #0
17147    bxeq   lr                   @ nothing to do - jump to real handler
17148    EXPORT_PC()
17149    mov    r0, rPC              @ arg0
17150    mov    r1, rFP              @ arg1
17151    mov    r2, rSELF            @ arg2
17152    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17153
17154/* ------------------------------ */
17155    .balign 64
17156.L_ALT_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
17157/* File: armv5te/alt_stub.S */
17158/*
17159 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17160 * any interesting requests and then jump to the real instruction
17161 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17162 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17163 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17164 * bail to the real handler if breakFlags==0.
17165 */
17166    ldrb   r3, [rSELF, #offThread_breakFlags]
17167    adrl   lr, dvmAsmInstructionStart + (120 * 64)
17168    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17169    cmp    r3, #0
17170    bxeq   lr                   @ nothing to do - jump to real handler
17171    EXPORT_PC()
17172    mov    r0, rPC              @ arg0
17173    mov    r1, rFP              @ arg1
17174    mov    r2, rSELF            @ arg2
17175    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17176
17177/* ------------------------------ */
17178    .balign 64
17179.L_ALT_OP_UNUSED_79: /* 0x79 */
17180/* File: armv5te/alt_stub.S */
17181/*
17182 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17183 * any interesting requests and then jump to the real instruction
17184 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17185 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17186 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17187 * bail to the real handler if breakFlags==0.
17188 */
17189    ldrb   r3, [rSELF, #offThread_breakFlags]
17190    adrl   lr, dvmAsmInstructionStart + (121 * 64)
17191    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17192    cmp    r3, #0
17193    bxeq   lr                   @ nothing to do - jump to real handler
17194    EXPORT_PC()
17195    mov    r0, rPC              @ arg0
17196    mov    r1, rFP              @ arg1
17197    mov    r2, rSELF            @ arg2
17198    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17199
17200/* ------------------------------ */
17201    .balign 64
17202.L_ALT_OP_UNUSED_7A: /* 0x7a */
17203/* File: armv5te/alt_stub.S */
17204/*
17205 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17206 * any interesting requests and then jump to the real instruction
17207 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17208 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17209 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17210 * bail to the real handler if breakFlags==0.
17211 */
17212    ldrb   r3, [rSELF, #offThread_breakFlags]
17213    adrl   lr, dvmAsmInstructionStart + (122 * 64)
17214    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17215    cmp    r3, #0
17216    bxeq   lr                   @ nothing to do - jump to real handler
17217    EXPORT_PC()
17218    mov    r0, rPC              @ arg0
17219    mov    r1, rFP              @ arg1
17220    mov    r2, rSELF            @ arg2
17221    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17222
17223/* ------------------------------ */
17224    .balign 64
17225.L_ALT_OP_NEG_INT: /* 0x7b */
17226/* File: armv5te/alt_stub.S */
17227/*
17228 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17229 * any interesting requests and then jump to the real instruction
17230 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17231 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17232 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17233 * bail to the real handler if breakFlags==0.
17234 */
17235    ldrb   r3, [rSELF, #offThread_breakFlags]
17236    adrl   lr, dvmAsmInstructionStart + (123 * 64)
17237    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17238    cmp    r3, #0
17239    bxeq   lr                   @ nothing to do - jump to real handler
17240    EXPORT_PC()
17241    mov    r0, rPC              @ arg0
17242    mov    r1, rFP              @ arg1
17243    mov    r2, rSELF            @ arg2
17244    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17245
17246/* ------------------------------ */
17247    .balign 64
17248.L_ALT_OP_NOT_INT: /* 0x7c */
17249/* File: armv5te/alt_stub.S */
17250/*
17251 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17252 * any interesting requests and then jump to the real instruction
17253 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17254 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17255 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17256 * bail to the real handler if breakFlags==0.
17257 */
17258    ldrb   r3, [rSELF, #offThread_breakFlags]
17259    adrl   lr, dvmAsmInstructionStart + (124 * 64)
17260    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17261    cmp    r3, #0
17262    bxeq   lr                   @ nothing to do - jump to real handler
17263    EXPORT_PC()
17264    mov    r0, rPC              @ arg0
17265    mov    r1, rFP              @ arg1
17266    mov    r2, rSELF            @ arg2
17267    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17268
17269/* ------------------------------ */
17270    .balign 64
17271.L_ALT_OP_NEG_LONG: /* 0x7d */
17272/* File: armv5te/alt_stub.S */
17273/*
17274 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17275 * any interesting requests and then jump to the real instruction
17276 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17277 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17278 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17279 * bail to the real handler if breakFlags==0.
17280 */
17281    ldrb   r3, [rSELF, #offThread_breakFlags]
17282    adrl   lr, dvmAsmInstructionStart + (125 * 64)
17283    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17284    cmp    r3, #0
17285    bxeq   lr                   @ nothing to do - jump to real handler
17286    EXPORT_PC()
17287    mov    r0, rPC              @ arg0
17288    mov    r1, rFP              @ arg1
17289    mov    r2, rSELF            @ arg2
17290    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17291
17292/* ------------------------------ */
17293    .balign 64
17294.L_ALT_OP_NOT_LONG: /* 0x7e */
17295/* File: armv5te/alt_stub.S */
17296/*
17297 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17298 * any interesting requests and then jump to the real instruction
17299 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17300 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17301 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17302 * bail to the real handler if breakFlags==0.
17303 */
17304    ldrb   r3, [rSELF, #offThread_breakFlags]
17305    adrl   lr, dvmAsmInstructionStart + (126 * 64)
17306    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17307    cmp    r3, #0
17308    bxeq   lr                   @ nothing to do - jump to real handler
17309    EXPORT_PC()
17310    mov    r0, rPC              @ arg0
17311    mov    r1, rFP              @ arg1
17312    mov    r2, rSELF            @ arg2
17313    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17314
17315/* ------------------------------ */
17316    .balign 64
17317.L_ALT_OP_NEG_FLOAT: /* 0x7f */
17318/* File: armv5te/alt_stub.S */
17319/*
17320 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17321 * any interesting requests and then jump to the real instruction
17322 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17323 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17324 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17325 * bail to the real handler if breakFlags==0.
17326 */
17327    ldrb   r3, [rSELF, #offThread_breakFlags]
17328    adrl   lr, dvmAsmInstructionStart + (127 * 64)
17329    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17330    cmp    r3, #0
17331    bxeq   lr                   @ nothing to do - jump to real handler
17332    EXPORT_PC()
17333    mov    r0, rPC              @ arg0
17334    mov    r1, rFP              @ arg1
17335    mov    r2, rSELF            @ arg2
17336    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17337
17338/* ------------------------------ */
17339    .balign 64
17340.L_ALT_OP_NEG_DOUBLE: /* 0x80 */
17341/* File: armv5te/alt_stub.S */
17342/*
17343 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17344 * any interesting requests and then jump to the real instruction
17345 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17346 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17347 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17348 * bail to the real handler if breakFlags==0.
17349 */
17350    ldrb   r3, [rSELF, #offThread_breakFlags]
17351    adrl   lr, dvmAsmInstructionStart + (128 * 64)
17352    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17353    cmp    r3, #0
17354    bxeq   lr                   @ nothing to do - jump to real handler
17355    EXPORT_PC()
17356    mov    r0, rPC              @ arg0
17357    mov    r1, rFP              @ arg1
17358    mov    r2, rSELF            @ arg2
17359    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17360
17361/* ------------------------------ */
17362    .balign 64
17363.L_ALT_OP_INT_TO_LONG: /* 0x81 */
17364/* File: armv5te/alt_stub.S */
17365/*
17366 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17367 * any interesting requests and then jump to the real instruction
17368 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17369 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17370 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17371 * bail to the real handler if breakFlags==0.
17372 */
17373    ldrb   r3, [rSELF, #offThread_breakFlags]
17374    adrl   lr, dvmAsmInstructionStart + (129 * 64)
17375    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17376    cmp    r3, #0
17377    bxeq   lr                   @ nothing to do - jump to real handler
17378    EXPORT_PC()
17379    mov    r0, rPC              @ arg0
17380    mov    r1, rFP              @ arg1
17381    mov    r2, rSELF            @ arg2
17382    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17383
17384/* ------------------------------ */
17385    .balign 64
17386.L_ALT_OP_INT_TO_FLOAT: /* 0x82 */
17387/* File: armv5te/alt_stub.S */
17388/*
17389 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17390 * any interesting requests and then jump to the real instruction
17391 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17392 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17393 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17394 * bail to the real handler if breakFlags==0.
17395 */
17396    ldrb   r3, [rSELF, #offThread_breakFlags]
17397    adrl   lr, dvmAsmInstructionStart + (130 * 64)
17398    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17399    cmp    r3, #0
17400    bxeq   lr                   @ nothing to do - jump to real handler
17401    EXPORT_PC()
17402    mov    r0, rPC              @ arg0
17403    mov    r1, rFP              @ arg1
17404    mov    r2, rSELF            @ arg2
17405    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17406
17407/* ------------------------------ */
17408    .balign 64
17409.L_ALT_OP_INT_TO_DOUBLE: /* 0x83 */
17410/* File: armv5te/alt_stub.S */
17411/*
17412 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17413 * any interesting requests and then jump to the real instruction
17414 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17415 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17416 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17417 * bail to the real handler if breakFlags==0.
17418 */
17419    ldrb   r3, [rSELF, #offThread_breakFlags]
17420    adrl   lr, dvmAsmInstructionStart + (131 * 64)
17421    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17422    cmp    r3, #0
17423    bxeq   lr                   @ nothing to do - jump to real handler
17424    EXPORT_PC()
17425    mov    r0, rPC              @ arg0
17426    mov    r1, rFP              @ arg1
17427    mov    r2, rSELF            @ arg2
17428    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17429
17430/* ------------------------------ */
17431    .balign 64
17432.L_ALT_OP_LONG_TO_INT: /* 0x84 */
17433/* File: armv5te/alt_stub.S */
17434/*
17435 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17436 * any interesting requests and then jump to the real instruction
17437 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17438 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17439 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17440 * bail to the real handler if breakFlags==0.
17441 */
17442    ldrb   r3, [rSELF, #offThread_breakFlags]
17443    adrl   lr, dvmAsmInstructionStart + (132 * 64)
17444    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17445    cmp    r3, #0
17446    bxeq   lr                   @ nothing to do - jump to real handler
17447    EXPORT_PC()
17448    mov    r0, rPC              @ arg0
17449    mov    r1, rFP              @ arg1
17450    mov    r2, rSELF            @ arg2
17451    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17452
17453/* ------------------------------ */
17454    .balign 64
17455.L_ALT_OP_LONG_TO_FLOAT: /* 0x85 */
17456/* File: armv5te/alt_stub.S */
17457/*
17458 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17459 * any interesting requests and then jump to the real instruction
17460 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17461 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17462 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17463 * bail to the real handler if breakFlags==0.
17464 */
17465    ldrb   r3, [rSELF, #offThread_breakFlags]
17466    adrl   lr, dvmAsmInstructionStart + (133 * 64)
17467    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17468    cmp    r3, #0
17469    bxeq   lr                   @ nothing to do - jump to real handler
17470    EXPORT_PC()
17471    mov    r0, rPC              @ arg0
17472    mov    r1, rFP              @ arg1
17473    mov    r2, rSELF            @ arg2
17474    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17475
17476/* ------------------------------ */
17477    .balign 64
17478.L_ALT_OP_LONG_TO_DOUBLE: /* 0x86 */
17479/* File: armv5te/alt_stub.S */
17480/*
17481 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17482 * any interesting requests and then jump to the real instruction
17483 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17484 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17485 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17486 * bail to the real handler if breakFlags==0.
17487 */
17488    ldrb   r3, [rSELF, #offThread_breakFlags]
17489    adrl   lr, dvmAsmInstructionStart + (134 * 64)
17490    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17491    cmp    r3, #0
17492    bxeq   lr                   @ nothing to do - jump to real handler
17493    EXPORT_PC()
17494    mov    r0, rPC              @ arg0
17495    mov    r1, rFP              @ arg1
17496    mov    r2, rSELF            @ arg2
17497    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17498
17499/* ------------------------------ */
17500    .balign 64
17501.L_ALT_OP_FLOAT_TO_INT: /* 0x87 */
17502/* File: armv5te/alt_stub.S */
17503/*
17504 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17505 * any interesting requests and then jump to the real instruction
17506 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17507 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17508 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17509 * bail to the real handler if breakFlags==0.
17510 */
17511    ldrb   r3, [rSELF, #offThread_breakFlags]
17512    adrl   lr, dvmAsmInstructionStart + (135 * 64)
17513    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17514    cmp    r3, #0
17515    bxeq   lr                   @ nothing to do - jump to real handler
17516    EXPORT_PC()
17517    mov    r0, rPC              @ arg0
17518    mov    r1, rFP              @ arg1
17519    mov    r2, rSELF            @ arg2
17520    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17521
17522/* ------------------------------ */
17523    .balign 64
17524.L_ALT_OP_FLOAT_TO_LONG: /* 0x88 */
17525/* File: armv5te/alt_stub.S */
17526/*
17527 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17528 * any interesting requests and then jump to the real instruction
17529 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17530 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17531 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17532 * bail to the real handler if breakFlags==0.
17533 */
17534    ldrb   r3, [rSELF, #offThread_breakFlags]
17535    adrl   lr, dvmAsmInstructionStart + (136 * 64)
17536    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17537    cmp    r3, #0
17538    bxeq   lr                   @ nothing to do - jump to real handler
17539    EXPORT_PC()
17540    mov    r0, rPC              @ arg0
17541    mov    r1, rFP              @ arg1
17542    mov    r2, rSELF            @ arg2
17543    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17544
17545/* ------------------------------ */
17546    .balign 64
17547.L_ALT_OP_FLOAT_TO_DOUBLE: /* 0x89 */
17548/* File: armv5te/alt_stub.S */
17549/*
17550 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17551 * any interesting requests and then jump to the real instruction
17552 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17553 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17554 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17555 * bail to the real handler if breakFlags==0.
17556 */
17557    ldrb   r3, [rSELF, #offThread_breakFlags]
17558    adrl   lr, dvmAsmInstructionStart + (137 * 64)
17559    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17560    cmp    r3, #0
17561    bxeq   lr                   @ nothing to do - jump to real handler
17562    EXPORT_PC()
17563    mov    r0, rPC              @ arg0
17564    mov    r1, rFP              @ arg1
17565    mov    r2, rSELF            @ arg2
17566    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17567
17568/* ------------------------------ */
17569    .balign 64
17570.L_ALT_OP_DOUBLE_TO_INT: /* 0x8a */
17571/* File: armv5te/alt_stub.S */
17572/*
17573 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17574 * any interesting requests and then jump to the real instruction
17575 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17576 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17577 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17578 * bail to the real handler if breakFlags==0.
17579 */
17580    ldrb   r3, [rSELF, #offThread_breakFlags]
17581    adrl   lr, dvmAsmInstructionStart + (138 * 64)
17582    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17583    cmp    r3, #0
17584    bxeq   lr                   @ nothing to do - jump to real handler
17585    EXPORT_PC()
17586    mov    r0, rPC              @ arg0
17587    mov    r1, rFP              @ arg1
17588    mov    r2, rSELF            @ arg2
17589    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17590
17591/* ------------------------------ */
17592    .balign 64
17593.L_ALT_OP_DOUBLE_TO_LONG: /* 0x8b */
17594/* File: armv5te/alt_stub.S */
17595/*
17596 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17597 * any interesting requests and then jump to the real instruction
17598 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17599 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17600 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17601 * bail to the real handler if breakFlags==0.
17602 */
17603    ldrb   r3, [rSELF, #offThread_breakFlags]
17604    adrl   lr, dvmAsmInstructionStart + (139 * 64)
17605    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17606    cmp    r3, #0
17607    bxeq   lr                   @ nothing to do - jump to real handler
17608    EXPORT_PC()
17609    mov    r0, rPC              @ arg0
17610    mov    r1, rFP              @ arg1
17611    mov    r2, rSELF            @ arg2
17612    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17613
17614/* ------------------------------ */
17615    .balign 64
17616.L_ALT_OP_DOUBLE_TO_FLOAT: /* 0x8c */
17617/* File: armv5te/alt_stub.S */
17618/*
17619 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17620 * any interesting requests and then jump to the real instruction
17621 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17622 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17623 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17624 * bail to the real handler if breakFlags==0.
17625 */
17626    ldrb   r3, [rSELF, #offThread_breakFlags]
17627    adrl   lr, dvmAsmInstructionStart + (140 * 64)
17628    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17629    cmp    r3, #0
17630    bxeq   lr                   @ nothing to do - jump to real handler
17631    EXPORT_PC()
17632    mov    r0, rPC              @ arg0
17633    mov    r1, rFP              @ arg1
17634    mov    r2, rSELF            @ arg2
17635    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17636
17637/* ------------------------------ */
17638    .balign 64
17639.L_ALT_OP_INT_TO_BYTE: /* 0x8d */
17640/* File: armv5te/alt_stub.S */
17641/*
17642 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17643 * any interesting requests and then jump to the real instruction
17644 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17645 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17646 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17647 * bail to the real handler if breakFlags==0.
17648 */
17649    ldrb   r3, [rSELF, #offThread_breakFlags]
17650    adrl   lr, dvmAsmInstructionStart + (141 * 64)
17651    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17652    cmp    r3, #0
17653    bxeq   lr                   @ nothing to do - jump to real handler
17654    EXPORT_PC()
17655    mov    r0, rPC              @ arg0
17656    mov    r1, rFP              @ arg1
17657    mov    r2, rSELF            @ arg2
17658    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17659
17660/* ------------------------------ */
17661    .balign 64
17662.L_ALT_OP_INT_TO_CHAR: /* 0x8e */
17663/* File: armv5te/alt_stub.S */
17664/*
17665 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17666 * any interesting requests and then jump to the real instruction
17667 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17668 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17669 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17670 * bail to the real handler if breakFlags==0.
17671 */
17672    ldrb   r3, [rSELF, #offThread_breakFlags]
17673    adrl   lr, dvmAsmInstructionStart + (142 * 64)
17674    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17675    cmp    r3, #0
17676    bxeq   lr                   @ nothing to do - jump to real handler
17677    EXPORT_PC()
17678    mov    r0, rPC              @ arg0
17679    mov    r1, rFP              @ arg1
17680    mov    r2, rSELF            @ arg2
17681    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17682
17683/* ------------------------------ */
17684    .balign 64
17685.L_ALT_OP_INT_TO_SHORT: /* 0x8f */
17686/* File: armv5te/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    ldrb   r3, [rSELF, #offThread_breakFlags]
17696    adrl   lr, dvmAsmInstructionStart + (143 * 64)
17697    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17698    cmp    r3, #0
17699    bxeq   lr                   @ nothing to do - jump to real handler
17700    EXPORT_PC()
17701    mov    r0, rPC              @ arg0
17702    mov    r1, rFP              @ arg1
17703    mov    r2, rSELF            @ arg2
17704    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17705
17706/* ------------------------------ */
17707    .balign 64
17708.L_ALT_OP_ADD_INT: /* 0x90 */
17709/* File: armv5te/alt_stub.S */
17710/*
17711 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17712 * any interesting requests and then jump to the real instruction
17713 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17714 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17715 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17716 * bail to the real handler if breakFlags==0.
17717 */
17718    ldrb   r3, [rSELF, #offThread_breakFlags]
17719    adrl   lr, dvmAsmInstructionStart + (144 * 64)
17720    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17721    cmp    r3, #0
17722    bxeq   lr                   @ nothing to do - jump to real handler
17723    EXPORT_PC()
17724    mov    r0, rPC              @ arg0
17725    mov    r1, rFP              @ arg1
17726    mov    r2, rSELF            @ arg2
17727    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17728
17729/* ------------------------------ */
17730    .balign 64
17731.L_ALT_OP_SUB_INT: /* 0x91 */
17732/* File: armv5te/alt_stub.S */
17733/*
17734 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17735 * any interesting requests and then jump to the real instruction
17736 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17737 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17738 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17739 * bail to the real handler if breakFlags==0.
17740 */
17741    ldrb   r3, [rSELF, #offThread_breakFlags]
17742    adrl   lr, dvmAsmInstructionStart + (145 * 64)
17743    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17744    cmp    r3, #0
17745    bxeq   lr                   @ nothing to do - jump to real handler
17746    EXPORT_PC()
17747    mov    r0, rPC              @ arg0
17748    mov    r1, rFP              @ arg1
17749    mov    r2, rSELF            @ arg2
17750    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17751
17752/* ------------------------------ */
17753    .balign 64
17754.L_ALT_OP_MUL_INT: /* 0x92 */
17755/* File: armv5te/alt_stub.S */
17756/*
17757 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17758 * any interesting requests and then jump to the real instruction
17759 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17760 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17761 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17762 * bail to the real handler if breakFlags==0.
17763 */
17764    ldrb   r3, [rSELF, #offThread_breakFlags]
17765    adrl   lr, dvmAsmInstructionStart + (146 * 64)
17766    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17767    cmp    r3, #0
17768    bxeq   lr                   @ nothing to do - jump to real handler
17769    EXPORT_PC()
17770    mov    r0, rPC              @ arg0
17771    mov    r1, rFP              @ arg1
17772    mov    r2, rSELF            @ arg2
17773    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17774
17775/* ------------------------------ */
17776    .balign 64
17777.L_ALT_OP_DIV_INT: /* 0x93 */
17778/* File: armv5te/alt_stub.S */
17779/*
17780 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17781 * any interesting requests and then jump to the real instruction
17782 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17783 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17784 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17785 * bail to the real handler if breakFlags==0.
17786 */
17787    ldrb   r3, [rSELF, #offThread_breakFlags]
17788    adrl   lr, dvmAsmInstructionStart + (147 * 64)
17789    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17790    cmp    r3, #0
17791    bxeq   lr                   @ nothing to do - jump to real handler
17792    EXPORT_PC()
17793    mov    r0, rPC              @ arg0
17794    mov    r1, rFP              @ arg1
17795    mov    r2, rSELF            @ arg2
17796    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17797
17798/* ------------------------------ */
17799    .balign 64
17800.L_ALT_OP_REM_INT: /* 0x94 */
17801/* File: armv5te/alt_stub.S */
17802/*
17803 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17804 * any interesting requests and then jump to the real instruction
17805 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17806 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17807 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17808 * bail to the real handler if breakFlags==0.
17809 */
17810    ldrb   r3, [rSELF, #offThread_breakFlags]
17811    adrl   lr, dvmAsmInstructionStart + (148 * 64)
17812    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17813    cmp    r3, #0
17814    bxeq   lr                   @ nothing to do - jump to real handler
17815    EXPORT_PC()
17816    mov    r0, rPC              @ arg0
17817    mov    r1, rFP              @ arg1
17818    mov    r2, rSELF            @ arg2
17819    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17820
17821/* ------------------------------ */
17822    .balign 64
17823.L_ALT_OP_AND_INT: /* 0x95 */
17824/* File: armv5te/alt_stub.S */
17825/*
17826 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17827 * any interesting requests and then jump to the real instruction
17828 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17829 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17830 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17831 * bail to the real handler if breakFlags==0.
17832 */
17833    ldrb   r3, [rSELF, #offThread_breakFlags]
17834    adrl   lr, dvmAsmInstructionStart + (149 * 64)
17835    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17836    cmp    r3, #0
17837    bxeq   lr                   @ nothing to do - jump to real handler
17838    EXPORT_PC()
17839    mov    r0, rPC              @ arg0
17840    mov    r1, rFP              @ arg1
17841    mov    r2, rSELF            @ arg2
17842    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17843
17844/* ------------------------------ */
17845    .balign 64
17846.L_ALT_OP_OR_INT: /* 0x96 */
17847/* File: armv5te/alt_stub.S */
17848/*
17849 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17850 * any interesting requests and then jump to the real instruction
17851 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17852 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17853 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17854 * bail to the real handler if breakFlags==0.
17855 */
17856    ldrb   r3, [rSELF, #offThread_breakFlags]
17857    adrl   lr, dvmAsmInstructionStart + (150 * 64)
17858    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17859    cmp    r3, #0
17860    bxeq   lr                   @ nothing to do - jump to real handler
17861    EXPORT_PC()
17862    mov    r0, rPC              @ arg0
17863    mov    r1, rFP              @ arg1
17864    mov    r2, rSELF            @ arg2
17865    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17866
17867/* ------------------------------ */
17868    .balign 64
17869.L_ALT_OP_XOR_INT: /* 0x97 */
17870/* File: armv5te/alt_stub.S */
17871/*
17872 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17873 * any interesting requests and then jump to the real instruction
17874 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17875 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17876 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17877 * bail to the real handler if breakFlags==0.
17878 */
17879    ldrb   r3, [rSELF, #offThread_breakFlags]
17880    adrl   lr, dvmAsmInstructionStart + (151 * 64)
17881    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17882    cmp    r3, #0
17883    bxeq   lr                   @ nothing to do - jump to real handler
17884    EXPORT_PC()
17885    mov    r0, rPC              @ arg0
17886    mov    r1, rFP              @ arg1
17887    mov    r2, rSELF            @ arg2
17888    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17889
17890/* ------------------------------ */
17891    .balign 64
17892.L_ALT_OP_SHL_INT: /* 0x98 */
17893/* File: armv5te/alt_stub.S */
17894/*
17895 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17896 * any interesting requests and then jump to the real instruction
17897 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17898 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17899 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17900 * bail to the real handler if breakFlags==0.
17901 */
17902    ldrb   r3, [rSELF, #offThread_breakFlags]
17903    adrl   lr, dvmAsmInstructionStart + (152 * 64)
17904    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17905    cmp    r3, #0
17906    bxeq   lr                   @ nothing to do - jump to real handler
17907    EXPORT_PC()
17908    mov    r0, rPC              @ arg0
17909    mov    r1, rFP              @ arg1
17910    mov    r2, rSELF            @ arg2
17911    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17912
17913/* ------------------------------ */
17914    .balign 64
17915.L_ALT_OP_SHR_INT: /* 0x99 */
17916/* File: armv5te/alt_stub.S */
17917/*
17918 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17919 * any interesting requests and then jump to the real instruction
17920 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17921 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17922 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17923 * bail to the real handler if breakFlags==0.
17924 */
17925    ldrb   r3, [rSELF, #offThread_breakFlags]
17926    adrl   lr, dvmAsmInstructionStart + (153 * 64)
17927    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17928    cmp    r3, #0
17929    bxeq   lr                   @ nothing to do - jump to real handler
17930    EXPORT_PC()
17931    mov    r0, rPC              @ arg0
17932    mov    r1, rFP              @ arg1
17933    mov    r2, rSELF            @ arg2
17934    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17935
17936/* ------------------------------ */
17937    .balign 64
17938.L_ALT_OP_USHR_INT: /* 0x9a */
17939/* File: armv5te/alt_stub.S */
17940/*
17941 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17942 * any interesting requests and then jump to the real instruction
17943 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17944 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17945 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17946 * bail to the real handler if breakFlags==0.
17947 */
17948    ldrb   r3, [rSELF, #offThread_breakFlags]
17949    adrl   lr, dvmAsmInstructionStart + (154 * 64)
17950    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17951    cmp    r3, #0
17952    bxeq   lr                   @ nothing to do - jump to real handler
17953    EXPORT_PC()
17954    mov    r0, rPC              @ arg0
17955    mov    r1, rFP              @ arg1
17956    mov    r2, rSELF            @ arg2
17957    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17958
17959/* ------------------------------ */
17960    .balign 64
17961.L_ALT_OP_ADD_LONG: /* 0x9b */
17962/* File: armv5te/alt_stub.S */
17963/*
17964 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17965 * any interesting requests and then jump to the real instruction
17966 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17967 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17968 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17969 * bail to the real handler if breakFlags==0.
17970 */
17971    ldrb   r3, [rSELF, #offThread_breakFlags]
17972    adrl   lr, dvmAsmInstructionStart + (155 * 64)
17973    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17974    cmp    r3, #0
17975    bxeq   lr                   @ nothing to do - jump to real handler
17976    EXPORT_PC()
17977    mov    r0, rPC              @ arg0
17978    mov    r1, rFP              @ arg1
17979    mov    r2, rSELF            @ arg2
17980    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17981
17982/* ------------------------------ */
17983    .balign 64
17984.L_ALT_OP_SUB_LONG: /* 0x9c */
17985/* File: armv5te/alt_stub.S */
17986/*
17987 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17988 * any interesting requests and then jump to the real instruction
17989 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17990 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17991 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17992 * bail to the real handler if breakFlags==0.
17993 */
17994    ldrb   r3, [rSELF, #offThread_breakFlags]
17995    adrl   lr, dvmAsmInstructionStart + (156 * 64)
17996    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17997    cmp    r3, #0
17998    bxeq   lr                   @ nothing to do - jump to real handler
17999    EXPORT_PC()
18000    mov    r0, rPC              @ arg0
18001    mov    r1, rFP              @ arg1
18002    mov    r2, rSELF            @ arg2
18003    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18004
18005/* ------------------------------ */
18006    .balign 64
18007.L_ALT_OP_MUL_LONG: /* 0x9d */
18008/* File: armv5te/alt_stub.S */
18009/*
18010 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18011 * any interesting requests and then jump to the real instruction
18012 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18013 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18014 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18015 * bail to the real handler if breakFlags==0.
18016 */
18017    ldrb   r3, [rSELF, #offThread_breakFlags]
18018    adrl   lr, dvmAsmInstructionStart + (157 * 64)
18019    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18020    cmp    r3, #0
18021    bxeq   lr                   @ nothing to do - jump to real handler
18022    EXPORT_PC()
18023    mov    r0, rPC              @ arg0
18024    mov    r1, rFP              @ arg1
18025    mov    r2, rSELF            @ arg2
18026    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18027
18028/* ------------------------------ */
18029    .balign 64
18030.L_ALT_OP_DIV_LONG: /* 0x9e */
18031/* File: armv5te/alt_stub.S */
18032/*
18033 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18034 * any interesting requests and then jump to the real instruction
18035 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18036 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18037 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18038 * bail to the real handler if breakFlags==0.
18039 */
18040    ldrb   r3, [rSELF, #offThread_breakFlags]
18041    adrl   lr, dvmAsmInstructionStart + (158 * 64)
18042    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18043    cmp    r3, #0
18044    bxeq   lr                   @ nothing to do - jump to real handler
18045    EXPORT_PC()
18046    mov    r0, rPC              @ arg0
18047    mov    r1, rFP              @ arg1
18048    mov    r2, rSELF            @ arg2
18049    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18050
18051/* ------------------------------ */
18052    .balign 64
18053.L_ALT_OP_REM_LONG: /* 0x9f */
18054/* File: armv5te/alt_stub.S */
18055/*
18056 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18057 * any interesting requests and then jump to the real instruction
18058 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18059 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18060 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18061 * bail to the real handler if breakFlags==0.
18062 */
18063    ldrb   r3, [rSELF, #offThread_breakFlags]
18064    adrl   lr, dvmAsmInstructionStart + (159 * 64)
18065    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18066    cmp    r3, #0
18067    bxeq   lr                   @ nothing to do - jump to real handler
18068    EXPORT_PC()
18069    mov    r0, rPC              @ arg0
18070    mov    r1, rFP              @ arg1
18071    mov    r2, rSELF            @ arg2
18072    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18073
18074/* ------------------------------ */
18075    .balign 64
18076.L_ALT_OP_AND_LONG: /* 0xa0 */
18077/* File: armv5te/alt_stub.S */
18078/*
18079 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18080 * any interesting requests and then jump to the real instruction
18081 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18082 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18083 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18084 * bail to the real handler if breakFlags==0.
18085 */
18086    ldrb   r3, [rSELF, #offThread_breakFlags]
18087    adrl   lr, dvmAsmInstructionStart + (160 * 64)
18088    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18089    cmp    r3, #0
18090    bxeq   lr                   @ nothing to do - jump to real handler
18091    EXPORT_PC()
18092    mov    r0, rPC              @ arg0
18093    mov    r1, rFP              @ arg1
18094    mov    r2, rSELF            @ arg2
18095    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18096
18097/* ------------------------------ */
18098    .balign 64
18099.L_ALT_OP_OR_LONG: /* 0xa1 */
18100/* File: armv5te/alt_stub.S */
18101/*
18102 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18103 * any interesting requests and then jump to the real instruction
18104 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18105 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18106 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18107 * bail to the real handler if breakFlags==0.
18108 */
18109    ldrb   r3, [rSELF, #offThread_breakFlags]
18110    adrl   lr, dvmAsmInstructionStart + (161 * 64)
18111    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18112    cmp    r3, #0
18113    bxeq   lr                   @ nothing to do - jump to real handler
18114    EXPORT_PC()
18115    mov    r0, rPC              @ arg0
18116    mov    r1, rFP              @ arg1
18117    mov    r2, rSELF            @ arg2
18118    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18119
18120/* ------------------------------ */
18121    .balign 64
18122.L_ALT_OP_XOR_LONG: /* 0xa2 */
18123/* File: armv5te/alt_stub.S */
18124/*
18125 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18126 * any interesting requests and then jump to the real instruction
18127 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18128 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18129 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18130 * bail to the real handler if breakFlags==0.
18131 */
18132    ldrb   r3, [rSELF, #offThread_breakFlags]
18133    adrl   lr, dvmAsmInstructionStart + (162 * 64)
18134    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18135    cmp    r3, #0
18136    bxeq   lr                   @ nothing to do - jump to real handler
18137    EXPORT_PC()
18138    mov    r0, rPC              @ arg0
18139    mov    r1, rFP              @ arg1
18140    mov    r2, rSELF            @ arg2
18141    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18142
18143/* ------------------------------ */
18144    .balign 64
18145.L_ALT_OP_SHL_LONG: /* 0xa3 */
18146/* File: armv5te/alt_stub.S */
18147/*
18148 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18149 * any interesting requests and then jump to the real instruction
18150 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18151 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18152 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18153 * bail to the real handler if breakFlags==0.
18154 */
18155    ldrb   r3, [rSELF, #offThread_breakFlags]
18156    adrl   lr, dvmAsmInstructionStart + (163 * 64)
18157    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18158    cmp    r3, #0
18159    bxeq   lr                   @ nothing to do - jump to real handler
18160    EXPORT_PC()
18161    mov    r0, rPC              @ arg0
18162    mov    r1, rFP              @ arg1
18163    mov    r2, rSELF            @ arg2
18164    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18165
18166/* ------------------------------ */
18167    .balign 64
18168.L_ALT_OP_SHR_LONG: /* 0xa4 */
18169/* File: armv5te/alt_stub.S */
18170/*
18171 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18172 * any interesting requests and then jump to the real instruction
18173 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18174 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18175 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18176 * bail to the real handler if breakFlags==0.
18177 */
18178    ldrb   r3, [rSELF, #offThread_breakFlags]
18179    adrl   lr, dvmAsmInstructionStart + (164 * 64)
18180    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18181    cmp    r3, #0
18182    bxeq   lr                   @ nothing to do - jump to real handler
18183    EXPORT_PC()
18184    mov    r0, rPC              @ arg0
18185    mov    r1, rFP              @ arg1
18186    mov    r2, rSELF            @ arg2
18187    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18188
18189/* ------------------------------ */
18190    .balign 64
18191.L_ALT_OP_USHR_LONG: /* 0xa5 */
18192/* File: armv5te/alt_stub.S */
18193/*
18194 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18195 * any interesting requests and then jump to the real instruction
18196 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18197 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18198 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18199 * bail to the real handler if breakFlags==0.
18200 */
18201    ldrb   r3, [rSELF, #offThread_breakFlags]
18202    adrl   lr, dvmAsmInstructionStart + (165 * 64)
18203    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18204    cmp    r3, #0
18205    bxeq   lr                   @ nothing to do - jump to real handler
18206    EXPORT_PC()
18207    mov    r0, rPC              @ arg0
18208    mov    r1, rFP              @ arg1
18209    mov    r2, rSELF            @ arg2
18210    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18211
18212/* ------------------------------ */
18213    .balign 64
18214.L_ALT_OP_ADD_FLOAT: /* 0xa6 */
18215/* File: armv5te/alt_stub.S */
18216/*
18217 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18218 * any interesting requests and then jump to the real instruction
18219 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18220 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18221 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18222 * bail to the real handler if breakFlags==0.
18223 */
18224    ldrb   r3, [rSELF, #offThread_breakFlags]
18225    adrl   lr, dvmAsmInstructionStart + (166 * 64)
18226    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18227    cmp    r3, #0
18228    bxeq   lr                   @ nothing to do - jump to real handler
18229    EXPORT_PC()
18230    mov    r0, rPC              @ arg0
18231    mov    r1, rFP              @ arg1
18232    mov    r2, rSELF            @ arg2
18233    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18234
18235/* ------------------------------ */
18236    .balign 64
18237.L_ALT_OP_SUB_FLOAT: /* 0xa7 */
18238/* File: armv5te/alt_stub.S */
18239/*
18240 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18241 * any interesting requests and then jump to the real instruction
18242 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18243 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18244 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18245 * bail to the real handler if breakFlags==0.
18246 */
18247    ldrb   r3, [rSELF, #offThread_breakFlags]
18248    adrl   lr, dvmAsmInstructionStart + (167 * 64)
18249    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18250    cmp    r3, #0
18251    bxeq   lr                   @ nothing to do - jump to real handler
18252    EXPORT_PC()
18253    mov    r0, rPC              @ arg0
18254    mov    r1, rFP              @ arg1
18255    mov    r2, rSELF            @ arg2
18256    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18257
18258/* ------------------------------ */
18259    .balign 64
18260.L_ALT_OP_MUL_FLOAT: /* 0xa8 */
18261/* File: armv5te/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    ldrb   r3, [rSELF, #offThread_breakFlags]
18271    adrl   lr, dvmAsmInstructionStart + (168 * 64)
18272    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18273    cmp    r3, #0
18274    bxeq   lr                   @ nothing to do - jump to real handler
18275    EXPORT_PC()
18276    mov    r0, rPC              @ arg0
18277    mov    r1, rFP              @ arg1
18278    mov    r2, rSELF            @ arg2
18279    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18280
18281/* ------------------------------ */
18282    .balign 64
18283.L_ALT_OP_DIV_FLOAT: /* 0xa9 */
18284/* File: armv5te/alt_stub.S */
18285/*
18286 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18287 * any interesting requests and then jump to the real instruction
18288 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18289 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18290 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18291 * bail to the real handler if breakFlags==0.
18292 */
18293    ldrb   r3, [rSELF, #offThread_breakFlags]
18294    adrl   lr, dvmAsmInstructionStart + (169 * 64)
18295    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18296    cmp    r3, #0
18297    bxeq   lr                   @ nothing to do - jump to real handler
18298    EXPORT_PC()
18299    mov    r0, rPC              @ arg0
18300    mov    r1, rFP              @ arg1
18301    mov    r2, rSELF            @ arg2
18302    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18303
18304/* ------------------------------ */
18305    .balign 64
18306.L_ALT_OP_REM_FLOAT: /* 0xaa */
18307/* File: armv5te/alt_stub.S */
18308/*
18309 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18310 * any interesting requests and then jump to the real instruction
18311 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18312 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18313 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18314 * bail to the real handler if breakFlags==0.
18315 */
18316    ldrb   r3, [rSELF, #offThread_breakFlags]
18317    adrl   lr, dvmAsmInstructionStart + (170 * 64)
18318    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18319    cmp    r3, #0
18320    bxeq   lr                   @ nothing to do - jump to real handler
18321    EXPORT_PC()
18322    mov    r0, rPC              @ arg0
18323    mov    r1, rFP              @ arg1
18324    mov    r2, rSELF            @ arg2
18325    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18326
18327/* ------------------------------ */
18328    .balign 64
18329.L_ALT_OP_ADD_DOUBLE: /* 0xab */
18330/* File: armv5te/alt_stub.S */
18331/*
18332 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18333 * any interesting requests and then jump to the real instruction
18334 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18335 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18336 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18337 * bail to the real handler if breakFlags==0.
18338 */
18339    ldrb   r3, [rSELF, #offThread_breakFlags]
18340    adrl   lr, dvmAsmInstructionStart + (171 * 64)
18341    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18342    cmp    r3, #0
18343    bxeq   lr                   @ nothing to do - jump to real handler
18344    EXPORT_PC()
18345    mov    r0, rPC              @ arg0
18346    mov    r1, rFP              @ arg1
18347    mov    r2, rSELF            @ arg2
18348    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18349
18350/* ------------------------------ */
18351    .balign 64
18352.L_ALT_OP_SUB_DOUBLE: /* 0xac */
18353/* File: armv5te/alt_stub.S */
18354/*
18355 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18356 * any interesting requests and then jump to the real instruction
18357 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18358 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18359 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18360 * bail to the real handler if breakFlags==0.
18361 */
18362    ldrb   r3, [rSELF, #offThread_breakFlags]
18363    adrl   lr, dvmAsmInstructionStart + (172 * 64)
18364    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18365    cmp    r3, #0
18366    bxeq   lr                   @ nothing to do - jump to real handler
18367    EXPORT_PC()
18368    mov    r0, rPC              @ arg0
18369    mov    r1, rFP              @ arg1
18370    mov    r2, rSELF            @ arg2
18371    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18372
18373/* ------------------------------ */
18374    .balign 64
18375.L_ALT_OP_MUL_DOUBLE: /* 0xad */
18376/* File: armv5te/alt_stub.S */
18377/*
18378 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18379 * any interesting requests and then jump to the real instruction
18380 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18381 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18382 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18383 * bail to the real handler if breakFlags==0.
18384 */
18385    ldrb   r3, [rSELF, #offThread_breakFlags]
18386    adrl   lr, dvmAsmInstructionStart + (173 * 64)
18387    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18388    cmp    r3, #0
18389    bxeq   lr                   @ nothing to do - jump to real handler
18390    EXPORT_PC()
18391    mov    r0, rPC              @ arg0
18392    mov    r1, rFP              @ arg1
18393    mov    r2, rSELF            @ arg2
18394    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18395
18396/* ------------------------------ */
18397    .balign 64
18398.L_ALT_OP_DIV_DOUBLE: /* 0xae */
18399/* File: armv5te/alt_stub.S */
18400/*
18401 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18402 * any interesting requests and then jump to the real instruction
18403 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18404 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18405 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18406 * bail to the real handler if breakFlags==0.
18407 */
18408    ldrb   r3, [rSELF, #offThread_breakFlags]
18409    adrl   lr, dvmAsmInstructionStart + (174 * 64)
18410    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18411    cmp    r3, #0
18412    bxeq   lr                   @ nothing to do - jump to real handler
18413    EXPORT_PC()
18414    mov    r0, rPC              @ arg0
18415    mov    r1, rFP              @ arg1
18416    mov    r2, rSELF            @ arg2
18417    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18418
18419/* ------------------------------ */
18420    .balign 64
18421.L_ALT_OP_REM_DOUBLE: /* 0xaf */
18422/* File: armv5te/alt_stub.S */
18423/*
18424 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18425 * any interesting requests and then jump to the real instruction
18426 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18427 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18428 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18429 * bail to the real handler if breakFlags==0.
18430 */
18431    ldrb   r3, [rSELF, #offThread_breakFlags]
18432    adrl   lr, dvmAsmInstructionStart + (175 * 64)
18433    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18434    cmp    r3, #0
18435    bxeq   lr                   @ nothing to do - jump to real handler
18436    EXPORT_PC()
18437    mov    r0, rPC              @ arg0
18438    mov    r1, rFP              @ arg1
18439    mov    r2, rSELF            @ arg2
18440    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18441
18442/* ------------------------------ */
18443    .balign 64
18444.L_ALT_OP_ADD_INT_2ADDR: /* 0xb0 */
18445/* File: armv5te/alt_stub.S */
18446/*
18447 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18448 * any interesting requests and then jump to the real instruction
18449 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18450 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18451 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18452 * bail to the real handler if breakFlags==0.
18453 */
18454    ldrb   r3, [rSELF, #offThread_breakFlags]
18455    adrl   lr, dvmAsmInstructionStart + (176 * 64)
18456    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18457    cmp    r3, #0
18458    bxeq   lr                   @ nothing to do - jump to real handler
18459    EXPORT_PC()
18460    mov    r0, rPC              @ arg0
18461    mov    r1, rFP              @ arg1
18462    mov    r2, rSELF            @ arg2
18463    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18464
18465/* ------------------------------ */
18466    .balign 64
18467.L_ALT_OP_SUB_INT_2ADDR: /* 0xb1 */
18468/* File: armv5te/alt_stub.S */
18469/*
18470 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18471 * any interesting requests and then jump to the real instruction
18472 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18473 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18474 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18475 * bail to the real handler if breakFlags==0.
18476 */
18477    ldrb   r3, [rSELF, #offThread_breakFlags]
18478    adrl   lr, dvmAsmInstructionStart + (177 * 64)
18479    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18480    cmp    r3, #0
18481    bxeq   lr                   @ nothing to do - jump to real handler
18482    EXPORT_PC()
18483    mov    r0, rPC              @ arg0
18484    mov    r1, rFP              @ arg1
18485    mov    r2, rSELF            @ arg2
18486    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18487
18488/* ------------------------------ */
18489    .balign 64
18490.L_ALT_OP_MUL_INT_2ADDR: /* 0xb2 */
18491/* File: armv5te/alt_stub.S */
18492/*
18493 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18494 * any interesting requests and then jump to the real instruction
18495 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18496 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18497 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18498 * bail to the real handler if breakFlags==0.
18499 */
18500    ldrb   r3, [rSELF, #offThread_breakFlags]
18501    adrl   lr, dvmAsmInstructionStart + (178 * 64)
18502    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18503    cmp    r3, #0
18504    bxeq   lr                   @ nothing to do - jump to real handler
18505    EXPORT_PC()
18506    mov    r0, rPC              @ arg0
18507    mov    r1, rFP              @ arg1
18508    mov    r2, rSELF            @ arg2
18509    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18510
18511/* ------------------------------ */
18512    .balign 64
18513.L_ALT_OP_DIV_INT_2ADDR: /* 0xb3 */
18514/* File: armv5te/alt_stub.S */
18515/*
18516 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18517 * any interesting requests and then jump to the real instruction
18518 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18519 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18520 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18521 * bail to the real handler if breakFlags==0.
18522 */
18523    ldrb   r3, [rSELF, #offThread_breakFlags]
18524    adrl   lr, dvmAsmInstructionStart + (179 * 64)
18525    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18526    cmp    r3, #0
18527    bxeq   lr                   @ nothing to do - jump to real handler
18528    EXPORT_PC()
18529    mov    r0, rPC              @ arg0
18530    mov    r1, rFP              @ arg1
18531    mov    r2, rSELF            @ arg2
18532    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18533
18534/* ------------------------------ */
18535    .balign 64
18536.L_ALT_OP_REM_INT_2ADDR: /* 0xb4 */
18537/* File: armv5te/alt_stub.S */
18538/*
18539 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18540 * any interesting requests and then jump to the real instruction
18541 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18542 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18543 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18544 * bail to the real handler if breakFlags==0.
18545 */
18546    ldrb   r3, [rSELF, #offThread_breakFlags]
18547    adrl   lr, dvmAsmInstructionStart + (180 * 64)
18548    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18549    cmp    r3, #0
18550    bxeq   lr                   @ nothing to do - jump to real handler
18551    EXPORT_PC()
18552    mov    r0, rPC              @ arg0
18553    mov    r1, rFP              @ arg1
18554    mov    r2, rSELF            @ arg2
18555    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18556
18557/* ------------------------------ */
18558    .balign 64
18559.L_ALT_OP_AND_INT_2ADDR: /* 0xb5 */
18560/* File: armv5te/alt_stub.S */
18561/*
18562 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18563 * any interesting requests and then jump to the real instruction
18564 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18565 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18566 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18567 * bail to the real handler if breakFlags==0.
18568 */
18569    ldrb   r3, [rSELF, #offThread_breakFlags]
18570    adrl   lr, dvmAsmInstructionStart + (181 * 64)
18571    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18572    cmp    r3, #0
18573    bxeq   lr                   @ nothing to do - jump to real handler
18574    EXPORT_PC()
18575    mov    r0, rPC              @ arg0
18576    mov    r1, rFP              @ arg1
18577    mov    r2, rSELF            @ arg2
18578    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18579
18580/* ------------------------------ */
18581    .balign 64
18582.L_ALT_OP_OR_INT_2ADDR: /* 0xb6 */
18583/* File: armv5te/alt_stub.S */
18584/*
18585 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18586 * any interesting requests and then jump to the real instruction
18587 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18588 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18589 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18590 * bail to the real handler if breakFlags==0.
18591 */
18592    ldrb   r3, [rSELF, #offThread_breakFlags]
18593    adrl   lr, dvmAsmInstructionStart + (182 * 64)
18594    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18595    cmp    r3, #0
18596    bxeq   lr                   @ nothing to do - jump to real handler
18597    EXPORT_PC()
18598    mov    r0, rPC              @ arg0
18599    mov    r1, rFP              @ arg1
18600    mov    r2, rSELF            @ arg2
18601    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18602
18603/* ------------------------------ */
18604    .balign 64
18605.L_ALT_OP_XOR_INT_2ADDR: /* 0xb7 */
18606/* File: armv5te/alt_stub.S */
18607/*
18608 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18609 * any interesting requests and then jump to the real instruction
18610 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18611 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18612 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18613 * bail to the real handler if breakFlags==0.
18614 */
18615    ldrb   r3, [rSELF, #offThread_breakFlags]
18616    adrl   lr, dvmAsmInstructionStart + (183 * 64)
18617    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18618    cmp    r3, #0
18619    bxeq   lr                   @ nothing to do - jump to real handler
18620    EXPORT_PC()
18621    mov    r0, rPC              @ arg0
18622    mov    r1, rFP              @ arg1
18623    mov    r2, rSELF            @ arg2
18624    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18625
18626/* ------------------------------ */
18627    .balign 64
18628.L_ALT_OP_SHL_INT_2ADDR: /* 0xb8 */
18629/* File: armv5te/alt_stub.S */
18630/*
18631 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18632 * any interesting requests and then jump to the real instruction
18633 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18634 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18635 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18636 * bail to the real handler if breakFlags==0.
18637 */
18638    ldrb   r3, [rSELF, #offThread_breakFlags]
18639    adrl   lr, dvmAsmInstructionStart + (184 * 64)
18640    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18641    cmp    r3, #0
18642    bxeq   lr                   @ nothing to do - jump to real handler
18643    EXPORT_PC()
18644    mov    r0, rPC              @ arg0
18645    mov    r1, rFP              @ arg1
18646    mov    r2, rSELF            @ arg2
18647    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18648
18649/* ------------------------------ */
18650    .balign 64
18651.L_ALT_OP_SHR_INT_2ADDR: /* 0xb9 */
18652/* File: armv5te/alt_stub.S */
18653/*
18654 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18655 * any interesting requests and then jump to the real instruction
18656 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18657 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18658 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18659 * bail to the real handler if breakFlags==0.
18660 */
18661    ldrb   r3, [rSELF, #offThread_breakFlags]
18662    adrl   lr, dvmAsmInstructionStart + (185 * 64)
18663    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18664    cmp    r3, #0
18665    bxeq   lr                   @ nothing to do - jump to real handler
18666    EXPORT_PC()
18667    mov    r0, rPC              @ arg0
18668    mov    r1, rFP              @ arg1
18669    mov    r2, rSELF            @ arg2
18670    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18671
18672/* ------------------------------ */
18673    .balign 64
18674.L_ALT_OP_USHR_INT_2ADDR: /* 0xba */
18675/* File: armv5te/alt_stub.S */
18676/*
18677 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18678 * any interesting requests and then jump to the real instruction
18679 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18680 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18681 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18682 * bail to the real handler if breakFlags==0.
18683 */
18684    ldrb   r3, [rSELF, #offThread_breakFlags]
18685    adrl   lr, dvmAsmInstructionStart + (186 * 64)
18686    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18687    cmp    r3, #0
18688    bxeq   lr                   @ nothing to do - jump to real handler
18689    EXPORT_PC()
18690    mov    r0, rPC              @ arg0
18691    mov    r1, rFP              @ arg1
18692    mov    r2, rSELF            @ arg2
18693    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18694
18695/* ------------------------------ */
18696    .balign 64
18697.L_ALT_OP_ADD_LONG_2ADDR: /* 0xbb */
18698/* File: armv5te/alt_stub.S */
18699/*
18700 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18701 * any interesting requests and then jump to the real instruction
18702 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18703 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18704 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18705 * bail to the real handler if breakFlags==0.
18706 */
18707    ldrb   r3, [rSELF, #offThread_breakFlags]
18708    adrl   lr, dvmAsmInstructionStart + (187 * 64)
18709    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18710    cmp    r3, #0
18711    bxeq   lr                   @ nothing to do - jump to real handler
18712    EXPORT_PC()
18713    mov    r0, rPC              @ arg0
18714    mov    r1, rFP              @ arg1
18715    mov    r2, rSELF            @ arg2
18716    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18717
18718/* ------------------------------ */
18719    .balign 64
18720.L_ALT_OP_SUB_LONG_2ADDR: /* 0xbc */
18721/* File: armv5te/alt_stub.S */
18722/*
18723 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18724 * any interesting requests and then jump to the real instruction
18725 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18726 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18727 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18728 * bail to the real handler if breakFlags==0.
18729 */
18730    ldrb   r3, [rSELF, #offThread_breakFlags]
18731    adrl   lr, dvmAsmInstructionStart + (188 * 64)
18732    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18733    cmp    r3, #0
18734    bxeq   lr                   @ nothing to do - jump to real handler
18735    EXPORT_PC()
18736    mov    r0, rPC              @ arg0
18737    mov    r1, rFP              @ arg1
18738    mov    r2, rSELF            @ arg2
18739    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18740
18741/* ------------------------------ */
18742    .balign 64
18743.L_ALT_OP_MUL_LONG_2ADDR: /* 0xbd */
18744/* File: armv5te/alt_stub.S */
18745/*
18746 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18747 * any interesting requests and then jump to the real instruction
18748 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18749 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18750 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18751 * bail to the real handler if breakFlags==0.
18752 */
18753    ldrb   r3, [rSELF, #offThread_breakFlags]
18754    adrl   lr, dvmAsmInstructionStart + (189 * 64)
18755    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18756    cmp    r3, #0
18757    bxeq   lr                   @ nothing to do - jump to real handler
18758    EXPORT_PC()
18759    mov    r0, rPC              @ arg0
18760    mov    r1, rFP              @ arg1
18761    mov    r2, rSELF            @ arg2
18762    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18763
18764/* ------------------------------ */
18765    .balign 64
18766.L_ALT_OP_DIV_LONG_2ADDR: /* 0xbe */
18767/* File: armv5te/alt_stub.S */
18768/*
18769 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18770 * any interesting requests and then jump to the real instruction
18771 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18772 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18773 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18774 * bail to the real handler if breakFlags==0.
18775 */
18776    ldrb   r3, [rSELF, #offThread_breakFlags]
18777    adrl   lr, dvmAsmInstructionStart + (190 * 64)
18778    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18779    cmp    r3, #0
18780    bxeq   lr                   @ nothing to do - jump to real handler
18781    EXPORT_PC()
18782    mov    r0, rPC              @ arg0
18783    mov    r1, rFP              @ arg1
18784    mov    r2, rSELF            @ arg2
18785    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18786
18787/* ------------------------------ */
18788    .balign 64
18789.L_ALT_OP_REM_LONG_2ADDR: /* 0xbf */
18790/* File: armv5te/alt_stub.S */
18791/*
18792 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18793 * any interesting requests and then jump to the real instruction
18794 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18795 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18796 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18797 * bail to the real handler if breakFlags==0.
18798 */
18799    ldrb   r3, [rSELF, #offThread_breakFlags]
18800    adrl   lr, dvmAsmInstructionStart + (191 * 64)
18801    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18802    cmp    r3, #0
18803    bxeq   lr                   @ nothing to do - jump to real handler
18804    EXPORT_PC()
18805    mov    r0, rPC              @ arg0
18806    mov    r1, rFP              @ arg1
18807    mov    r2, rSELF            @ arg2
18808    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18809
18810/* ------------------------------ */
18811    .balign 64
18812.L_ALT_OP_AND_LONG_2ADDR: /* 0xc0 */
18813/* File: armv5te/alt_stub.S */
18814/*
18815 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18816 * any interesting requests and then jump to the real instruction
18817 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18818 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18819 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18820 * bail to the real handler if breakFlags==0.
18821 */
18822    ldrb   r3, [rSELF, #offThread_breakFlags]
18823    adrl   lr, dvmAsmInstructionStart + (192 * 64)
18824    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18825    cmp    r3, #0
18826    bxeq   lr                   @ nothing to do - jump to real handler
18827    EXPORT_PC()
18828    mov    r0, rPC              @ arg0
18829    mov    r1, rFP              @ arg1
18830    mov    r2, rSELF            @ arg2
18831    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18832
18833/* ------------------------------ */
18834    .balign 64
18835.L_ALT_OP_OR_LONG_2ADDR: /* 0xc1 */
18836/* File: armv5te/alt_stub.S */
18837/*
18838 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18839 * any interesting requests and then jump to the real instruction
18840 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18841 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18842 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18843 * bail to the real handler if breakFlags==0.
18844 */
18845    ldrb   r3, [rSELF, #offThread_breakFlags]
18846    adrl   lr, dvmAsmInstructionStart + (193 * 64)
18847    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18848    cmp    r3, #0
18849    bxeq   lr                   @ nothing to do - jump to real handler
18850    EXPORT_PC()
18851    mov    r0, rPC              @ arg0
18852    mov    r1, rFP              @ arg1
18853    mov    r2, rSELF            @ arg2
18854    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18855
18856/* ------------------------------ */
18857    .balign 64
18858.L_ALT_OP_XOR_LONG_2ADDR: /* 0xc2 */
18859/* File: armv5te/alt_stub.S */
18860/*
18861 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18862 * any interesting requests and then jump to the real instruction
18863 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18864 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18865 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18866 * bail to the real handler if breakFlags==0.
18867 */
18868    ldrb   r3, [rSELF, #offThread_breakFlags]
18869    adrl   lr, dvmAsmInstructionStart + (194 * 64)
18870    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18871    cmp    r3, #0
18872    bxeq   lr                   @ nothing to do - jump to real handler
18873    EXPORT_PC()
18874    mov    r0, rPC              @ arg0
18875    mov    r1, rFP              @ arg1
18876    mov    r2, rSELF            @ arg2
18877    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18878
18879/* ------------------------------ */
18880    .balign 64
18881.L_ALT_OP_SHL_LONG_2ADDR: /* 0xc3 */
18882/* File: armv5te/alt_stub.S */
18883/*
18884 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18885 * any interesting requests and then jump to the real instruction
18886 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18887 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18888 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18889 * bail to the real handler if breakFlags==0.
18890 */
18891    ldrb   r3, [rSELF, #offThread_breakFlags]
18892    adrl   lr, dvmAsmInstructionStart + (195 * 64)
18893    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18894    cmp    r3, #0
18895    bxeq   lr                   @ nothing to do - jump to real handler
18896    EXPORT_PC()
18897    mov    r0, rPC              @ arg0
18898    mov    r1, rFP              @ arg1
18899    mov    r2, rSELF            @ arg2
18900    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18901
18902/* ------------------------------ */
18903    .balign 64
18904.L_ALT_OP_SHR_LONG_2ADDR: /* 0xc4 */
18905/* File: armv5te/alt_stub.S */
18906/*
18907 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18908 * any interesting requests and then jump to the real instruction
18909 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18910 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18911 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18912 * bail to the real handler if breakFlags==0.
18913 */
18914    ldrb   r3, [rSELF, #offThread_breakFlags]
18915    adrl   lr, dvmAsmInstructionStart + (196 * 64)
18916    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18917    cmp    r3, #0
18918    bxeq   lr                   @ nothing to do - jump to real handler
18919    EXPORT_PC()
18920    mov    r0, rPC              @ arg0
18921    mov    r1, rFP              @ arg1
18922    mov    r2, rSELF            @ arg2
18923    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18924
18925/* ------------------------------ */
18926    .balign 64
18927.L_ALT_OP_USHR_LONG_2ADDR: /* 0xc5 */
18928/* File: armv5te/alt_stub.S */
18929/*
18930 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18931 * any interesting requests and then jump to the real instruction
18932 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18933 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18934 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18935 * bail to the real handler if breakFlags==0.
18936 */
18937    ldrb   r3, [rSELF, #offThread_breakFlags]
18938    adrl   lr, dvmAsmInstructionStart + (197 * 64)
18939    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18940    cmp    r3, #0
18941    bxeq   lr                   @ nothing to do - jump to real handler
18942    EXPORT_PC()
18943    mov    r0, rPC              @ arg0
18944    mov    r1, rFP              @ arg1
18945    mov    r2, rSELF            @ arg2
18946    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18947
18948/* ------------------------------ */
18949    .balign 64
18950.L_ALT_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
18951/* File: armv5te/alt_stub.S */
18952/*
18953 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18954 * any interesting requests and then jump to the real instruction
18955 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18956 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18957 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18958 * bail to the real handler if breakFlags==0.
18959 */
18960    ldrb   r3, [rSELF, #offThread_breakFlags]
18961    adrl   lr, dvmAsmInstructionStart + (198 * 64)
18962    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18963    cmp    r3, #0
18964    bxeq   lr                   @ nothing to do - jump to real handler
18965    EXPORT_PC()
18966    mov    r0, rPC              @ arg0
18967    mov    r1, rFP              @ arg1
18968    mov    r2, rSELF            @ arg2
18969    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18970
18971/* ------------------------------ */
18972    .balign 64
18973.L_ALT_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
18974/* File: armv5te/alt_stub.S */
18975/*
18976 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18977 * any interesting requests and then jump to the real instruction
18978 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18979 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18980 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18981 * bail to the real handler if breakFlags==0.
18982 */
18983    ldrb   r3, [rSELF, #offThread_breakFlags]
18984    adrl   lr, dvmAsmInstructionStart + (199 * 64)
18985    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18986    cmp    r3, #0
18987    bxeq   lr                   @ nothing to do - jump to real handler
18988    EXPORT_PC()
18989    mov    r0, rPC              @ arg0
18990    mov    r1, rFP              @ arg1
18991    mov    r2, rSELF            @ arg2
18992    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18993
18994/* ------------------------------ */
18995    .balign 64
18996.L_ALT_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
18997/* File: armv5te/alt_stub.S */
18998/*
18999 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19000 * any interesting requests and then jump to the real instruction
19001 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19002 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19003 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19004 * bail to the real handler if breakFlags==0.
19005 */
19006    ldrb   r3, [rSELF, #offThread_breakFlags]
19007    adrl   lr, dvmAsmInstructionStart + (200 * 64)
19008    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19009    cmp    r3, #0
19010    bxeq   lr                   @ nothing to do - jump to real handler
19011    EXPORT_PC()
19012    mov    r0, rPC              @ arg0
19013    mov    r1, rFP              @ arg1
19014    mov    r2, rSELF            @ arg2
19015    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19016
19017/* ------------------------------ */
19018    .balign 64
19019.L_ALT_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
19020/* File: armv5te/alt_stub.S */
19021/*
19022 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19023 * any interesting requests and then jump to the real instruction
19024 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19025 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19026 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19027 * bail to the real handler if breakFlags==0.
19028 */
19029    ldrb   r3, [rSELF, #offThread_breakFlags]
19030    adrl   lr, dvmAsmInstructionStart + (201 * 64)
19031    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19032    cmp    r3, #0
19033    bxeq   lr                   @ nothing to do - jump to real handler
19034    EXPORT_PC()
19035    mov    r0, rPC              @ arg0
19036    mov    r1, rFP              @ arg1
19037    mov    r2, rSELF            @ arg2
19038    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19039
19040/* ------------------------------ */
19041    .balign 64
19042.L_ALT_OP_REM_FLOAT_2ADDR: /* 0xca */
19043/* File: armv5te/alt_stub.S */
19044/*
19045 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19046 * any interesting requests and then jump to the real instruction
19047 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19048 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19049 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19050 * bail to the real handler if breakFlags==0.
19051 */
19052    ldrb   r3, [rSELF, #offThread_breakFlags]
19053    adrl   lr, dvmAsmInstructionStart + (202 * 64)
19054    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19055    cmp    r3, #0
19056    bxeq   lr                   @ nothing to do - jump to real handler
19057    EXPORT_PC()
19058    mov    r0, rPC              @ arg0
19059    mov    r1, rFP              @ arg1
19060    mov    r2, rSELF            @ arg2
19061    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19062
19063/* ------------------------------ */
19064    .balign 64
19065.L_ALT_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
19066/* File: armv5te/alt_stub.S */
19067/*
19068 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19069 * any interesting requests and then jump to the real instruction
19070 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19071 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19072 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19073 * bail to the real handler if breakFlags==0.
19074 */
19075    ldrb   r3, [rSELF, #offThread_breakFlags]
19076    adrl   lr, dvmAsmInstructionStart + (203 * 64)
19077    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19078    cmp    r3, #0
19079    bxeq   lr                   @ nothing to do - jump to real handler
19080    EXPORT_PC()
19081    mov    r0, rPC              @ arg0
19082    mov    r1, rFP              @ arg1
19083    mov    r2, rSELF            @ arg2
19084    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19085
19086/* ------------------------------ */
19087    .balign 64
19088.L_ALT_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
19089/* File: armv5te/alt_stub.S */
19090/*
19091 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19092 * any interesting requests and then jump to the real instruction
19093 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19094 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19095 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19096 * bail to the real handler if breakFlags==0.
19097 */
19098    ldrb   r3, [rSELF, #offThread_breakFlags]
19099    adrl   lr, dvmAsmInstructionStart + (204 * 64)
19100    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19101    cmp    r3, #0
19102    bxeq   lr                   @ nothing to do - jump to real handler
19103    EXPORT_PC()
19104    mov    r0, rPC              @ arg0
19105    mov    r1, rFP              @ arg1
19106    mov    r2, rSELF            @ arg2
19107    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19108
19109/* ------------------------------ */
19110    .balign 64
19111.L_ALT_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
19112/* File: armv5te/alt_stub.S */
19113/*
19114 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19115 * any interesting requests and then jump to the real instruction
19116 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19117 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19118 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19119 * bail to the real handler if breakFlags==0.
19120 */
19121    ldrb   r3, [rSELF, #offThread_breakFlags]
19122    adrl   lr, dvmAsmInstructionStart + (205 * 64)
19123    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19124    cmp    r3, #0
19125    bxeq   lr                   @ nothing to do - jump to real handler
19126    EXPORT_PC()
19127    mov    r0, rPC              @ arg0
19128    mov    r1, rFP              @ arg1
19129    mov    r2, rSELF            @ arg2
19130    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19131
19132/* ------------------------------ */
19133    .balign 64
19134.L_ALT_OP_DIV_DOUBLE_2ADDR: /* 0xce */
19135/* File: armv5te/alt_stub.S */
19136/*
19137 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19138 * any interesting requests and then jump to the real instruction
19139 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19140 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19141 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19142 * bail to the real handler if breakFlags==0.
19143 */
19144    ldrb   r3, [rSELF, #offThread_breakFlags]
19145    adrl   lr, dvmAsmInstructionStart + (206 * 64)
19146    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19147    cmp    r3, #0
19148    bxeq   lr                   @ nothing to do - jump to real handler
19149    EXPORT_PC()
19150    mov    r0, rPC              @ arg0
19151    mov    r1, rFP              @ arg1
19152    mov    r2, rSELF            @ arg2
19153    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19154
19155/* ------------------------------ */
19156    .balign 64
19157.L_ALT_OP_REM_DOUBLE_2ADDR: /* 0xcf */
19158/* File: armv5te/alt_stub.S */
19159/*
19160 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19161 * any interesting requests and then jump to the real instruction
19162 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19163 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19164 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19165 * bail to the real handler if breakFlags==0.
19166 */
19167    ldrb   r3, [rSELF, #offThread_breakFlags]
19168    adrl   lr, dvmAsmInstructionStart + (207 * 64)
19169    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19170    cmp    r3, #0
19171    bxeq   lr                   @ nothing to do - jump to real handler
19172    EXPORT_PC()
19173    mov    r0, rPC              @ arg0
19174    mov    r1, rFP              @ arg1
19175    mov    r2, rSELF            @ arg2
19176    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19177
19178/* ------------------------------ */
19179    .balign 64
19180.L_ALT_OP_ADD_INT_LIT16: /* 0xd0 */
19181/* File: armv5te/alt_stub.S */
19182/*
19183 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19184 * any interesting requests and then jump to the real instruction
19185 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19186 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19187 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19188 * bail to the real handler if breakFlags==0.
19189 */
19190    ldrb   r3, [rSELF, #offThread_breakFlags]
19191    adrl   lr, dvmAsmInstructionStart + (208 * 64)
19192    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19193    cmp    r3, #0
19194    bxeq   lr                   @ nothing to do - jump to real handler
19195    EXPORT_PC()
19196    mov    r0, rPC              @ arg0
19197    mov    r1, rFP              @ arg1
19198    mov    r2, rSELF            @ arg2
19199    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19200
19201/* ------------------------------ */
19202    .balign 64
19203.L_ALT_OP_RSUB_INT: /* 0xd1 */
19204/* File: armv5te/alt_stub.S */
19205/*
19206 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19207 * any interesting requests and then jump to the real instruction
19208 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19209 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19210 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19211 * bail to the real handler if breakFlags==0.
19212 */
19213    ldrb   r3, [rSELF, #offThread_breakFlags]
19214    adrl   lr, dvmAsmInstructionStart + (209 * 64)
19215    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19216    cmp    r3, #0
19217    bxeq   lr                   @ nothing to do - jump to real handler
19218    EXPORT_PC()
19219    mov    r0, rPC              @ arg0
19220    mov    r1, rFP              @ arg1
19221    mov    r2, rSELF            @ arg2
19222    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19223
19224/* ------------------------------ */
19225    .balign 64
19226.L_ALT_OP_MUL_INT_LIT16: /* 0xd2 */
19227/* File: armv5te/alt_stub.S */
19228/*
19229 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19230 * any interesting requests and then jump to the real instruction
19231 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19232 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19233 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19234 * bail to the real handler if breakFlags==0.
19235 */
19236    ldrb   r3, [rSELF, #offThread_breakFlags]
19237    adrl   lr, dvmAsmInstructionStart + (210 * 64)
19238    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19239    cmp    r3, #0
19240    bxeq   lr                   @ nothing to do - jump to real handler
19241    EXPORT_PC()
19242    mov    r0, rPC              @ arg0
19243    mov    r1, rFP              @ arg1
19244    mov    r2, rSELF            @ arg2
19245    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19246
19247/* ------------------------------ */
19248    .balign 64
19249.L_ALT_OP_DIV_INT_LIT16: /* 0xd3 */
19250/* File: armv5te/alt_stub.S */
19251/*
19252 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19253 * any interesting requests and then jump to the real instruction
19254 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19255 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19256 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19257 * bail to the real handler if breakFlags==0.
19258 */
19259    ldrb   r3, [rSELF, #offThread_breakFlags]
19260    adrl   lr, dvmAsmInstructionStart + (211 * 64)
19261    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19262    cmp    r3, #0
19263    bxeq   lr                   @ nothing to do - jump to real handler
19264    EXPORT_PC()
19265    mov    r0, rPC              @ arg0
19266    mov    r1, rFP              @ arg1
19267    mov    r2, rSELF            @ arg2
19268    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19269
19270/* ------------------------------ */
19271    .balign 64
19272.L_ALT_OP_REM_INT_LIT16: /* 0xd4 */
19273/* File: armv5te/alt_stub.S */
19274/*
19275 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19276 * any interesting requests and then jump to the real instruction
19277 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19278 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19279 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19280 * bail to the real handler if breakFlags==0.
19281 */
19282    ldrb   r3, [rSELF, #offThread_breakFlags]
19283    adrl   lr, dvmAsmInstructionStart + (212 * 64)
19284    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19285    cmp    r3, #0
19286    bxeq   lr                   @ nothing to do - jump to real handler
19287    EXPORT_PC()
19288    mov    r0, rPC              @ arg0
19289    mov    r1, rFP              @ arg1
19290    mov    r2, rSELF            @ arg2
19291    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19292
19293/* ------------------------------ */
19294    .balign 64
19295.L_ALT_OP_AND_INT_LIT16: /* 0xd5 */
19296/* File: armv5te/alt_stub.S */
19297/*
19298 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19299 * any interesting requests and then jump to the real instruction
19300 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19301 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19302 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19303 * bail to the real handler if breakFlags==0.
19304 */
19305    ldrb   r3, [rSELF, #offThread_breakFlags]
19306    adrl   lr, dvmAsmInstructionStart + (213 * 64)
19307    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19308    cmp    r3, #0
19309    bxeq   lr                   @ nothing to do - jump to real handler
19310    EXPORT_PC()
19311    mov    r0, rPC              @ arg0
19312    mov    r1, rFP              @ arg1
19313    mov    r2, rSELF            @ arg2
19314    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19315
19316/* ------------------------------ */
19317    .balign 64
19318.L_ALT_OP_OR_INT_LIT16: /* 0xd6 */
19319/* File: armv5te/alt_stub.S */
19320/*
19321 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19322 * any interesting requests and then jump to the real instruction
19323 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19324 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19325 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19326 * bail to the real handler if breakFlags==0.
19327 */
19328    ldrb   r3, [rSELF, #offThread_breakFlags]
19329    adrl   lr, dvmAsmInstructionStart + (214 * 64)
19330    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19331    cmp    r3, #0
19332    bxeq   lr                   @ nothing to do - jump to real handler
19333    EXPORT_PC()
19334    mov    r0, rPC              @ arg0
19335    mov    r1, rFP              @ arg1
19336    mov    r2, rSELF            @ arg2
19337    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19338
19339/* ------------------------------ */
19340    .balign 64
19341.L_ALT_OP_XOR_INT_LIT16: /* 0xd7 */
19342/* File: armv5te/alt_stub.S */
19343/*
19344 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19345 * any interesting requests and then jump to the real instruction
19346 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19347 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19348 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19349 * bail to the real handler if breakFlags==0.
19350 */
19351    ldrb   r3, [rSELF, #offThread_breakFlags]
19352    adrl   lr, dvmAsmInstructionStart + (215 * 64)
19353    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19354    cmp    r3, #0
19355    bxeq   lr                   @ nothing to do - jump to real handler
19356    EXPORT_PC()
19357    mov    r0, rPC              @ arg0
19358    mov    r1, rFP              @ arg1
19359    mov    r2, rSELF            @ arg2
19360    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19361
19362/* ------------------------------ */
19363    .balign 64
19364.L_ALT_OP_ADD_INT_LIT8: /* 0xd8 */
19365/* File: armv5te/alt_stub.S */
19366/*
19367 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19368 * any interesting requests and then jump to the real instruction
19369 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19370 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19371 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19372 * bail to the real handler if breakFlags==0.
19373 */
19374    ldrb   r3, [rSELF, #offThread_breakFlags]
19375    adrl   lr, dvmAsmInstructionStart + (216 * 64)
19376    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19377    cmp    r3, #0
19378    bxeq   lr                   @ nothing to do - jump to real handler
19379    EXPORT_PC()
19380    mov    r0, rPC              @ arg0
19381    mov    r1, rFP              @ arg1
19382    mov    r2, rSELF            @ arg2
19383    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19384
19385/* ------------------------------ */
19386    .balign 64
19387.L_ALT_OP_RSUB_INT_LIT8: /* 0xd9 */
19388/* File: armv5te/alt_stub.S */
19389/*
19390 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19391 * any interesting requests and then jump to the real instruction
19392 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19393 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19394 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19395 * bail to the real handler if breakFlags==0.
19396 */
19397    ldrb   r3, [rSELF, #offThread_breakFlags]
19398    adrl   lr, dvmAsmInstructionStart + (217 * 64)
19399    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19400    cmp    r3, #0
19401    bxeq   lr                   @ nothing to do - jump to real handler
19402    EXPORT_PC()
19403    mov    r0, rPC              @ arg0
19404    mov    r1, rFP              @ arg1
19405    mov    r2, rSELF            @ arg2
19406    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19407
19408/* ------------------------------ */
19409    .balign 64
19410.L_ALT_OP_MUL_INT_LIT8: /* 0xda */
19411/* File: armv5te/alt_stub.S */
19412/*
19413 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19414 * any interesting requests and then jump to the real instruction
19415 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19416 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19417 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19418 * bail to the real handler if breakFlags==0.
19419 */
19420    ldrb   r3, [rSELF, #offThread_breakFlags]
19421    adrl   lr, dvmAsmInstructionStart + (218 * 64)
19422    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19423    cmp    r3, #0
19424    bxeq   lr                   @ nothing to do - jump to real handler
19425    EXPORT_PC()
19426    mov    r0, rPC              @ arg0
19427    mov    r1, rFP              @ arg1
19428    mov    r2, rSELF            @ arg2
19429    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19430
19431/* ------------------------------ */
19432    .balign 64
19433.L_ALT_OP_DIV_INT_LIT8: /* 0xdb */
19434/* File: armv5te/alt_stub.S */
19435/*
19436 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19437 * any interesting requests and then jump to the real instruction
19438 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19439 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19440 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19441 * bail to the real handler if breakFlags==0.
19442 */
19443    ldrb   r3, [rSELF, #offThread_breakFlags]
19444    adrl   lr, dvmAsmInstructionStart + (219 * 64)
19445    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19446    cmp    r3, #0
19447    bxeq   lr                   @ nothing to do - jump to real handler
19448    EXPORT_PC()
19449    mov    r0, rPC              @ arg0
19450    mov    r1, rFP              @ arg1
19451    mov    r2, rSELF            @ arg2
19452    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19453
19454/* ------------------------------ */
19455    .balign 64
19456.L_ALT_OP_REM_INT_LIT8: /* 0xdc */
19457/* File: armv5te/alt_stub.S */
19458/*
19459 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19460 * any interesting requests and then jump to the real instruction
19461 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19462 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19463 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19464 * bail to the real handler if breakFlags==0.
19465 */
19466    ldrb   r3, [rSELF, #offThread_breakFlags]
19467    adrl   lr, dvmAsmInstructionStart + (220 * 64)
19468    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19469    cmp    r3, #0
19470    bxeq   lr                   @ nothing to do - jump to real handler
19471    EXPORT_PC()
19472    mov    r0, rPC              @ arg0
19473    mov    r1, rFP              @ arg1
19474    mov    r2, rSELF            @ arg2
19475    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19476
19477/* ------------------------------ */
19478    .balign 64
19479.L_ALT_OP_AND_INT_LIT8: /* 0xdd */
19480/* File: armv5te/alt_stub.S */
19481/*
19482 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19483 * any interesting requests and then jump to the real instruction
19484 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19485 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19486 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19487 * bail to the real handler if breakFlags==0.
19488 */
19489    ldrb   r3, [rSELF, #offThread_breakFlags]
19490    adrl   lr, dvmAsmInstructionStart + (221 * 64)
19491    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19492    cmp    r3, #0
19493    bxeq   lr                   @ nothing to do - jump to real handler
19494    EXPORT_PC()
19495    mov    r0, rPC              @ arg0
19496    mov    r1, rFP              @ arg1
19497    mov    r2, rSELF            @ arg2
19498    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19499
19500/* ------------------------------ */
19501    .balign 64
19502.L_ALT_OP_OR_INT_LIT8: /* 0xde */
19503/* File: armv5te/alt_stub.S */
19504/*
19505 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19506 * any interesting requests and then jump to the real instruction
19507 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19508 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19509 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19510 * bail to the real handler if breakFlags==0.
19511 */
19512    ldrb   r3, [rSELF, #offThread_breakFlags]
19513    adrl   lr, dvmAsmInstructionStart + (222 * 64)
19514    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19515    cmp    r3, #0
19516    bxeq   lr                   @ nothing to do - jump to real handler
19517    EXPORT_PC()
19518    mov    r0, rPC              @ arg0
19519    mov    r1, rFP              @ arg1
19520    mov    r2, rSELF            @ arg2
19521    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19522
19523/* ------------------------------ */
19524    .balign 64
19525.L_ALT_OP_XOR_INT_LIT8: /* 0xdf */
19526/* File: armv5te/alt_stub.S */
19527/*
19528 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19529 * any interesting requests and then jump to the real instruction
19530 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19531 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19532 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19533 * bail to the real handler if breakFlags==0.
19534 */
19535    ldrb   r3, [rSELF, #offThread_breakFlags]
19536    adrl   lr, dvmAsmInstructionStart + (223 * 64)
19537    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19538    cmp    r3, #0
19539    bxeq   lr                   @ nothing to do - jump to real handler
19540    EXPORT_PC()
19541    mov    r0, rPC              @ arg0
19542    mov    r1, rFP              @ arg1
19543    mov    r2, rSELF            @ arg2
19544    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19545
19546/* ------------------------------ */
19547    .balign 64
19548.L_ALT_OP_SHL_INT_LIT8: /* 0xe0 */
19549/* File: armv5te/alt_stub.S */
19550/*
19551 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19552 * any interesting requests and then jump to the real instruction
19553 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19554 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19555 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19556 * bail to the real handler if breakFlags==0.
19557 */
19558    ldrb   r3, [rSELF, #offThread_breakFlags]
19559    adrl   lr, dvmAsmInstructionStart + (224 * 64)
19560    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19561    cmp    r3, #0
19562    bxeq   lr                   @ nothing to do - jump to real handler
19563    EXPORT_PC()
19564    mov    r0, rPC              @ arg0
19565    mov    r1, rFP              @ arg1
19566    mov    r2, rSELF            @ arg2
19567    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19568
19569/* ------------------------------ */
19570    .balign 64
19571.L_ALT_OP_SHR_INT_LIT8: /* 0xe1 */
19572/* File: armv5te/alt_stub.S */
19573/*
19574 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19575 * any interesting requests and then jump to the real instruction
19576 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19577 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19578 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19579 * bail to the real handler if breakFlags==0.
19580 */
19581    ldrb   r3, [rSELF, #offThread_breakFlags]
19582    adrl   lr, dvmAsmInstructionStart + (225 * 64)
19583    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19584    cmp    r3, #0
19585    bxeq   lr                   @ nothing to do - jump to real handler
19586    EXPORT_PC()
19587    mov    r0, rPC              @ arg0
19588    mov    r1, rFP              @ arg1
19589    mov    r2, rSELF            @ arg2
19590    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19591
19592/* ------------------------------ */
19593    .balign 64
19594.L_ALT_OP_USHR_INT_LIT8: /* 0xe2 */
19595/* File: armv5te/alt_stub.S */
19596/*
19597 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19598 * any interesting requests and then jump to the real instruction
19599 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19600 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19601 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19602 * bail to the real handler if breakFlags==0.
19603 */
19604    ldrb   r3, [rSELF, #offThread_breakFlags]
19605    adrl   lr, dvmAsmInstructionStart + (226 * 64)
19606    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19607    cmp    r3, #0
19608    bxeq   lr                   @ nothing to do - jump to real handler
19609    EXPORT_PC()
19610    mov    r0, rPC              @ arg0
19611    mov    r1, rFP              @ arg1
19612    mov    r2, rSELF            @ arg2
19613    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19614
19615/* ------------------------------ */
19616    .balign 64
19617.L_ALT_OP_IGET_VOLATILE: /* 0xe3 */
19618/* File: armv5te/alt_stub.S */
19619/*
19620 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19621 * any interesting requests and then jump to the real instruction
19622 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19623 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19624 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19625 * bail to the real handler if breakFlags==0.
19626 */
19627    ldrb   r3, [rSELF, #offThread_breakFlags]
19628    adrl   lr, dvmAsmInstructionStart + (227 * 64)
19629    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19630    cmp    r3, #0
19631    bxeq   lr                   @ nothing to do - jump to real handler
19632    EXPORT_PC()
19633    mov    r0, rPC              @ arg0
19634    mov    r1, rFP              @ arg1
19635    mov    r2, rSELF            @ arg2
19636    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19637
19638/* ------------------------------ */
19639    .balign 64
19640.L_ALT_OP_IPUT_VOLATILE: /* 0xe4 */
19641/* File: armv5te/alt_stub.S */
19642/*
19643 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19644 * any interesting requests and then jump to the real instruction
19645 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19646 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19647 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19648 * bail to the real handler if breakFlags==0.
19649 */
19650    ldrb   r3, [rSELF, #offThread_breakFlags]
19651    adrl   lr, dvmAsmInstructionStart + (228 * 64)
19652    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19653    cmp    r3, #0
19654    bxeq   lr                   @ nothing to do - jump to real handler
19655    EXPORT_PC()
19656    mov    r0, rPC              @ arg0
19657    mov    r1, rFP              @ arg1
19658    mov    r2, rSELF            @ arg2
19659    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19660
19661/* ------------------------------ */
19662    .balign 64
19663.L_ALT_OP_SGET_VOLATILE: /* 0xe5 */
19664/* File: armv5te/alt_stub.S */
19665/*
19666 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19667 * any interesting requests and then jump to the real instruction
19668 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19669 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19670 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19671 * bail to the real handler if breakFlags==0.
19672 */
19673    ldrb   r3, [rSELF, #offThread_breakFlags]
19674    adrl   lr, dvmAsmInstructionStart + (229 * 64)
19675    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19676    cmp    r3, #0
19677    bxeq   lr                   @ nothing to do - jump to real handler
19678    EXPORT_PC()
19679    mov    r0, rPC              @ arg0
19680    mov    r1, rFP              @ arg1
19681    mov    r2, rSELF            @ arg2
19682    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19683
19684/* ------------------------------ */
19685    .balign 64
19686.L_ALT_OP_SPUT_VOLATILE: /* 0xe6 */
19687/* File: armv5te/alt_stub.S */
19688/*
19689 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19690 * any interesting requests and then jump to the real instruction
19691 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19692 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19693 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19694 * bail to the real handler if breakFlags==0.
19695 */
19696    ldrb   r3, [rSELF, #offThread_breakFlags]
19697    adrl   lr, dvmAsmInstructionStart + (230 * 64)
19698    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19699    cmp    r3, #0
19700    bxeq   lr                   @ nothing to do - jump to real handler
19701    EXPORT_PC()
19702    mov    r0, rPC              @ arg0
19703    mov    r1, rFP              @ arg1
19704    mov    r2, rSELF            @ arg2
19705    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19706
19707/* ------------------------------ */
19708    .balign 64
19709.L_ALT_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
19710/* File: armv5te/alt_stub.S */
19711/*
19712 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19713 * any interesting requests and then jump to the real instruction
19714 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19715 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19716 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19717 * bail to the real handler if breakFlags==0.
19718 */
19719    ldrb   r3, [rSELF, #offThread_breakFlags]
19720    adrl   lr, dvmAsmInstructionStart + (231 * 64)
19721    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19722    cmp    r3, #0
19723    bxeq   lr                   @ nothing to do - jump to real handler
19724    EXPORT_PC()
19725    mov    r0, rPC              @ arg0
19726    mov    r1, rFP              @ arg1
19727    mov    r2, rSELF            @ arg2
19728    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19729
19730/* ------------------------------ */
19731    .balign 64
19732.L_ALT_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
19733/* File: armv5te/alt_stub.S */
19734/*
19735 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19736 * any interesting requests and then jump to the real instruction
19737 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19738 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19739 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19740 * bail to the real handler if breakFlags==0.
19741 */
19742    ldrb   r3, [rSELF, #offThread_breakFlags]
19743    adrl   lr, dvmAsmInstructionStart + (232 * 64)
19744    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19745    cmp    r3, #0
19746    bxeq   lr                   @ nothing to do - jump to real handler
19747    EXPORT_PC()
19748    mov    r0, rPC              @ arg0
19749    mov    r1, rFP              @ arg1
19750    mov    r2, rSELF            @ arg2
19751    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19752
19753/* ------------------------------ */
19754    .balign 64
19755.L_ALT_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
19756/* File: armv5te/alt_stub.S */
19757/*
19758 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19759 * any interesting requests and then jump to the real instruction
19760 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19761 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19762 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19763 * bail to the real handler if breakFlags==0.
19764 */
19765    ldrb   r3, [rSELF, #offThread_breakFlags]
19766    adrl   lr, dvmAsmInstructionStart + (233 * 64)
19767    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19768    cmp    r3, #0
19769    bxeq   lr                   @ nothing to do - jump to real handler
19770    EXPORT_PC()
19771    mov    r0, rPC              @ arg0
19772    mov    r1, rFP              @ arg1
19773    mov    r2, rSELF            @ arg2
19774    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19775
19776/* ------------------------------ */
19777    .balign 64
19778.L_ALT_OP_SGET_WIDE_VOLATILE: /* 0xea */
19779/* File: armv5te/alt_stub.S */
19780/*
19781 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19782 * any interesting requests and then jump to the real instruction
19783 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19784 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19785 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19786 * bail to the real handler if breakFlags==0.
19787 */
19788    ldrb   r3, [rSELF, #offThread_breakFlags]
19789    adrl   lr, dvmAsmInstructionStart + (234 * 64)
19790    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19791    cmp    r3, #0
19792    bxeq   lr                   @ nothing to do - jump to real handler
19793    EXPORT_PC()
19794    mov    r0, rPC              @ arg0
19795    mov    r1, rFP              @ arg1
19796    mov    r2, rSELF            @ arg2
19797    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19798
19799/* ------------------------------ */
19800    .balign 64
19801.L_ALT_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
19802/* File: armv5te/alt_stub.S */
19803/*
19804 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19805 * any interesting requests and then jump to the real instruction
19806 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19807 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19808 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19809 * bail to the real handler if breakFlags==0.
19810 */
19811    ldrb   r3, [rSELF, #offThread_breakFlags]
19812    adrl   lr, dvmAsmInstructionStart + (235 * 64)
19813    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19814    cmp    r3, #0
19815    bxeq   lr                   @ nothing to do - jump to real handler
19816    EXPORT_PC()
19817    mov    r0, rPC              @ arg0
19818    mov    r1, rFP              @ arg1
19819    mov    r2, rSELF            @ arg2
19820    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19821
19822/* ------------------------------ */
19823    .balign 64
19824.L_ALT_OP_BREAKPOINT: /* 0xec */
19825/* File: armv5te/alt_stub.S */
19826/*
19827 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19828 * any interesting requests and then jump to the real instruction
19829 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19830 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19831 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19832 * bail to the real handler if breakFlags==0.
19833 */
19834    ldrb   r3, [rSELF, #offThread_breakFlags]
19835    adrl   lr, dvmAsmInstructionStart + (236 * 64)
19836    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19837    cmp    r3, #0
19838    bxeq   lr                   @ nothing to do - jump to real handler
19839    EXPORT_PC()
19840    mov    r0, rPC              @ arg0
19841    mov    r1, rFP              @ arg1
19842    mov    r2, rSELF            @ arg2
19843    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19844
19845/* ------------------------------ */
19846    .balign 64
19847.L_ALT_OP_THROW_VERIFICATION_ERROR: /* 0xed */
19848/* File: armv5te/alt_stub.S */
19849/*
19850 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19851 * any interesting requests and then jump to the real instruction
19852 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19853 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19854 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19855 * bail to the real handler if breakFlags==0.
19856 */
19857    ldrb   r3, [rSELF, #offThread_breakFlags]
19858    adrl   lr, dvmAsmInstructionStart + (237 * 64)
19859    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19860    cmp    r3, #0
19861    bxeq   lr                   @ nothing to do - jump to real handler
19862    EXPORT_PC()
19863    mov    r0, rPC              @ arg0
19864    mov    r1, rFP              @ arg1
19865    mov    r2, rSELF            @ arg2
19866    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19867
19868/* ------------------------------ */
19869    .balign 64
19870.L_ALT_OP_EXECUTE_INLINE: /* 0xee */
19871/* File: armv5te/alt_stub.S */
19872/*
19873 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19874 * any interesting requests and then jump to the real instruction
19875 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19876 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19877 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19878 * bail to the real handler if breakFlags==0.
19879 */
19880    ldrb   r3, [rSELF, #offThread_breakFlags]
19881    adrl   lr, dvmAsmInstructionStart + (238 * 64)
19882    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19883    cmp    r3, #0
19884    bxeq   lr                   @ nothing to do - jump to real handler
19885    EXPORT_PC()
19886    mov    r0, rPC              @ arg0
19887    mov    r1, rFP              @ arg1
19888    mov    r2, rSELF            @ arg2
19889    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19890
19891/* ------------------------------ */
19892    .balign 64
19893.L_ALT_OP_EXECUTE_INLINE_RANGE: /* 0xef */
19894/* File: armv5te/alt_stub.S */
19895/*
19896 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19897 * any interesting requests and then jump to the real instruction
19898 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19899 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19900 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19901 * bail to the real handler if breakFlags==0.
19902 */
19903    ldrb   r3, [rSELF, #offThread_breakFlags]
19904    adrl   lr, dvmAsmInstructionStart + (239 * 64)
19905    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19906    cmp    r3, #0
19907    bxeq   lr                   @ nothing to do - jump to real handler
19908    EXPORT_PC()
19909    mov    r0, rPC              @ arg0
19910    mov    r1, rFP              @ arg1
19911    mov    r2, rSELF            @ arg2
19912    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19913
19914/* ------------------------------ */
19915    .balign 64
19916.L_ALT_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
19917/* File: armv5te/alt_stub.S */
19918/*
19919 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19920 * any interesting requests and then jump to the real instruction
19921 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19922 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19923 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19924 * bail to the real handler if breakFlags==0.
19925 */
19926    ldrb   r3, [rSELF, #offThread_breakFlags]
19927    adrl   lr, dvmAsmInstructionStart + (240 * 64)
19928    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19929    cmp    r3, #0
19930    bxeq   lr                   @ nothing to do - jump to real handler
19931    EXPORT_PC()
19932    mov    r0, rPC              @ arg0
19933    mov    r1, rFP              @ arg1
19934    mov    r2, rSELF            @ arg2
19935    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19936
19937/* ------------------------------ */
19938    .balign 64
19939.L_ALT_OP_RETURN_VOID_BARRIER: /* 0xf1 */
19940/* File: armv5te/alt_stub.S */
19941/*
19942 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19943 * any interesting requests and then jump to the real instruction
19944 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19945 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19946 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19947 * bail to the real handler if breakFlags==0.
19948 */
19949    ldrb   r3, [rSELF, #offThread_breakFlags]
19950    adrl   lr, dvmAsmInstructionStart + (241 * 64)
19951    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19952    cmp    r3, #0
19953    bxeq   lr                   @ nothing to do - jump to real handler
19954    EXPORT_PC()
19955    mov    r0, rPC              @ arg0
19956    mov    r1, rFP              @ arg1
19957    mov    r2, rSELF            @ arg2
19958    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19959
19960/* ------------------------------ */
19961    .balign 64
19962.L_ALT_OP_IGET_QUICK: /* 0xf2 */
19963/* File: armv5te/alt_stub.S */
19964/*
19965 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19966 * any interesting requests and then jump to the real instruction
19967 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19968 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19969 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19970 * bail to the real handler if breakFlags==0.
19971 */
19972    ldrb   r3, [rSELF, #offThread_breakFlags]
19973    adrl   lr, dvmAsmInstructionStart + (242 * 64)
19974    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19975    cmp    r3, #0
19976    bxeq   lr                   @ nothing to do - jump to real handler
19977    EXPORT_PC()
19978    mov    r0, rPC              @ arg0
19979    mov    r1, rFP              @ arg1
19980    mov    r2, rSELF            @ arg2
19981    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19982
19983/* ------------------------------ */
19984    .balign 64
19985.L_ALT_OP_IGET_WIDE_QUICK: /* 0xf3 */
19986/* File: armv5te/alt_stub.S */
19987/*
19988 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19989 * any interesting requests and then jump to the real instruction
19990 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19991 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19992 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19993 * bail to the real handler if breakFlags==0.
19994 */
19995    ldrb   r3, [rSELF, #offThread_breakFlags]
19996    adrl   lr, dvmAsmInstructionStart + (243 * 64)
19997    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19998    cmp    r3, #0
19999    bxeq   lr                   @ nothing to do - jump to real handler
20000    EXPORT_PC()
20001    mov    r0, rPC              @ arg0
20002    mov    r1, rFP              @ arg1
20003    mov    r2, rSELF            @ arg2
20004    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20005
20006/* ------------------------------ */
20007    .balign 64
20008.L_ALT_OP_IGET_OBJECT_QUICK: /* 0xf4 */
20009/* File: armv5te/alt_stub.S */
20010/*
20011 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20012 * any interesting requests and then jump to the real instruction
20013 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20014 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20015 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20016 * bail to the real handler if breakFlags==0.
20017 */
20018    ldrb   r3, [rSELF, #offThread_breakFlags]
20019    adrl   lr, dvmAsmInstructionStart + (244 * 64)
20020    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20021    cmp    r3, #0
20022    bxeq   lr                   @ nothing to do - jump to real handler
20023    EXPORT_PC()
20024    mov    r0, rPC              @ arg0
20025    mov    r1, rFP              @ arg1
20026    mov    r2, rSELF            @ arg2
20027    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20028
20029/* ------------------------------ */
20030    .balign 64
20031.L_ALT_OP_IPUT_QUICK: /* 0xf5 */
20032/* File: armv5te/alt_stub.S */
20033/*
20034 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20035 * any interesting requests and then jump to the real instruction
20036 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20037 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20038 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20039 * bail to the real handler if breakFlags==0.
20040 */
20041    ldrb   r3, [rSELF, #offThread_breakFlags]
20042    adrl   lr, dvmAsmInstructionStart + (245 * 64)
20043    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20044    cmp    r3, #0
20045    bxeq   lr                   @ nothing to do - jump to real handler
20046    EXPORT_PC()
20047    mov    r0, rPC              @ arg0
20048    mov    r1, rFP              @ arg1
20049    mov    r2, rSELF            @ arg2
20050    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20051
20052/* ------------------------------ */
20053    .balign 64
20054.L_ALT_OP_IPUT_WIDE_QUICK: /* 0xf6 */
20055/* File: armv5te/alt_stub.S */
20056/*
20057 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20058 * any interesting requests and then jump to the real instruction
20059 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20060 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20061 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20062 * bail to the real handler if breakFlags==0.
20063 */
20064    ldrb   r3, [rSELF, #offThread_breakFlags]
20065    adrl   lr, dvmAsmInstructionStart + (246 * 64)
20066    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20067    cmp    r3, #0
20068    bxeq   lr                   @ nothing to do - jump to real handler
20069    EXPORT_PC()
20070    mov    r0, rPC              @ arg0
20071    mov    r1, rFP              @ arg1
20072    mov    r2, rSELF            @ arg2
20073    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20074
20075/* ------------------------------ */
20076    .balign 64
20077.L_ALT_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
20078/* File: armv5te/alt_stub.S */
20079/*
20080 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20081 * any interesting requests and then jump to the real instruction
20082 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20083 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20084 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20085 * bail to the real handler if breakFlags==0.
20086 */
20087    ldrb   r3, [rSELF, #offThread_breakFlags]
20088    adrl   lr, dvmAsmInstructionStart + (247 * 64)
20089    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20090    cmp    r3, #0
20091    bxeq   lr                   @ nothing to do - jump to real handler
20092    EXPORT_PC()
20093    mov    r0, rPC              @ arg0
20094    mov    r1, rFP              @ arg1
20095    mov    r2, rSELF            @ arg2
20096    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20097
20098/* ------------------------------ */
20099    .balign 64
20100.L_ALT_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
20101/* File: armv5te/alt_stub.S */
20102/*
20103 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20104 * any interesting requests and then jump to the real instruction
20105 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20106 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20107 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20108 * bail to the real handler if breakFlags==0.
20109 */
20110    ldrb   r3, [rSELF, #offThread_breakFlags]
20111    adrl   lr, dvmAsmInstructionStart + (248 * 64)
20112    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20113    cmp    r3, #0
20114    bxeq   lr                   @ nothing to do - jump to real handler
20115    EXPORT_PC()
20116    mov    r0, rPC              @ arg0
20117    mov    r1, rFP              @ arg1
20118    mov    r2, rSELF            @ arg2
20119    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20120
20121/* ------------------------------ */
20122    .balign 64
20123.L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
20124/* File: armv5te/alt_stub.S */
20125/*
20126 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20127 * any interesting requests and then jump to the real instruction
20128 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20129 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20130 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20131 * bail to the real handler if breakFlags==0.
20132 */
20133    ldrb   r3, [rSELF, #offThread_breakFlags]
20134    adrl   lr, dvmAsmInstructionStart + (249 * 64)
20135    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20136    cmp    r3, #0
20137    bxeq   lr                   @ nothing to do - jump to real handler
20138    EXPORT_PC()
20139    mov    r0, rPC              @ arg0
20140    mov    r1, rFP              @ arg1
20141    mov    r2, rSELF            @ arg2
20142    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20143
20144/* ------------------------------ */
20145    .balign 64
20146.L_ALT_OP_INVOKE_SUPER_QUICK: /* 0xfa */
20147/* File: armv5te/alt_stub.S */
20148/*
20149 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20150 * any interesting requests and then jump to the real instruction
20151 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20152 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20153 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20154 * bail to the real handler if breakFlags==0.
20155 */
20156    ldrb   r3, [rSELF, #offThread_breakFlags]
20157    adrl   lr, dvmAsmInstructionStart + (250 * 64)
20158    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20159    cmp    r3, #0
20160    bxeq   lr                   @ nothing to do - jump to real handler
20161    EXPORT_PC()
20162    mov    r0, rPC              @ arg0
20163    mov    r1, rFP              @ arg1
20164    mov    r2, rSELF            @ arg2
20165    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20166
20167/* ------------------------------ */
20168    .balign 64
20169.L_ALT_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
20170/* File: armv5te/alt_stub.S */
20171/*
20172 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20173 * any interesting requests and then jump to the real instruction
20174 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20175 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20176 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20177 * bail to the real handler if breakFlags==0.
20178 */
20179    ldrb   r3, [rSELF, #offThread_breakFlags]
20180    adrl   lr, dvmAsmInstructionStart + (251 * 64)
20181    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20182    cmp    r3, #0
20183    bxeq   lr                   @ nothing to do - jump to real handler
20184    EXPORT_PC()
20185    mov    r0, rPC              @ arg0
20186    mov    r1, rFP              @ arg1
20187    mov    r2, rSELF            @ arg2
20188    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20189
20190/* ------------------------------ */
20191    .balign 64
20192.L_ALT_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
20193/* File: armv5te/alt_stub.S */
20194/*
20195 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20196 * any interesting requests and then jump to the real instruction
20197 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20198 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20199 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20200 * bail to the real handler if breakFlags==0.
20201 */
20202    ldrb   r3, [rSELF, #offThread_breakFlags]
20203    adrl   lr, dvmAsmInstructionStart + (252 * 64)
20204    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20205    cmp    r3, #0
20206    bxeq   lr                   @ nothing to do - jump to real handler
20207    EXPORT_PC()
20208    mov    r0, rPC              @ arg0
20209    mov    r1, rFP              @ arg1
20210    mov    r2, rSELF            @ arg2
20211    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20212
20213/* ------------------------------ */
20214    .balign 64
20215.L_ALT_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
20216/* File: armv5te/alt_stub.S */
20217/*
20218 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20219 * any interesting requests and then jump to the real instruction
20220 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20221 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20222 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20223 * bail to the real handler if breakFlags==0.
20224 */
20225    ldrb   r3, [rSELF, #offThread_breakFlags]
20226    adrl   lr, dvmAsmInstructionStart + (253 * 64)
20227    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20228    cmp    r3, #0
20229    bxeq   lr                   @ nothing to do - jump to real handler
20230    EXPORT_PC()
20231    mov    r0, rPC              @ arg0
20232    mov    r1, rFP              @ arg1
20233    mov    r2, rSELF            @ arg2
20234    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20235
20236/* ------------------------------ */
20237    .balign 64
20238.L_ALT_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
20239/* File: armv5te/alt_stub.S */
20240/*
20241 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20242 * any interesting requests and then jump to the real instruction
20243 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20244 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20245 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20246 * bail to the real handler if breakFlags==0.
20247 */
20248    ldrb   r3, [rSELF, #offThread_breakFlags]
20249    adrl   lr, dvmAsmInstructionStart + (254 * 64)
20250    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20251    cmp    r3, #0
20252    bxeq   lr                   @ nothing to do - jump to real handler
20253    EXPORT_PC()
20254    mov    r0, rPC              @ arg0
20255    mov    r1, rFP              @ arg1
20256    mov    r2, rSELF            @ arg2
20257    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20258
20259/* ------------------------------ */
20260    .balign 64
20261.L_ALT_OP_DISPATCH_FF: /* 0xff */
20262/* File: armv5te/ALT_OP_DISPATCH_FF.S */
20263/*
20264 * Unlike other alt stubs, we don't want to call dvmCheckBefore() here.
20265 * Instead, just treat this as a trampoline to reach the real alt
20266 * handler (which will do the dvmCheckBefore() call.
20267 */
20268    mov     ip, rINST, lsr #8           @ ip<- extended opcode
20269    add     ip, ip, #256                @ add offset for extended opcodes
20270    GOTO_OPCODE(ip)                     @ go to proper extended handler
20271
20272
20273/* ------------------------------ */
20274    .balign 64
20275.L_ALT_OP_CONST_CLASS_JUMBO: /* 0x100 */
20276/* File: armv5te/alt_stub.S */
20277/*
20278 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20279 * any interesting requests and then jump to the real instruction
20280 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20281 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20282 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20283 * bail to the real handler if breakFlags==0.
20284 */
20285    ldrb   r3, [rSELF, #offThread_breakFlags]
20286    adrl   lr, dvmAsmInstructionStart + (256 * 64)
20287    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20288    cmp    r3, #0
20289    bxeq   lr                   @ nothing to do - jump to real handler
20290    EXPORT_PC()
20291    mov    r0, rPC              @ arg0
20292    mov    r1, rFP              @ arg1
20293    mov    r2, rSELF            @ arg2
20294    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20295
20296/* ------------------------------ */
20297    .balign 64
20298.L_ALT_OP_CHECK_CAST_JUMBO: /* 0x101 */
20299/* File: armv5te/alt_stub.S */
20300/*
20301 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20302 * any interesting requests and then jump to the real instruction
20303 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20304 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20305 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20306 * bail to the real handler if breakFlags==0.
20307 */
20308    ldrb   r3, [rSELF, #offThread_breakFlags]
20309    adrl   lr, dvmAsmInstructionStart + (257 * 64)
20310    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20311    cmp    r3, #0
20312    bxeq   lr                   @ nothing to do - jump to real handler
20313    EXPORT_PC()
20314    mov    r0, rPC              @ arg0
20315    mov    r1, rFP              @ arg1
20316    mov    r2, rSELF            @ arg2
20317    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20318
20319/* ------------------------------ */
20320    .balign 64
20321.L_ALT_OP_INSTANCE_OF_JUMBO: /* 0x102 */
20322/* File: armv5te/alt_stub.S */
20323/*
20324 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20325 * any interesting requests and then jump to the real instruction
20326 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20327 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20328 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20329 * bail to the real handler if breakFlags==0.
20330 */
20331    ldrb   r3, [rSELF, #offThread_breakFlags]
20332    adrl   lr, dvmAsmInstructionStart + (258 * 64)
20333    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20334    cmp    r3, #0
20335    bxeq   lr                   @ nothing to do - jump to real handler
20336    EXPORT_PC()
20337    mov    r0, rPC              @ arg0
20338    mov    r1, rFP              @ arg1
20339    mov    r2, rSELF            @ arg2
20340    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20341
20342/* ------------------------------ */
20343    .balign 64
20344.L_ALT_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
20345/* File: armv5te/alt_stub.S */
20346/*
20347 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20348 * any interesting requests and then jump to the real instruction
20349 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20350 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20351 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20352 * bail to the real handler if breakFlags==0.
20353 */
20354    ldrb   r3, [rSELF, #offThread_breakFlags]
20355    adrl   lr, dvmAsmInstructionStart + (259 * 64)
20356    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20357    cmp    r3, #0
20358    bxeq   lr                   @ nothing to do - jump to real handler
20359    EXPORT_PC()
20360    mov    r0, rPC              @ arg0
20361    mov    r1, rFP              @ arg1
20362    mov    r2, rSELF            @ arg2
20363    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20364
20365/* ------------------------------ */
20366    .balign 64
20367.L_ALT_OP_NEW_ARRAY_JUMBO: /* 0x104 */
20368/* File: armv5te/alt_stub.S */
20369/*
20370 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20371 * any interesting requests and then jump to the real instruction
20372 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20373 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20374 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20375 * bail to the real handler if breakFlags==0.
20376 */
20377    ldrb   r3, [rSELF, #offThread_breakFlags]
20378    adrl   lr, dvmAsmInstructionStart + (260 * 64)
20379    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20380    cmp    r3, #0
20381    bxeq   lr                   @ nothing to do - jump to real handler
20382    EXPORT_PC()
20383    mov    r0, rPC              @ arg0
20384    mov    r1, rFP              @ arg1
20385    mov    r2, rSELF            @ arg2
20386    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20387
20388/* ------------------------------ */
20389    .balign 64
20390.L_ALT_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
20391/* File: armv5te/alt_stub.S */
20392/*
20393 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20394 * any interesting requests and then jump to the real instruction
20395 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20396 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20397 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20398 * bail to the real handler if breakFlags==0.
20399 */
20400    ldrb   r3, [rSELF, #offThread_breakFlags]
20401    adrl   lr, dvmAsmInstructionStart + (261 * 64)
20402    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20403    cmp    r3, #0
20404    bxeq   lr                   @ nothing to do - jump to real handler
20405    EXPORT_PC()
20406    mov    r0, rPC              @ arg0
20407    mov    r1, rFP              @ arg1
20408    mov    r2, rSELF            @ arg2
20409    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20410
20411/* ------------------------------ */
20412    .balign 64
20413.L_ALT_OP_IGET_JUMBO: /* 0x106 */
20414/* File: armv5te/alt_stub.S */
20415/*
20416 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20417 * any interesting requests and then jump to the real instruction
20418 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20419 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20420 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20421 * bail to the real handler if breakFlags==0.
20422 */
20423    ldrb   r3, [rSELF, #offThread_breakFlags]
20424    adrl   lr, dvmAsmInstructionStart + (262 * 64)
20425    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20426    cmp    r3, #0
20427    bxeq   lr                   @ nothing to do - jump to real handler
20428    EXPORT_PC()
20429    mov    r0, rPC              @ arg0
20430    mov    r1, rFP              @ arg1
20431    mov    r2, rSELF            @ arg2
20432    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20433
20434/* ------------------------------ */
20435    .balign 64
20436.L_ALT_OP_IGET_WIDE_JUMBO: /* 0x107 */
20437/* File: armv5te/alt_stub.S */
20438/*
20439 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20440 * any interesting requests and then jump to the real instruction
20441 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20442 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20443 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20444 * bail to the real handler if breakFlags==0.
20445 */
20446    ldrb   r3, [rSELF, #offThread_breakFlags]
20447    adrl   lr, dvmAsmInstructionStart + (263 * 64)
20448    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20449    cmp    r3, #0
20450    bxeq   lr                   @ nothing to do - jump to real handler
20451    EXPORT_PC()
20452    mov    r0, rPC              @ arg0
20453    mov    r1, rFP              @ arg1
20454    mov    r2, rSELF            @ arg2
20455    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20456
20457/* ------------------------------ */
20458    .balign 64
20459.L_ALT_OP_IGET_OBJECT_JUMBO: /* 0x108 */
20460/* File: armv5te/alt_stub.S */
20461/*
20462 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20463 * any interesting requests and then jump to the real instruction
20464 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20465 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20466 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20467 * bail to the real handler if breakFlags==0.
20468 */
20469    ldrb   r3, [rSELF, #offThread_breakFlags]
20470    adrl   lr, dvmAsmInstructionStart + (264 * 64)
20471    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20472    cmp    r3, #0
20473    bxeq   lr                   @ nothing to do - jump to real handler
20474    EXPORT_PC()
20475    mov    r0, rPC              @ arg0
20476    mov    r1, rFP              @ arg1
20477    mov    r2, rSELF            @ arg2
20478    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20479
20480/* ------------------------------ */
20481    .balign 64
20482.L_ALT_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
20483/* File: armv5te/alt_stub.S */
20484/*
20485 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20486 * any interesting requests and then jump to the real instruction
20487 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20488 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20489 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20490 * bail to the real handler if breakFlags==0.
20491 */
20492    ldrb   r3, [rSELF, #offThread_breakFlags]
20493    adrl   lr, dvmAsmInstructionStart + (265 * 64)
20494    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20495    cmp    r3, #0
20496    bxeq   lr                   @ nothing to do - jump to real handler
20497    EXPORT_PC()
20498    mov    r0, rPC              @ arg0
20499    mov    r1, rFP              @ arg1
20500    mov    r2, rSELF            @ arg2
20501    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20502
20503/* ------------------------------ */
20504    .balign 64
20505.L_ALT_OP_IGET_BYTE_JUMBO: /* 0x10a */
20506/* File: armv5te/alt_stub.S */
20507/*
20508 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20509 * any interesting requests and then jump to the real instruction
20510 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20511 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20512 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20513 * bail to the real handler if breakFlags==0.
20514 */
20515    ldrb   r3, [rSELF, #offThread_breakFlags]
20516    adrl   lr, dvmAsmInstructionStart + (266 * 64)
20517    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20518    cmp    r3, #0
20519    bxeq   lr                   @ nothing to do - jump to real handler
20520    EXPORT_PC()
20521    mov    r0, rPC              @ arg0
20522    mov    r1, rFP              @ arg1
20523    mov    r2, rSELF            @ arg2
20524    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20525
20526/* ------------------------------ */
20527    .balign 64
20528.L_ALT_OP_IGET_CHAR_JUMBO: /* 0x10b */
20529/* File: armv5te/alt_stub.S */
20530/*
20531 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20532 * any interesting requests and then jump to the real instruction
20533 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20534 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20535 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20536 * bail to the real handler if breakFlags==0.
20537 */
20538    ldrb   r3, [rSELF, #offThread_breakFlags]
20539    adrl   lr, dvmAsmInstructionStart + (267 * 64)
20540    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20541    cmp    r3, #0
20542    bxeq   lr                   @ nothing to do - jump to real handler
20543    EXPORT_PC()
20544    mov    r0, rPC              @ arg0
20545    mov    r1, rFP              @ arg1
20546    mov    r2, rSELF            @ arg2
20547    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20548
20549/* ------------------------------ */
20550    .balign 64
20551.L_ALT_OP_IGET_SHORT_JUMBO: /* 0x10c */
20552/* File: armv5te/alt_stub.S */
20553/*
20554 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20555 * any interesting requests and then jump to the real instruction
20556 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20557 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20558 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20559 * bail to the real handler if breakFlags==0.
20560 */
20561    ldrb   r3, [rSELF, #offThread_breakFlags]
20562    adrl   lr, dvmAsmInstructionStart + (268 * 64)
20563    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20564    cmp    r3, #0
20565    bxeq   lr                   @ nothing to do - jump to real handler
20566    EXPORT_PC()
20567    mov    r0, rPC              @ arg0
20568    mov    r1, rFP              @ arg1
20569    mov    r2, rSELF            @ arg2
20570    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20571
20572/* ------------------------------ */
20573    .balign 64
20574.L_ALT_OP_IPUT_JUMBO: /* 0x10d */
20575/* File: armv5te/alt_stub.S */
20576/*
20577 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20578 * any interesting requests and then jump to the real instruction
20579 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20580 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20581 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20582 * bail to the real handler if breakFlags==0.
20583 */
20584    ldrb   r3, [rSELF, #offThread_breakFlags]
20585    adrl   lr, dvmAsmInstructionStart + (269 * 64)
20586    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20587    cmp    r3, #0
20588    bxeq   lr                   @ nothing to do - jump to real handler
20589    EXPORT_PC()
20590    mov    r0, rPC              @ arg0
20591    mov    r1, rFP              @ arg1
20592    mov    r2, rSELF            @ arg2
20593    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20594
20595/* ------------------------------ */
20596    .balign 64
20597.L_ALT_OP_IPUT_WIDE_JUMBO: /* 0x10e */
20598/* File: armv5te/alt_stub.S */
20599/*
20600 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20601 * any interesting requests and then jump to the real instruction
20602 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20603 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20604 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20605 * bail to the real handler if breakFlags==0.
20606 */
20607    ldrb   r3, [rSELF, #offThread_breakFlags]
20608    adrl   lr, dvmAsmInstructionStart + (270 * 64)
20609    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20610    cmp    r3, #0
20611    bxeq   lr                   @ nothing to do - jump to real handler
20612    EXPORT_PC()
20613    mov    r0, rPC              @ arg0
20614    mov    r1, rFP              @ arg1
20615    mov    r2, rSELF            @ arg2
20616    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20617
20618/* ------------------------------ */
20619    .balign 64
20620.L_ALT_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
20621/* File: armv5te/alt_stub.S */
20622/*
20623 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20624 * any interesting requests and then jump to the real instruction
20625 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20626 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20627 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20628 * bail to the real handler if breakFlags==0.
20629 */
20630    ldrb   r3, [rSELF, #offThread_breakFlags]
20631    adrl   lr, dvmAsmInstructionStart + (271 * 64)
20632    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20633    cmp    r3, #0
20634    bxeq   lr                   @ nothing to do - jump to real handler
20635    EXPORT_PC()
20636    mov    r0, rPC              @ arg0
20637    mov    r1, rFP              @ arg1
20638    mov    r2, rSELF            @ arg2
20639    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20640
20641/* ------------------------------ */
20642    .balign 64
20643.L_ALT_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
20644/* File: armv5te/alt_stub.S */
20645/*
20646 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20647 * any interesting requests and then jump to the real instruction
20648 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20649 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20650 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20651 * bail to the real handler if breakFlags==0.
20652 */
20653    ldrb   r3, [rSELF, #offThread_breakFlags]
20654    adrl   lr, dvmAsmInstructionStart + (272 * 64)
20655    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20656    cmp    r3, #0
20657    bxeq   lr                   @ nothing to do - jump to real handler
20658    EXPORT_PC()
20659    mov    r0, rPC              @ arg0
20660    mov    r1, rFP              @ arg1
20661    mov    r2, rSELF            @ arg2
20662    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20663
20664/* ------------------------------ */
20665    .balign 64
20666.L_ALT_OP_IPUT_BYTE_JUMBO: /* 0x111 */
20667/* File: armv5te/alt_stub.S */
20668/*
20669 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20670 * any interesting requests and then jump to the real instruction
20671 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20672 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20673 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20674 * bail to the real handler if breakFlags==0.
20675 */
20676    ldrb   r3, [rSELF, #offThread_breakFlags]
20677    adrl   lr, dvmAsmInstructionStart + (273 * 64)
20678    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20679    cmp    r3, #0
20680    bxeq   lr                   @ nothing to do - jump to real handler
20681    EXPORT_PC()
20682    mov    r0, rPC              @ arg0
20683    mov    r1, rFP              @ arg1
20684    mov    r2, rSELF            @ arg2
20685    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20686
20687/* ------------------------------ */
20688    .balign 64
20689.L_ALT_OP_IPUT_CHAR_JUMBO: /* 0x112 */
20690/* File: armv5te/alt_stub.S */
20691/*
20692 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20693 * any interesting requests and then jump to the real instruction
20694 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20695 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20696 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20697 * bail to the real handler if breakFlags==0.
20698 */
20699    ldrb   r3, [rSELF, #offThread_breakFlags]
20700    adrl   lr, dvmAsmInstructionStart + (274 * 64)
20701    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20702    cmp    r3, #0
20703    bxeq   lr                   @ nothing to do - jump to real handler
20704    EXPORT_PC()
20705    mov    r0, rPC              @ arg0
20706    mov    r1, rFP              @ arg1
20707    mov    r2, rSELF            @ arg2
20708    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20709
20710/* ------------------------------ */
20711    .balign 64
20712.L_ALT_OP_IPUT_SHORT_JUMBO: /* 0x113 */
20713/* File: armv5te/alt_stub.S */
20714/*
20715 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20716 * any interesting requests and then jump to the real instruction
20717 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20718 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20719 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20720 * bail to the real handler if breakFlags==0.
20721 */
20722    ldrb   r3, [rSELF, #offThread_breakFlags]
20723    adrl   lr, dvmAsmInstructionStart + (275 * 64)
20724    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20725    cmp    r3, #0
20726    bxeq   lr                   @ nothing to do - jump to real handler
20727    EXPORT_PC()
20728    mov    r0, rPC              @ arg0
20729    mov    r1, rFP              @ arg1
20730    mov    r2, rSELF            @ arg2
20731    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20732
20733/* ------------------------------ */
20734    .balign 64
20735.L_ALT_OP_SGET_JUMBO: /* 0x114 */
20736/* File: armv5te/alt_stub.S */
20737/*
20738 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20739 * any interesting requests and then jump to the real instruction
20740 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20741 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20742 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20743 * bail to the real handler if breakFlags==0.
20744 */
20745    ldrb   r3, [rSELF, #offThread_breakFlags]
20746    adrl   lr, dvmAsmInstructionStart + (276 * 64)
20747    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20748    cmp    r3, #0
20749    bxeq   lr                   @ nothing to do - jump to real handler
20750    EXPORT_PC()
20751    mov    r0, rPC              @ arg0
20752    mov    r1, rFP              @ arg1
20753    mov    r2, rSELF            @ arg2
20754    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20755
20756/* ------------------------------ */
20757    .balign 64
20758.L_ALT_OP_SGET_WIDE_JUMBO: /* 0x115 */
20759/* File: armv5te/alt_stub.S */
20760/*
20761 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20762 * any interesting requests and then jump to the real instruction
20763 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20764 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20765 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20766 * bail to the real handler if breakFlags==0.
20767 */
20768    ldrb   r3, [rSELF, #offThread_breakFlags]
20769    adrl   lr, dvmAsmInstructionStart + (277 * 64)
20770    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20771    cmp    r3, #0
20772    bxeq   lr                   @ nothing to do - jump to real handler
20773    EXPORT_PC()
20774    mov    r0, rPC              @ arg0
20775    mov    r1, rFP              @ arg1
20776    mov    r2, rSELF            @ arg2
20777    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20778
20779/* ------------------------------ */
20780    .balign 64
20781.L_ALT_OP_SGET_OBJECT_JUMBO: /* 0x116 */
20782/* File: armv5te/alt_stub.S */
20783/*
20784 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20785 * any interesting requests and then jump to the real instruction
20786 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20787 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20788 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20789 * bail to the real handler if breakFlags==0.
20790 */
20791    ldrb   r3, [rSELF, #offThread_breakFlags]
20792    adrl   lr, dvmAsmInstructionStart + (278 * 64)
20793    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20794    cmp    r3, #0
20795    bxeq   lr                   @ nothing to do - jump to real handler
20796    EXPORT_PC()
20797    mov    r0, rPC              @ arg0
20798    mov    r1, rFP              @ arg1
20799    mov    r2, rSELF            @ arg2
20800    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20801
20802/* ------------------------------ */
20803    .balign 64
20804.L_ALT_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
20805/* File: armv5te/alt_stub.S */
20806/*
20807 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20808 * any interesting requests and then jump to the real instruction
20809 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20810 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20811 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20812 * bail to the real handler if breakFlags==0.
20813 */
20814    ldrb   r3, [rSELF, #offThread_breakFlags]
20815    adrl   lr, dvmAsmInstructionStart + (279 * 64)
20816    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20817    cmp    r3, #0
20818    bxeq   lr                   @ nothing to do - jump to real handler
20819    EXPORT_PC()
20820    mov    r0, rPC              @ arg0
20821    mov    r1, rFP              @ arg1
20822    mov    r2, rSELF            @ arg2
20823    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20824
20825/* ------------------------------ */
20826    .balign 64
20827.L_ALT_OP_SGET_BYTE_JUMBO: /* 0x118 */
20828/* File: armv5te/alt_stub.S */
20829/*
20830 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20831 * any interesting requests and then jump to the real instruction
20832 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20833 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20834 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20835 * bail to the real handler if breakFlags==0.
20836 */
20837    ldrb   r3, [rSELF, #offThread_breakFlags]
20838    adrl   lr, dvmAsmInstructionStart + (280 * 64)
20839    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20840    cmp    r3, #0
20841    bxeq   lr                   @ nothing to do - jump to real handler
20842    EXPORT_PC()
20843    mov    r0, rPC              @ arg0
20844    mov    r1, rFP              @ arg1
20845    mov    r2, rSELF            @ arg2
20846    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20847
20848/* ------------------------------ */
20849    .balign 64
20850.L_ALT_OP_SGET_CHAR_JUMBO: /* 0x119 */
20851/* File: armv5te/alt_stub.S */
20852/*
20853 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20854 * any interesting requests and then jump to the real instruction
20855 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20856 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20857 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20858 * bail to the real handler if breakFlags==0.
20859 */
20860    ldrb   r3, [rSELF, #offThread_breakFlags]
20861    adrl   lr, dvmAsmInstructionStart + (281 * 64)
20862    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20863    cmp    r3, #0
20864    bxeq   lr                   @ nothing to do - jump to real handler
20865    EXPORT_PC()
20866    mov    r0, rPC              @ arg0
20867    mov    r1, rFP              @ arg1
20868    mov    r2, rSELF            @ arg2
20869    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20870
20871/* ------------------------------ */
20872    .balign 64
20873.L_ALT_OP_SGET_SHORT_JUMBO: /* 0x11a */
20874/* File: armv5te/alt_stub.S */
20875/*
20876 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20877 * any interesting requests and then jump to the real instruction
20878 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20879 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20880 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20881 * bail to the real handler if breakFlags==0.
20882 */
20883    ldrb   r3, [rSELF, #offThread_breakFlags]
20884    adrl   lr, dvmAsmInstructionStart + (282 * 64)
20885    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20886    cmp    r3, #0
20887    bxeq   lr                   @ nothing to do - jump to real handler
20888    EXPORT_PC()
20889    mov    r0, rPC              @ arg0
20890    mov    r1, rFP              @ arg1
20891    mov    r2, rSELF            @ arg2
20892    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20893
20894/* ------------------------------ */
20895    .balign 64
20896.L_ALT_OP_SPUT_JUMBO: /* 0x11b */
20897/* File: armv5te/alt_stub.S */
20898/*
20899 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20900 * any interesting requests and then jump to the real instruction
20901 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20902 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20903 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20904 * bail to the real handler if breakFlags==0.
20905 */
20906    ldrb   r3, [rSELF, #offThread_breakFlags]
20907    adrl   lr, dvmAsmInstructionStart + (283 * 64)
20908    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20909    cmp    r3, #0
20910    bxeq   lr                   @ nothing to do - jump to real handler
20911    EXPORT_PC()
20912    mov    r0, rPC              @ arg0
20913    mov    r1, rFP              @ arg1
20914    mov    r2, rSELF            @ arg2
20915    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20916
20917/* ------------------------------ */
20918    .balign 64
20919.L_ALT_OP_SPUT_WIDE_JUMBO: /* 0x11c */
20920/* File: armv5te/alt_stub.S */
20921/*
20922 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20923 * any interesting requests and then jump to the real instruction
20924 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20925 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20926 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20927 * bail to the real handler if breakFlags==0.
20928 */
20929    ldrb   r3, [rSELF, #offThread_breakFlags]
20930    adrl   lr, dvmAsmInstructionStart + (284 * 64)
20931    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20932    cmp    r3, #0
20933    bxeq   lr                   @ nothing to do - jump to real handler
20934    EXPORT_PC()
20935    mov    r0, rPC              @ arg0
20936    mov    r1, rFP              @ arg1
20937    mov    r2, rSELF            @ arg2
20938    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20939
20940/* ------------------------------ */
20941    .balign 64
20942.L_ALT_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
20943/* File: armv5te/alt_stub.S */
20944/*
20945 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20946 * any interesting requests and then jump to the real instruction
20947 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20948 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20949 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20950 * bail to the real handler if breakFlags==0.
20951 */
20952    ldrb   r3, [rSELF, #offThread_breakFlags]
20953    adrl   lr, dvmAsmInstructionStart + (285 * 64)
20954    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20955    cmp    r3, #0
20956    bxeq   lr                   @ nothing to do - jump to real handler
20957    EXPORT_PC()
20958    mov    r0, rPC              @ arg0
20959    mov    r1, rFP              @ arg1
20960    mov    r2, rSELF            @ arg2
20961    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20962
20963/* ------------------------------ */
20964    .balign 64
20965.L_ALT_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
20966/* File: armv5te/alt_stub.S */
20967/*
20968 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20969 * any interesting requests and then jump to the real instruction
20970 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20971 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20972 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20973 * bail to the real handler if breakFlags==0.
20974 */
20975    ldrb   r3, [rSELF, #offThread_breakFlags]
20976    adrl   lr, dvmAsmInstructionStart + (286 * 64)
20977    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20978    cmp    r3, #0
20979    bxeq   lr                   @ nothing to do - jump to real handler
20980    EXPORT_PC()
20981    mov    r0, rPC              @ arg0
20982    mov    r1, rFP              @ arg1
20983    mov    r2, rSELF            @ arg2
20984    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20985
20986/* ------------------------------ */
20987    .balign 64
20988.L_ALT_OP_SPUT_BYTE_JUMBO: /* 0x11f */
20989/* File: armv5te/alt_stub.S */
20990/*
20991 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20992 * any interesting requests and then jump to the real instruction
20993 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20994 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20995 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20996 * bail to the real handler if breakFlags==0.
20997 */
20998    ldrb   r3, [rSELF, #offThread_breakFlags]
20999    adrl   lr, dvmAsmInstructionStart + (287 * 64)
21000    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21001    cmp    r3, #0
21002    bxeq   lr                   @ nothing to do - jump to real handler
21003    EXPORT_PC()
21004    mov    r0, rPC              @ arg0
21005    mov    r1, rFP              @ arg1
21006    mov    r2, rSELF            @ arg2
21007    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21008
21009/* ------------------------------ */
21010    .balign 64
21011.L_ALT_OP_SPUT_CHAR_JUMBO: /* 0x120 */
21012/* File: armv5te/alt_stub.S */
21013/*
21014 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21015 * any interesting requests and then jump to the real instruction
21016 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21017 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21018 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21019 * bail to the real handler if breakFlags==0.
21020 */
21021    ldrb   r3, [rSELF, #offThread_breakFlags]
21022    adrl   lr, dvmAsmInstructionStart + (288 * 64)
21023    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21024    cmp    r3, #0
21025    bxeq   lr                   @ nothing to do - jump to real handler
21026    EXPORT_PC()
21027    mov    r0, rPC              @ arg0
21028    mov    r1, rFP              @ arg1
21029    mov    r2, rSELF            @ arg2
21030    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21031
21032/* ------------------------------ */
21033    .balign 64
21034.L_ALT_OP_SPUT_SHORT_JUMBO: /* 0x121 */
21035/* File: armv5te/alt_stub.S */
21036/*
21037 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21038 * any interesting requests and then jump to the real instruction
21039 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21040 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21041 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21042 * bail to the real handler if breakFlags==0.
21043 */
21044    ldrb   r3, [rSELF, #offThread_breakFlags]
21045    adrl   lr, dvmAsmInstructionStart + (289 * 64)
21046    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21047    cmp    r3, #0
21048    bxeq   lr                   @ nothing to do - jump to real handler
21049    EXPORT_PC()
21050    mov    r0, rPC              @ arg0
21051    mov    r1, rFP              @ arg1
21052    mov    r2, rSELF            @ arg2
21053    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21054
21055/* ------------------------------ */
21056    .balign 64
21057.L_ALT_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
21058/* File: armv5te/alt_stub.S */
21059/*
21060 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21061 * any interesting requests and then jump to the real instruction
21062 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21063 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21064 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21065 * bail to the real handler if breakFlags==0.
21066 */
21067    ldrb   r3, [rSELF, #offThread_breakFlags]
21068    adrl   lr, dvmAsmInstructionStart + (290 * 64)
21069    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21070    cmp    r3, #0
21071    bxeq   lr                   @ nothing to do - jump to real handler
21072    EXPORT_PC()
21073    mov    r0, rPC              @ arg0
21074    mov    r1, rFP              @ arg1
21075    mov    r2, rSELF            @ arg2
21076    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21077
21078/* ------------------------------ */
21079    .balign 64
21080.L_ALT_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
21081/* File: armv5te/alt_stub.S */
21082/*
21083 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21084 * any interesting requests and then jump to the real instruction
21085 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21086 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21087 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21088 * bail to the real handler if breakFlags==0.
21089 */
21090    ldrb   r3, [rSELF, #offThread_breakFlags]
21091    adrl   lr, dvmAsmInstructionStart + (291 * 64)
21092    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21093    cmp    r3, #0
21094    bxeq   lr                   @ nothing to do - jump to real handler
21095    EXPORT_PC()
21096    mov    r0, rPC              @ arg0
21097    mov    r1, rFP              @ arg1
21098    mov    r2, rSELF            @ arg2
21099    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21100
21101/* ------------------------------ */
21102    .balign 64
21103.L_ALT_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
21104/* File: armv5te/alt_stub.S */
21105/*
21106 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21107 * any interesting requests and then jump to the real instruction
21108 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21109 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21110 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21111 * bail to the real handler if breakFlags==0.
21112 */
21113    ldrb   r3, [rSELF, #offThread_breakFlags]
21114    adrl   lr, dvmAsmInstructionStart + (292 * 64)
21115    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21116    cmp    r3, #0
21117    bxeq   lr                   @ nothing to do - jump to real handler
21118    EXPORT_PC()
21119    mov    r0, rPC              @ arg0
21120    mov    r1, rFP              @ arg1
21121    mov    r2, rSELF            @ arg2
21122    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21123
21124/* ------------------------------ */
21125    .balign 64
21126.L_ALT_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
21127/* File: armv5te/alt_stub.S */
21128/*
21129 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21130 * any interesting requests and then jump to the real instruction
21131 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21132 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21133 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21134 * bail to the real handler if breakFlags==0.
21135 */
21136    ldrb   r3, [rSELF, #offThread_breakFlags]
21137    adrl   lr, dvmAsmInstructionStart + (293 * 64)
21138    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21139    cmp    r3, #0
21140    bxeq   lr                   @ nothing to do - jump to real handler
21141    EXPORT_PC()
21142    mov    r0, rPC              @ arg0
21143    mov    r1, rFP              @ arg1
21144    mov    r2, rSELF            @ arg2
21145    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21146
21147/* ------------------------------ */
21148    .balign 64
21149.L_ALT_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
21150/* File: armv5te/alt_stub.S */
21151/*
21152 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21153 * any interesting requests and then jump to the real instruction
21154 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21155 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21156 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21157 * bail to the real handler if breakFlags==0.
21158 */
21159    ldrb   r3, [rSELF, #offThread_breakFlags]
21160    adrl   lr, dvmAsmInstructionStart + (294 * 64)
21161    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21162    cmp    r3, #0
21163    bxeq   lr                   @ nothing to do - jump to real handler
21164    EXPORT_PC()
21165    mov    r0, rPC              @ arg0
21166    mov    r1, rFP              @ arg1
21167    mov    r2, rSELF            @ arg2
21168    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21169
21170/* ------------------------------ */
21171    .balign 64
21172.L_ALT_OP_UNUSED_27FF: /* 0x127 */
21173/* File: armv5te/alt_stub.S */
21174/*
21175 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21176 * any interesting requests and then jump to the real instruction
21177 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21178 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21179 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21180 * bail to the real handler if breakFlags==0.
21181 */
21182    ldrb   r3, [rSELF, #offThread_breakFlags]
21183    adrl   lr, dvmAsmInstructionStart + (295 * 64)
21184    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21185    cmp    r3, #0
21186    bxeq   lr                   @ nothing to do - jump to real handler
21187    EXPORT_PC()
21188    mov    r0, rPC              @ arg0
21189    mov    r1, rFP              @ arg1
21190    mov    r2, rSELF            @ arg2
21191    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21192
21193/* ------------------------------ */
21194    .balign 64
21195.L_ALT_OP_UNUSED_28FF: /* 0x128 */
21196/* File: armv5te/alt_stub.S */
21197/*
21198 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21199 * any interesting requests and then jump to the real instruction
21200 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21201 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21202 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21203 * bail to the real handler if breakFlags==0.
21204 */
21205    ldrb   r3, [rSELF, #offThread_breakFlags]
21206    adrl   lr, dvmAsmInstructionStart + (296 * 64)
21207    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21208    cmp    r3, #0
21209    bxeq   lr                   @ nothing to do - jump to real handler
21210    EXPORT_PC()
21211    mov    r0, rPC              @ arg0
21212    mov    r1, rFP              @ arg1
21213    mov    r2, rSELF            @ arg2
21214    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21215
21216/* ------------------------------ */
21217    .balign 64
21218.L_ALT_OP_UNUSED_29FF: /* 0x129 */
21219/* File: armv5te/alt_stub.S */
21220/*
21221 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21222 * any interesting requests and then jump to the real instruction
21223 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21224 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21225 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21226 * bail to the real handler if breakFlags==0.
21227 */
21228    ldrb   r3, [rSELF, #offThread_breakFlags]
21229    adrl   lr, dvmAsmInstructionStart + (297 * 64)
21230    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21231    cmp    r3, #0
21232    bxeq   lr                   @ nothing to do - jump to real handler
21233    EXPORT_PC()
21234    mov    r0, rPC              @ arg0
21235    mov    r1, rFP              @ arg1
21236    mov    r2, rSELF            @ arg2
21237    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21238
21239/* ------------------------------ */
21240    .balign 64
21241.L_ALT_OP_UNUSED_2AFF: /* 0x12a */
21242/* File: armv5te/alt_stub.S */
21243/*
21244 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21245 * any interesting requests and then jump to the real instruction
21246 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21247 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21248 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21249 * bail to the real handler if breakFlags==0.
21250 */
21251    ldrb   r3, [rSELF, #offThread_breakFlags]
21252    adrl   lr, dvmAsmInstructionStart + (298 * 64)
21253    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21254    cmp    r3, #0
21255    bxeq   lr                   @ nothing to do - jump to real handler
21256    EXPORT_PC()
21257    mov    r0, rPC              @ arg0
21258    mov    r1, rFP              @ arg1
21259    mov    r2, rSELF            @ arg2
21260    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21261
21262/* ------------------------------ */
21263    .balign 64
21264.L_ALT_OP_UNUSED_2BFF: /* 0x12b */
21265/* File: armv5te/alt_stub.S */
21266/*
21267 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21268 * any interesting requests and then jump to the real instruction
21269 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21270 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21271 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21272 * bail to the real handler if breakFlags==0.
21273 */
21274    ldrb   r3, [rSELF, #offThread_breakFlags]
21275    adrl   lr, dvmAsmInstructionStart + (299 * 64)
21276    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21277    cmp    r3, #0
21278    bxeq   lr                   @ nothing to do - jump to real handler
21279    EXPORT_PC()
21280    mov    r0, rPC              @ arg0
21281    mov    r1, rFP              @ arg1
21282    mov    r2, rSELF            @ arg2
21283    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21284
21285/* ------------------------------ */
21286    .balign 64
21287.L_ALT_OP_UNUSED_2CFF: /* 0x12c */
21288/* File: armv5te/alt_stub.S */
21289/*
21290 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21291 * any interesting requests and then jump to the real instruction
21292 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21293 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21294 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21295 * bail to the real handler if breakFlags==0.
21296 */
21297    ldrb   r3, [rSELF, #offThread_breakFlags]
21298    adrl   lr, dvmAsmInstructionStart + (300 * 64)
21299    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21300    cmp    r3, #0
21301    bxeq   lr                   @ nothing to do - jump to real handler
21302    EXPORT_PC()
21303    mov    r0, rPC              @ arg0
21304    mov    r1, rFP              @ arg1
21305    mov    r2, rSELF            @ arg2
21306    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21307
21308/* ------------------------------ */
21309    .balign 64
21310.L_ALT_OP_UNUSED_2DFF: /* 0x12d */
21311/* File: armv5te/alt_stub.S */
21312/*
21313 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21314 * any interesting requests and then jump to the real instruction
21315 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21316 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21317 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21318 * bail to the real handler if breakFlags==0.
21319 */
21320    ldrb   r3, [rSELF, #offThread_breakFlags]
21321    adrl   lr, dvmAsmInstructionStart + (301 * 64)
21322    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21323    cmp    r3, #0
21324    bxeq   lr                   @ nothing to do - jump to real handler
21325    EXPORT_PC()
21326    mov    r0, rPC              @ arg0
21327    mov    r1, rFP              @ arg1
21328    mov    r2, rSELF            @ arg2
21329    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21330
21331/* ------------------------------ */
21332    .balign 64
21333.L_ALT_OP_UNUSED_2EFF: /* 0x12e */
21334/* File: armv5te/alt_stub.S */
21335/*
21336 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21337 * any interesting requests and then jump to the real instruction
21338 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21339 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21340 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21341 * bail to the real handler if breakFlags==0.
21342 */
21343    ldrb   r3, [rSELF, #offThread_breakFlags]
21344    adrl   lr, dvmAsmInstructionStart + (302 * 64)
21345    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21346    cmp    r3, #0
21347    bxeq   lr                   @ nothing to do - jump to real handler
21348    EXPORT_PC()
21349    mov    r0, rPC              @ arg0
21350    mov    r1, rFP              @ arg1
21351    mov    r2, rSELF            @ arg2
21352    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21353
21354/* ------------------------------ */
21355    .balign 64
21356.L_ALT_OP_UNUSED_2FFF: /* 0x12f */
21357/* File: armv5te/alt_stub.S */
21358/*
21359 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21360 * any interesting requests and then jump to the real instruction
21361 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21362 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21363 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21364 * bail to the real handler if breakFlags==0.
21365 */
21366    ldrb   r3, [rSELF, #offThread_breakFlags]
21367    adrl   lr, dvmAsmInstructionStart + (303 * 64)
21368    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21369    cmp    r3, #0
21370    bxeq   lr                   @ nothing to do - jump to real handler
21371    EXPORT_PC()
21372    mov    r0, rPC              @ arg0
21373    mov    r1, rFP              @ arg1
21374    mov    r2, rSELF            @ arg2
21375    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21376
21377/* ------------------------------ */
21378    .balign 64
21379.L_ALT_OP_UNUSED_30FF: /* 0x130 */
21380/* File: armv5te/alt_stub.S */
21381/*
21382 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21383 * any interesting requests and then jump to the real instruction
21384 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21385 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21386 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21387 * bail to the real handler if breakFlags==0.
21388 */
21389    ldrb   r3, [rSELF, #offThread_breakFlags]
21390    adrl   lr, dvmAsmInstructionStart + (304 * 64)
21391    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21392    cmp    r3, #0
21393    bxeq   lr                   @ nothing to do - jump to real handler
21394    EXPORT_PC()
21395    mov    r0, rPC              @ arg0
21396    mov    r1, rFP              @ arg1
21397    mov    r2, rSELF            @ arg2
21398    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21399
21400/* ------------------------------ */
21401    .balign 64
21402.L_ALT_OP_UNUSED_31FF: /* 0x131 */
21403/* File: armv5te/alt_stub.S */
21404/*
21405 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21406 * any interesting requests and then jump to the real instruction
21407 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21408 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21409 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21410 * bail to the real handler if breakFlags==0.
21411 */
21412    ldrb   r3, [rSELF, #offThread_breakFlags]
21413    adrl   lr, dvmAsmInstructionStart + (305 * 64)
21414    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21415    cmp    r3, #0
21416    bxeq   lr                   @ nothing to do - jump to real handler
21417    EXPORT_PC()
21418    mov    r0, rPC              @ arg0
21419    mov    r1, rFP              @ arg1
21420    mov    r2, rSELF            @ arg2
21421    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21422
21423/* ------------------------------ */
21424    .balign 64
21425.L_ALT_OP_UNUSED_32FF: /* 0x132 */
21426/* File: armv5te/alt_stub.S */
21427/*
21428 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21429 * any interesting requests and then jump to the real instruction
21430 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21431 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21432 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21433 * bail to the real handler if breakFlags==0.
21434 */
21435    ldrb   r3, [rSELF, #offThread_breakFlags]
21436    adrl   lr, dvmAsmInstructionStart + (306 * 64)
21437    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21438    cmp    r3, #0
21439    bxeq   lr                   @ nothing to do - jump to real handler
21440    EXPORT_PC()
21441    mov    r0, rPC              @ arg0
21442    mov    r1, rFP              @ arg1
21443    mov    r2, rSELF            @ arg2
21444    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21445
21446/* ------------------------------ */
21447    .balign 64
21448.L_ALT_OP_UNUSED_33FF: /* 0x133 */
21449/* File: armv5te/alt_stub.S */
21450/*
21451 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21452 * any interesting requests and then jump to the real instruction
21453 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21454 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21455 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21456 * bail to the real handler if breakFlags==0.
21457 */
21458    ldrb   r3, [rSELF, #offThread_breakFlags]
21459    adrl   lr, dvmAsmInstructionStart + (307 * 64)
21460    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21461    cmp    r3, #0
21462    bxeq   lr                   @ nothing to do - jump to real handler
21463    EXPORT_PC()
21464    mov    r0, rPC              @ arg0
21465    mov    r1, rFP              @ arg1
21466    mov    r2, rSELF            @ arg2
21467    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21468
21469/* ------------------------------ */
21470    .balign 64
21471.L_ALT_OP_UNUSED_34FF: /* 0x134 */
21472/* File: armv5te/alt_stub.S */
21473/*
21474 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21475 * any interesting requests and then jump to the real instruction
21476 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21477 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21478 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21479 * bail to the real handler if breakFlags==0.
21480 */
21481    ldrb   r3, [rSELF, #offThread_breakFlags]
21482    adrl   lr, dvmAsmInstructionStart + (308 * 64)
21483    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21484    cmp    r3, #0
21485    bxeq   lr                   @ nothing to do - jump to real handler
21486    EXPORT_PC()
21487    mov    r0, rPC              @ arg0
21488    mov    r1, rFP              @ arg1
21489    mov    r2, rSELF            @ arg2
21490    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21491
21492/* ------------------------------ */
21493    .balign 64
21494.L_ALT_OP_UNUSED_35FF: /* 0x135 */
21495/* File: armv5te/alt_stub.S */
21496/*
21497 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21498 * any interesting requests and then jump to the real instruction
21499 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21500 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21501 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21502 * bail to the real handler if breakFlags==0.
21503 */
21504    ldrb   r3, [rSELF, #offThread_breakFlags]
21505    adrl   lr, dvmAsmInstructionStart + (309 * 64)
21506    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21507    cmp    r3, #0
21508    bxeq   lr                   @ nothing to do - jump to real handler
21509    EXPORT_PC()
21510    mov    r0, rPC              @ arg0
21511    mov    r1, rFP              @ arg1
21512    mov    r2, rSELF            @ arg2
21513    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21514
21515/* ------------------------------ */
21516    .balign 64
21517.L_ALT_OP_UNUSED_36FF: /* 0x136 */
21518/* File: armv5te/alt_stub.S */
21519/*
21520 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21521 * any interesting requests and then jump to the real instruction
21522 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21523 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21524 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21525 * bail to the real handler if breakFlags==0.
21526 */
21527    ldrb   r3, [rSELF, #offThread_breakFlags]
21528    adrl   lr, dvmAsmInstructionStart + (310 * 64)
21529    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21530    cmp    r3, #0
21531    bxeq   lr                   @ nothing to do - jump to real handler
21532    EXPORT_PC()
21533    mov    r0, rPC              @ arg0
21534    mov    r1, rFP              @ arg1
21535    mov    r2, rSELF            @ arg2
21536    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21537
21538/* ------------------------------ */
21539    .balign 64
21540.L_ALT_OP_UNUSED_37FF: /* 0x137 */
21541/* File: armv5te/alt_stub.S */
21542/*
21543 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21544 * any interesting requests and then jump to the real instruction
21545 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21546 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21547 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21548 * bail to the real handler if breakFlags==0.
21549 */
21550    ldrb   r3, [rSELF, #offThread_breakFlags]
21551    adrl   lr, dvmAsmInstructionStart + (311 * 64)
21552    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21553    cmp    r3, #0
21554    bxeq   lr                   @ nothing to do - jump to real handler
21555    EXPORT_PC()
21556    mov    r0, rPC              @ arg0
21557    mov    r1, rFP              @ arg1
21558    mov    r2, rSELF            @ arg2
21559    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21560
21561/* ------------------------------ */
21562    .balign 64
21563.L_ALT_OP_UNUSED_38FF: /* 0x138 */
21564/* File: armv5te/alt_stub.S */
21565/*
21566 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21567 * any interesting requests and then jump to the real instruction
21568 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21569 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21570 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21571 * bail to the real handler if breakFlags==0.
21572 */
21573    ldrb   r3, [rSELF, #offThread_breakFlags]
21574    adrl   lr, dvmAsmInstructionStart + (312 * 64)
21575    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21576    cmp    r3, #0
21577    bxeq   lr                   @ nothing to do - jump to real handler
21578    EXPORT_PC()
21579    mov    r0, rPC              @ arg0
21580    mov    r1, rFP              @ arg1
21581    mov    r2, rSELF            @ arg2
21582    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21583
21584/* ------------------------------ */
21585    .balign 64
21586.L_ALT_OP_UNUSED_39FF: /* 0x139 */
21587/* File: armv5te/alt_stub.S */
21588/*
21589 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21590 * any interesting requests and then jump to the real instruction
21591 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21592 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21593 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21594 * bail to the real handler if breakFlags==0.
21595 */
21596    ldrb   r3, [rSELF, #offThread_breakFlags]
21597    adrl   lr, dvmAsmInstructionStart + (313 * 64)
21598    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21599    cmp    r3, #0
21600    bxeq   lr                   @ nothing to do - jump to real handler
21601    EXPORT_PC()
21602    mov    r0, rPC              @ arg0
21603    mov    r1, rFP              @ arg1
21604    mov    r2, rSELF            @ arg2
21605    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21606
21607/* ------------------------------ */
21608    .balign 64
21609.L_ALT_OP_UNUSED_3AFF: /* 0x13a */
21610/* File: armv5te/alt_stub.S */
21611/*
21612 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21613 * any interesting requests and then jump to the real instruction
21614 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21615 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21616 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21617 * bail to the real handler if breakFlags==0.
21618 */
21619    ldrb   r3, [rSELF, #offThread_breakFlags]
21620    adrl   lr, dvmAsmInstructionStart + (314 * 64)
21621    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21622    cmp    r3, #0
21623    bxeq   lr                   @ nothing to do - jump to real handler
21624    EXPORT_PC()
21625    mov    r0, rPC              @ arg0
21626    mov    r1, rFP              @ arg1
21627    mov    r2, rSELF            @ arg2
21628    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21629
21630/* ------------------------------ */
21631    .balign 64
21632.L_ALT_OP_UNUSED_3BFF: /* 0x13b */
21633/* File: armv5te/alt_stub.S */
21634/*
21635 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21636 * any interesting requests and then jump to the real instruction
21637 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21638 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21639 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21640 * bail to the real handler if breakFlags==0.
21641 */
21642    ldrb   r3, [rSELF, #offThread_breakFlags]
21643    adrl   lr, dvmAsmInstructionStart + (315 * 64)
21644    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21645    cmp    r3, #0
21646    bxeq   lr                   @ nothing to do - jump to real handler
21647    EXPORT_PC()
21648    mov    r0, rPC              @ arg0
21649    mov    r1, rFP              @ arg1
21650    mov    r2, rSELF            @ arg2
21651    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21652
21653/* ------------------------------ */
21654    .balign 64
21655.L_ALT_OP_UNUSED_3CFF: /* 0x13c */
21656/* File: armv5te/alt_stub.S */
21657/*
21658 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21659 * any interesting requests and then jump to the real instruction
21660 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21661 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21662 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21663 * bail to the real handler if breakFlags==0.
21664 */
21665    ldrb   r3, [rSELF, #offThread_breakFlags]
21666    adrl   lr, dvmAsmInstructionStart + (316 * 64)
21667    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21668    cmp    r3, #0
21669    bxeq   lr                   @ nothing to do - jump to real handler
21670    EXPORT_PC()
21671    mov    r0, rPC              @ arg0
21672    mov    r1, rFP              @ arg1
21673    mov    r2, rSELF            @ arg2
21674    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21675
21676/* ------------------------------ */
21677    .balign 64
21678.L_ALT_OP_UNUSED_3DFF: /* 0x13d */
21679/* File: armv5te/alt_stub.S */
21680/*
21681 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21682 * any interesting requests and then jump to the real instruction
21683 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21684 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21685 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21686 * bail to the real handler if breakFlags==0.
21687 */
21688    ldrb   r3, [rSELF, #offThread_breakFlags]
21689    adrl   lr, dvmAsmInstructionStart + (317 * 64)
21690    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21691    cmp    r3, #0
21692    bxeq   lr                   @ nothing to do - jump to real handler
21693    EXPORT_PC()
21694    mov    r0, rPC              @ arg0
21695    mov    r1, rFP              @ arg1
21696    mov    r2, rSELF            @ arg2
21697    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21698
21699/* ------------------------------ */
21700    .balign 64
21701.L_ALT_OP_UNUSED_3EFF: /* 0x13e */
21702/* File: armv5te/alt_stub.S */
21703/*
21704 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21705 * any interesting requests and then jump to the real instruction
21706 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21707 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21708 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21709 * bail to the real handler if breakFlags==0.
21710 */
21711    ldrb   r3, [rSELF, #offThread_breakFlags]
21712    adrl   lr, dvmAsmInstructionStart + (318 * 64)
21713    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21714    cmp    r3, #0
21715    bxeq   lr                   @ nothing to do - jump to real handler
21716    EXPORT_PC()
21717    mov    r0, rPC              @ arg0
21718    mov    r1, rFP              @ arg1
21719    mov    r2, rSELF            @ arg2
21720    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21721
21722/* ------------------------------ */
21723    .balign 64
21724.L_ALT_OP_UNUSED_3FFF: /* 0x13f */
21725/* File: armv5te/alt_stub.S */
21726/*
21727 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21728 * any interesting requests and then jump to the real instruction
21729 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21730 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21731 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21732 * bail to the real handler if breakFlags==0.
21733 */
21734    ldrb   r3, [rSELF, #offThread_breakFlags]
21735    adrl   lr, dvmAsmInstructionStart + (319 * 64)
21736    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21737    cmp    r3, #0
21738    bxeq   lr                   @ nothing to do - jump to real handler
21739    EXPORT_PC()
21740    mov    r0, rPC              @ arg0
21741    mov    r1, rFP              @ arg1
21742    mov    r2, rSELF            @ arg2
21743    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21744
21745/* ------------------------------ */
21746    .balign 64
21747.L_ALT_OP_UNUSED_40FF: /* 0x140 */
21748/* File: armv5te/alt_stub.S */
21749/*
21750 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21751 * any interesting requests and then jump to the real instruction
21752 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21753 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21754 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21755 * bail to the real handler if breakFlags==0.
21756 */
21757    ldrb   r3, [rSELF, #offThread_breakFlags]
21758    adrl   lr, dvmAsmInstructionStart + (320 * 64)
21759    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21760    cmp    r3, #0
21761    bxeq   lr                   @ nothing to do - jump to real handler
21762    EXPORT_PC()
21763    mov    r0, rPC              @ arg0
21764    mov    r1, rFP              @ arg1
21765    mov    r2, rSELF            @ arg2
21766    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21767
21768/* ------------------------------ */
21769    .balign 64
21770.L_ALT_OP_UNUSED_41FF: /* 0x141 */
21771/* File: armv5te/alt_stub.S */
21772/*
21773 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21774 * any interesting requests and then jump to the real instruction
21775 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21776 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21777 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21778 * bail to the real handler if breakFlags==0.
21779 */
21780    ldrb   r3, [rSELF, #offThread_breakFlags]
21781    adrl   lr, dvmAsmInstructionStart + (321 * 64)
21782    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21783    cmp    r3, #0
21784    bxeq   lr                   @ nothing to do - jump to real handler
21785    EXPORT_PC()
21786    mov    r0, rPC              @ arg0
21787    mov    r1, rFP              @ arg1
21788    mov    r2, rSELF            @ arg2
21789    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21790
21791/* ------------------------------ */
21792    .balign 64
21793.L_ALT_OP_UNUSED_42FF: /* 0x142 */
21794/* File: armv5te/alt_stub.S */
21795/*
21796 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21797 * any interesting requests and then jump to the real instruction
21798 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21799 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21800 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21801 * bail to the real handler if breakFlags==0.
21802 */
21803    ldrb   r3, [rSELF, #offThread_breakFlags]
21804    adrl   lr, dvmAsmInstructionStart + (322 * 64)
21805    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21806    cmp    r3, #0
21807    bxeq   lr                   @ nothing to do - jump to real handler
21808    EXPORT_PC()
21809    mov    r0, rPC              @ arg0
21810    mov    r1, rFP              @ arg1
21811    mov    r2, rSELF            @ arg2
21812    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21813
21814/* ------------------------------ */
21815    .balign 64
21816.L_ALT_OP_UNUSED_43FF: /* 0x143 */
21817/* File: armv5te/alt_stub.S */
21818/*
21819 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21820 * any interesting requests and then jump to the real instruction
21821 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21822 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21823 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21824 * bail to the real handler if breakFlags==0.
21825 */
21826    ldrb   r3, [rSELF, #offThread_breakFlags]
21827    adrl   lr, dvmAsmInstructionStart + (323 * 64)
21828    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21829    cmp    r3, #0
21830    bxeq   lr                   @ nothing to do - jump to real handler
21831    EXPORT_PC()
21832    mov    r0, rPC              @ arg0
21833    mov    r1, rFP              @ arg1
21834    mov    r2, rSELF            @ arg2
21835    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21836
21837/* ------------------------------ */
21838    .balign 64
21839.L_ALT_OP_UNUSED_44FF: /* 0x144 */
21840/* File: armv5te/alt_stub.S */
21841/*
21842 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21843 * any interesting requests and then jump to the real instruction
21844 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21845 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21846 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21847 * bail to the real handler if breakFlags==0.
21848 */
21849    ldrb   r3, [rSELF, #offThread_breakFlags]
21850    adrl   lr, dvmAsmInstructionStart + (324 * 64)
21851    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21852    cmp    r3, #0
21853    bxeq   lr                   @ nothing to do - jump to real handler
21854    EXPORT_PC()
21855    mov    r0, rPC              @ arg0
21856    mov    r1, rFP              @ arg1
21857    mov    r2, rSELF            @ arg2
21858    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21859
21860/* ------------------------------ */
21861    .balign 64
21862.L_ALT_OP_UNUSED_45FF: /* 0x145 */
21863/* File: armv5te/alt_stub.S */
21864/*
21865 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21866 * any interesting requests and then jump to the real instruction
21867 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21868 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21869 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21870 * bail to the real handler if breakFlags==0.
21871 */
21872    ldrb   r3, [rSELF, #offThread_breakFlags]
21873    adrl   lr, dvmAsmInstructionStart + (325 * 64)
21874    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21875    cmp    r3, #0
21876    bxeq   lr                   @ nothing to do - jump to real handler
21877    EXPORT_PC()
21878    mov    r0, rPC              @ arg0
21879    mov    r1, rFP              @ arg1
21880    mov    r2, rSELF            @ arg2
21881    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21882
21883/* ------------------------------ */
21884    .balign 64
21885.L_ALT_OP_UNUSED_46FF: /* 0x146 */
21886/* File: armv5te/alt_stub.S */
21887/*
21888 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21889 * any interesting requests and then jump to the real instruction
21890 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21891 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21892 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21893 * bail to the real handler if breakFlags==0.
21894 */
21895    ldrb   r3, [rSELF, #offThread_breakFlags]
21896    adrl   lr, dvmAsmInstructionStart + (326 * 64)
21897    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21898    cmp    r3, #0
21899    bxeq   lr                   @ nothing to do - jump to real handler
21900    EXPORT_PC()
21901    mov    r0, rPC              @ arg0
21902    mov    r1, rFP              @ arg1
21903    mov    r2, rSELF            @ arg2
21904    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21905
21906/* ------------------------------ */
21907    .balign 64
21908.L_ALT_OP_UNUSED_47FF: /* 0x147 */
21909/* File: armv5te/alt_stub.S */
21910/*
21911 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21912 * any interesting requests and then jump to the real instruction
21913 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21914 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21915 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21916 * bail to the real handler if breakFlags==0.
21917 */
21918    ldrb   r3, [rSELF, #offThread_breakFlags]
21919    adrl   lr, dvmAsmInstructionStart + (327 * 64)
21920    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21921    cmp    r3, #0
21922    bxeq   lr                   @ nothing to do - jump to real handler
21923    EXPORT_PC()
21924    mov    r0, rPC              @ arg0
21925    mov    r1, rFP              @ arg1
21926    mov    r2, rSELF            @ arg2
21927    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21928
21929/* ------------------------------ */
21930    .balign 64
21931.L_ALT_OP_UNUSED_48FF: /* 0x148 */
21932/* File: armv5te/alt_stub.S */
21933/*
21934 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21935 * any interesting requests and then jump to the real instruction
21936 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21937 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21938 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21939 * bail to the real handler if breakFlags==0.
21940 */
21941    ldrb   r3, [rSELF, #offThread_breakFlags]
21942    adrl   lr, dvmAsmInstructionStart + (328 * 64)
21943    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21944    cmp    r3, #0
21945    bxeq   lr                   @ nothing to do - jump to real handler
21946    EXPORT_PC()
21947    mov    r0, rPC              @ arg0
21948    mov    r1, rFP              @ arg1
21949    mov    r2, rSELF            @ arg2
21950    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21951
21952/* ------------------------------ */
21953    .balign 64
21954.L_ALT_OP_UNUSED_49FF: /* 0x149 */
21955/* File: armv5te/alt_stub.S */
21956/*
21957 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21958 * any interesting requests and then jump to the real instruction
21959 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21960 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21961 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21962 * bail to the real handler if breakFlags==0.
21963 */
21964    ldrb   r3, [rSELF, #offThread_breakFlags]
21965    adrl   lr, dvmAsmInstructionStart + (329 * 64)
21966    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21967    cmp    r3, #0
21968    bxeq   lr                   @ nothing to do - jump to real handler
21969    EXPORT_PC()
21970    mov    r0, rPC              @ arg0
21971    mov    r1, rFP              @ arg1
21972    mov    r2, rSELF            @ arg2
21973    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21974
21975/* ------------------------------ */
21976    .balign 64
21977.L_ALT_OP_UNUSED_4AFF: /* 0x14a */
21978/* File: armv5te/alt_stub.S */
21979/*
21980 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21981 * any interesting requests and then jump to the real instruction
21982 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21983 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21984 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21985 * bail to the real handler if breakFlags==0.
21986 */
21987    ldrb   r3, [rSELF, #offThread_breakFlags]
21988    adrl   lr, dvmAsmInstructionStart + (330 * 64)
21989    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21990    cmp    r3, #0
21991    bxeq   lr                   @ nothing to do - jump to real handler
21992    EXPORT_PC()
21993    mov    r0, rPC              @ arg0
21994    mov    r1, rFP              @ arg1
21995    mov    r2, rSELF            @ arg2
21996    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21997
21998/* ------------------------------ */
21999    .balign 64
22000.L_ALT_OP_UNUSED_4BFF: /* 0x14b */
22001/* File: armv5te/alt_stub.S */
22002/*
22003 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22004 * any interesting requests and then jump to the real instruction
22005 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22006 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22007 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22008 * bail to the real handler if breakFlags==0.
22009 */
22010    ldrb   r3, [rSELF, #offThread_breakFlags]
22011    adrl   lr, dvmAsmInstructionStart + (331 * 64)
22012    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22013    cmp    r3, #0
22014    bxeq   lr                   @ nothing to do - jump to real handler
22015    EXPORT_PC()
22016    mov    r0, rPC              @ arg0
22017    mov    r1, rFP              @ arg1
22018    mov    r2, rSELF            @ arg2
22019    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22020
22021/* ------------------------------ */
22022    .balign 64
22023.L_ALT_OP_UNUSED_4CFF: /* 0x14c */
22024/* File: armv5te/alt_stub.S */
22025/*
22026 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22027 * any interesting requests and then jump to the real instruction
22028 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22029 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22030 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22031 * bail to the real handler if breakFlags==0.
22032 */
22033    ldrb   r3, [rSELF, #offThread_breakFlags]
22034    adrl   lr, dvmAsmInstructionStart + (332 * 64)
22035    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22036    cmp    r3, #0
22037    bxeq   lr                   @ nothing to do - jump to real handler
22038    EXPORT_PC()
22039    mov    r0, rPC              @ arg0
22040    mov    r1, rFP              @ arg1
22041    mov    r2, rSELF            @ arg2
22042    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22043
22044/* ------------------------------ */
22045    .balign 64
22046.L_ALT_OP_UNUSED_4DFF: /* 0x14d */
22047/* File: armv5te/alt_stub.S */
22048/*
22049 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22050 * any interesting requests and then jump to the real instruction
22051 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22052 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22053 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22054 * bail to the real handler if breakFlags==0.
22055 */
22056    ldrb   r3, [rSELF, #offThread_breakFlags]
22057    adrl   lr, dvmAsmInstructionStart + (333 * 64)
22058    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22059    cmp    r3, #0
22060    bxeq   lr                   @ nothing to do - jump to real handler
22061    EXPORT_PC()
22062    mov    r0, rPC              @ arg0
22063    mov    r1, rFP              @ arg1
22064    mov    r2, rSELF            @ arg2
22065    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22066
22067/* ------------------------------ */
22068    .balign 64
22069.L_ALT_OP_UNUSED_4EFF: /* 0x14e */
22070/* File: armv5te/alt_stub.S */
22071/*
22072 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22073 * any interesting requests and then jump to the real instruction
22074 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22075 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22076 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22077 * bail to the real handler if breakFlags==0.
22078 */
22079    ldrb   r3, [rSELF, #offThread_breakFlags]
22080    adrl   lr, dvmAsmInstructionStart + (334 * 64)
22081    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22082    cmp    r3, #0
22083    bxeq   lr                   @ nothing to do - jump to real handler
22084    EXPORT_PC()
22085    mov    r0, rPC              @ arg0
22086    mov    r1, rFP              @ arg1
22087    mov    r2, rSELF            @ arg2
22088    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22089
22090/* ------------------------------ */
22091    .balign 64
22092.L_ALT_OP_UNUSED_4FFF: /* 0x14f */
22093/* File: armv5te/alt_stub.S */
22094/*
22095 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22096 * any interesting requests and then jump to the real instruction
22097 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22098 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22099 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22100 * bail to the real handler if breakFlags==0.
22101 */
22102    ldrb   r3, [rSELF, #offThread_breakFlags]
22103    adrl   lr, dvmAsmInstructionStart + (335 * 64)
22104    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22105    cmp    r3, #0
22106    bxeq   lr                   @ nothing to do - jump to real handler
22107    EXPORT_PC()
22108    mov    r0, rPC              @ arg0
22109    mov    r1, rFP              @ arg1
22110    mov    r2, rSELF            @ arg2
22111    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22112
22113/* ------------------------------ */
22114    .balign 64
22115.L_ALT_OP_UNUSED_50FF: /* 0x150 */
22116/* File: armv5te/alt_stub.S */
22117/*
22118 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22119 * any interesting requests and then jump to the real instruction
22120 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22121 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22122 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22123 * bail to the real handler if breakFlags==0.
22124 */
22125    ldrb   r3, [rSELF, #offThread_breakFlags]
22126    adrl   lr, dvmAsmInstructionStart + (336 * 64)
22127    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22128    cmp    r3, #0
22129    bxeq   lr                   @ nothing to do - jump to real handler
22130    EXPORT_PC()
22131    mov    r0, rPC              @ arg0
22132    mov    r1, rFP              @ arg1
22133    mov    r2, rSELF            @ arg2
22134    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22135
22136/* ------------------------------ */
22137    .balign 64
22138.L_ALT_OP_UNUSED_51FF: /* 0x151 */
22139/* File: armv5te/alt_stub.S */
22140/*
22141 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22142 * any interesting requests and then jump to the real instruction
22143 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22144 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22145 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22146 * bail to the real handler if breakFlags==0.
22147 */
22148    ldrb   r3, [rSELF, #offThread_breakFlags]
22149    adrl   lr, dvmAsmInstructionStart + (337 * 64)
22150    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22151    cmp    r3, #0
22152    bxeq   lr                   @ nothing to do - jump to real handler
22153    EXPORT_PC()
22154    mov    r0, rPC              @ arg0
22155    mov    r1, rFP              @ arg1
22156    mov    r2, rSELF            @ arg2
22157    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22158
22159/* ------------------------------ */
22160    .balign 64
22161.L_ALT_OP_UNUSED_52FF: /* 0x152 */
22162/* File: armv5te/alt_stub.S */
22163/*
22164 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22165 * any interesting requests and then jump to the real instruction
22166 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22167 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22168 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22169 * bail to the real handler if breakFlags==0.
22170 */
22171    ldrb   r3, [rSELF, #offThread_breakFlags]
22172    adrl   lr, dvmAsmInstructionStart + (338 * 64)
22173    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22174    cmp    r3, #0
22175    bxeq   lr                   @ nothing to do - jump to real handler
22176    EXPORT_PC()
22177    mov    r0, rPC              @ arg0
22178    mov    r1, rFP              @ arg1
22179    mov    r2, rSELF            @ arg2
22180    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22181
22182/* ------------------------------ */
22183    .balign 64
22184.L_ALT_OP_UNUSED_53FF: /* 0x153 */
22185/* File: armv5te/alt_stub.S */
22186/*
22187 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22188 * any interesting requests and then jump to the real instruction
22189 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22190 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22191 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22192 * bail to the real handler if breakFlags==0.
22193 */
22194    ldrb   r3, [rSELF, #offThread_breakFlags]
22195    adrl   lr, dvmAsmInstructionStart + (339 * 64)
22196    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22197    cmp    r3, #0
22198    bxeq   lr                   @ nothing to do - jump to real handler
22199    EXPORT_PC()
22200    mov    r0, rPC              @ arg0
22201    mov    r1, rFP              @ arg1
22202    mov    r2, rSELF            @ arg2
22203    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22204
22205/* ------------------------------ */
22206    .balign 64
22207.L_ALT_OP_UNUSED_54FF: /* 0x154 */
22208/* File: armv5te/alt_stub.S */
22209/*
22210 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22211 * any interesting requests and then jump to the real instruction
22212 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22213 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22214 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22215 * bail to the real handler if breakFlags==0.
22216 */
22217    ldrb   r3, [rSELF, #offThread_breakFlags]
22218    adrl   lr, dvmAsmInstructionStart + (340 * 64)
22219    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22220    cmp    r3, #0
22221    bxeq   lr                   @ nothing to do - jump to real handler
22222    EXPORT_PC()
22223    mov    r0, rPC              @ arg0
22224    mov    r1, rFP              @ arg1
22225    mov    r2, rSELF            @ arg2
22226    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22227
22228/* ------------------------------ */
22229    .balign 64
22230.L_ALT_OP_UNUSED_55FF: /* 0x155 */
22231/* File: armv5te/alt_stub.S */
22232/*
22233 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22234 * any interesting requests and then jump to the real instruction
22235 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22236 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22237 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22238 * bail to the real handler if breakFlags==0.
22239 */
22240    ldrb   r3, [rSELF, #offThread_breakFlags]
22241    adrl   lr, dvmAsmInstructionStart + (341 * 64)
22242    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22243    cmp    r3, #0
22244    bxeq   lr                   @ nothing to do - jump to real handler
22245    EXPORT_PC()
22246    mov    r0, rPC              @ arg0
22247    mov    r1, rFP              @ arg1
22248    mov    r2, rSELF            @ arg2
22249    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22250
22251/* ------------------------------ */
22252    .balign 64
22253.L_ALT_OP_UNUSED_56FF: /* 0x156 */
22254/* File: armv5te/alt_stub.S */
22255/*
22256 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22257 * any interesting requests and then jump to the real instruction
22258 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22259 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22260 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22261 * bail to the real handler if breakFlags==0.
22262 */
22263    ldrb   r3, [rSELF, #offThread_breakFlags]
22264    adrl   lr, dvmAsmInstructionStart + (342 * 64)
22265    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22266    cmp    r3, #0
22267    bxeq   lr                   @ nothing to do - jump to real handler
22268    EXPORT_PC()
22269    mov    r0, rPC              @ arg0
22270    mov    r1, rFP              @ arg1
22271    mov    r2, rSELF            @ arg2
22272    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22273
22274/* ------------------------------ */
22275    .balign 64
22276.L_ALT_OP_UNUSED_57FF: /* 0x157 */
22277/* File: armv5te/alt_stub.S */
22278/*
22279 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22280 * any interesting requests and then jump to the real instruction
22281 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22282 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22283 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22284 * bail to the real handler if breakFlags==0.
22285 */
22286    ldrb   r3, [rSELF, #offThread_breakFlags]
22287    adrl   lr, dvmAsmInstructionStart + (343 * 64)
22288    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22289    cmp    r3, #0
22290    bxeq   lr                   @ nothing to do - jump to real handler
22291    EXPORT_PC()
22292    mov    r0, rPC              @ arg0
22293    mov    r1, rFP              @ arg1
22294    mov    r2, rSELF            @ arg2
22295    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22296
22297/* ------------------------------ */
22298    .balign 64
22299.L_ALT_OP_UNUSED_58FF: /* 0x158 */
22300/* File: armv5te/alt_stub.S */
22301/*
22302 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22303 * any interesting requests and then jump to the real instruction
22304 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22305 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22306 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22307 * bail to the real handler if breakFlags==0.
22308 */
22309    ldrb   r3, [rSELF, #offThread_breakFlags]
22310    adrl   lr, dvmAsmInstructionStart + (344 * 64)
22311    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22312    cmp    r3, #0
22313    bxeq   lr                   @ nothing to do - jump to real handler
22314    EXPORT_PC()
22315    mov    r0, rPC              @ arg0
22316    mov    r1, rFP              @ arg1
22317    mov    r2, rSELF            @ arg2
22318    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22319
22320/* ------------------------------ */
22321    .balign 64
22322.L_ALT_OP_UNUSED_59FF: /* 0x159 */
22323/* File: armv5te/alt_stub.S */
22324/*
22325 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22326 * any interesting requests and then jump to the real instruction
22327 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22328 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22329 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22330 * bail to the real handler if breakFlags==0.
22331 */
22332    ldrb   r3, [rSELF, #offThread_breakFlags]
22333    adrl   lr, dvmAsmInstructionStart + (345 * 64)
22334    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22335    cmp    r3, #0
22336    bxeq   lr                   @ nothing to do - jump to real handler
22337    EXPORT_PC()
22338    mov    r0, rPC              @ arg0
22339    mov    r1, rFP              @ arg1
22340    mov    r2, rSELF            @ arg2
22341    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22342
22343/* ------------------------------ */
22344    .balign 64
22345.L_ALT_OP_UNUSED_5AFF: /* 0x15a */
22346/* File: armv5te/alt_stub.S */
22347/*
22348 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22349 * any interesting requests and then jump to the real instruction
22350 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22351 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22352 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22353 * bail to the real handler if breakFlags==0.
22354 */
22355    ldrb   r3, [rSELF, #offThread_breakFlags]
22356    adrl   lr, dvmAsmInstructionStart + (346 * 64)
22357    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22358    cmp    r3, #0
22359    bxeq   lr                   @ nothing to do - jump to real handler
22360    EXPORT_PC()
22361    mov    r0, rPC              @ arg0
22362    mov    r1, rFP              @ arg1
22363    mov    r2, rSELF            @ arg2
22364    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22365
22366/* ------------------------------ */
22367    .balign 64
22368.L_ALT_OP_UNUSED_5BFF: /* 0x15b */
22369/* File: armv5te/alt_stub.S */
22370/*
22371 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22372 * any interesting requests and then jump to the real instruction
22373 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22374 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22375 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22376 * bail to the real handler if breakFlags==0.
22377 */
22378    ldrb   r3, [rSELF, #offThread_breakFlags]
22379    adrl   lr, dvmAsmInstructionStart + (347 * 64)
22380    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22381    cmp    r3, #0
22382    bxeq   lr                   @ nothing to do - jump to real handler
22383    EXPORT_PC()
22384    mov    r0, rPC              @ arg0
22385    mov    r1, rFP              @ arg1
22386    mov    r2, rSELF            @ arg2
22387    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22388
22389/* ------------------------------ */
22390    .balign 64
22391.L_ALT_OP_UNUSED_5CFF: /* 0x15c */
22392/* File: armv5te/alt_stub.S */
22393/*
22394 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22395 * any interesting requests and then jump to the real instruction
22396 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22397 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22398 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22399 * bail to the real handler if breakFlags==0.
22400 */
22401    ldrb   r3, [rSELF, #offThread_breakFlags]
22402    adrl   lr, dvmAsmInstructionStart + (348 * 64)
22403    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22404    cmp    r3, #0
22405    bxeq   lr                   @ nothing to do - jump to real handler
22406    EXPORT_PC()
22407    mov    r0, rPC              @ arg0
22408    mov    r1, rFP              @ arg1
22409    mov    r2, rSELF            @ arg2
22410    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22411
22412/* ------------------------------ */
22413    .balign 64
22414.L_ALT_OP_UNUSED_5DFF: /* 0x15d */
22415/* File: armv5te/alt_stub.S */
22416/*
22417 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22418 * any interesting requests and then jump to the real instruction
22419 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22420 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22421 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22422 * bail to the real handler if breakFlags==0.
22423 */
22424    ldrb   r3, [rSELF, #offThread_breakFlags]
22425    adrl   lr, dvmAsmInstructionStart + (349 * 64)
22426    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22427    cmp    r3, #0
22428    bxeq   lr                   @ nothing to do - jump to real handler
22429    EXPORT_PC()
22430    mov    r0, rPC              @ arg0
22431    mov    r1, rFP              @ arg1
22432    mov    r2, rSELF            @ arg2
22433    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22434
22435/* ------------------------------ */
22436    .balign 64
22437.L_ALT_OP_UNUSED_5EFF: /* 0x15e */
22438/* File: armv5te/alt_stub.S */
22439/*
22440 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22441 * any interesting requests and then jump to the real instruction
22442 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22443 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22444 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22445 * bail to the real handler if breakFlags==0.
22446 */
22447    ldrb   r3, [rSELF, #offThread_breakFlags]
22448    adrl   lr, dvmAsmInstructionStart + (350 * 64)
22449    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22450    cmp    r3, #0
22451    bxeq   lr                   @ nothing to do - jump to real handler
22452    EXPORT_PC()
22453    mov    r0, rPC              @ arg0
22454    mov    r1, rFP              @ arg1
22455    mov    r2, rSELF            @ arg2
22456    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22457
22458/* ------------------------------ */
22459    .balign 64
22460.L_ALT_OP_UNUSED_5FFF: /* 0x15f */
22461/* File: armv5te/alt_stub.S */
22462/*
22463 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22464 * any interesting requests and then jump to the real instruction
22465 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22466 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22467 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22468 * bail to the real handler if breakFlags==0.
22469 */
22470    ldrb   r3, [rSELF, #offThread_breakFlags]
22471    adrl   lr, dvmAsmInstructionStart + (351 * 64)
22472    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22473    cmp    r3, #0
22474    bxeq   lr                   @ nothing to do - jump to real handler
22475    EXPORT_PC()
22476    mov    r0, rPC              @ arg0
22477    mov    r1, rFP              @ arg1
22478    mov    r2, rSELF            @ arg2
22479    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22480
22481/* ------------------------------ */
22482    .balign 64
22483.L_ALT_OP_UNUSED_60FF: /* 0x160 */
22484/* File: armv5te/alt_stub.S */
22485/*
22486 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22487 * any interesting requests and then jump to the real instruction
22488 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22489 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22490 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22491 * bail to the real handler if breakFlags==0.
22492 */
22493    ldrb   r3, [rSELF, #offThread_breakFlags]
22494    adrl   lr, dvmAsmInstructionStart + (352 * 64)
22495    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22496    cmp    r3, #0
22497    bxeq   lr                   @ nothing to do - jump to real handler
22498    EXPORT_PC()
22499    mov    r0, rPC              @ arg0
22500    mov    r1, rFP              @ arg1
22501    mov    r2, rSELF            @ arg2
22502    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22503
22504/* ------------------------------ */
22505    .balign 64
22506.L_ALT_OP_UNUSED_61FF: /* 0x161 */
22507/* File: armv5te/alt_stub.S */
22508/*
22509 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22510 * any interesting requests and then jump to the real instruction
22511 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22512 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22513 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22514 * bail to the real handler if breakFlags==0.
22515 */
22516    ldrb   r3, [rSELF, #offThread_breakFlags]
22517    adrl   lr, dvmAsmInstructionStart + (353 * 64)
22518    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22519    cmp    r3, #0
22520    bxeq   lr                   @ nothing to do - jump to real handler
22521    EXPORT_PC()
22522    mov    r0, rPC              @ arg0
22523    mov    r1, rFP              @ arg1
22524    mov    r2, rSELF            @ arg2
22525    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22526
22527/* ------------------------------ */
22528    .balign 64
22529.L_ALT_OP_UNUSED_62FF: /* 0x162 */
22530/* File: armv5te/alt_stub.S */
22531/*
22532 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22533 * any interesting requests and then jump to the real instruction
22534 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22535 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22536 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22537 * bail to the real handler if breakFlags==0.
22538 */
22539    ldrb   r3, [rSELF, #offThread_breakFlags]
22540    adrl   lr, dvmAsmInstructionStart + (354 * 64)
22541    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22542    cmp    r3, #0
22543    bxeq   lr                   @ nothing to do - jump to real handler
22544    EXPORT_PC()
22545    mov    r0, rPC              @ arg0
22546    mov    r1, rFP              @ arg1
22547    mov    r2, rSELF            @ arg2
22548    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22549
22550/* ------------------------------ */
22551    .balign 64
22552.L_ALT_OP_UNUSED_63FF: /* 0x163 */
22553/* File: armv5te/alt_stub.S */
22554/*
22555 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22556 * any interesting requests and then jump to the real instruction
22557 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22558 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22559 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22560 * bail to the real handler if breakFlags==0.
22561 */
22562    ldrb   r3, [rSELF, #offThread_breakFlags]
22563    adrl   lr, dvmAsmInstructionStart + (355 * 64)
22564    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22565    cmp    r3, #0
22566    bxeq   lr                   @ nothing to do - jump to real handler
22567    EXPORT_PC()
22568    mov    r0, rPC              @ arg0
22569    mov    r1, rFP              @ arg1
22570    mov    r2, rSELF            @ arg2
22571    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22572
22573/* ------------------------------ */
22574    .balign 64
22575.L_ALT_OP_UNUSED_64FF: /* 0x164 */
22576/* File: armv5te/alt_stub.S */
22577/*
22578 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22579 * any interesting requests and then jump to the real instruction
22580 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22581 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22582 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22583 * bail to the real handler if breakFlags==0.
22584 */
22585    ldrb   r3, [rSELF, #offThread_breakFlags]
22586    adrl   lr, dvmAsmInstructionStart + (356 * 64)
22587    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22588    cmp    r3, #0
22589    bxeq   lr                   @ nothing to do - jump to real handler
22590    EXPORT_PC()
22591    mov    r0, rPC              @ arg0
22592    mov    r1, rFP              @ arg1
22593    mov    r2, rSELF            @ arg2
22594    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22595
22596/* ------------------------------ */
22597    .balign 64
22598.L_ALT_OP_UNUSED_65FF: /* 0x165 */
22599/* File: armv5te/alt_stub.S */
22600/*
22601 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22602 * any interesting requests and then jump to the real instruction
22603 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22604 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22605 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22606 * bail to the real handler if breakFlags==0.
22607 */
22608    ldrb   r3, [rSELF, #offThread_breakFlags]
22609    adrl   lr, dvmAsmInstructionStart + (357 * 64)
22610    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22611    cmp    r3, #0
22612    bxeq   lr                   @ nothing to do - jump to real handler
22613    EXPORT_PC()
22614    mov    r0, rPC              @ arg0
22615    mov    r1, rFP              @ arg1
22616    mov    r2, rSELF            @ arg2
22617    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22618
22619/* ------------------------------ */
22620    .balign 64
22621.L_ALT_OP_UNUSED_66FF: /* 0x166 */
22622/* File: armv5te/alt_stub.S */
22623/*
22624 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22625 * any interesting requests and then jump to the real instruction
22626 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22627 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22628 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22629 * bail to the real handler if breakFlags==0.
22630 */
22631    ldrb   r3, [rSELF, #offThread_breakFlags]
22632    adrl   lr, dvmAsmInstructionStart + (358 * 64)
22633    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22634    cmp    r3, #0
22635    bxeq   lr                   @ nothing to do - jump to real handler
22636    EXPORT_PC()
22637    mov    r0, rPC              @ arg0
22638    mov    r1, rFP              @ arg1
22639    mov    r2, rSELF            @ arg2
22640    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22641
22642/* ------------------------------ */
22643    .balign 64
22644.L_ALT_OP_UNUSED_67FF: /* 0x167 */
22645/* File: armv5te/alt_stub.S */
22646/*
22647 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22648 * any interesting requests and then jump to the real instruction
22649 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22650 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22651 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22652 * bail to the real handler if breakFlags==0.
22653 */
22654    ldrb   r3, [rSELF, #offThread_breakFlags]
22655    adrl   lr, dvmAsmInstructionStart + (359 * 64)
22656    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22657    cmp    r3, #0
22658    bxeq   lr                   @ nothing to do - jump to real handler
22659    EXPORT_PC()
22660    mov    r0, rPC              @ arg0
22661    mov    r1, rFP              @ arg1
22662    mov    r2, rSELF            @ arg2
22663    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22664
22665/* ------------------------------ */
22666    .balign 64
22667.L_ALT_OP_UNUSED_68FF: /* 0x168 */
22668/* File: armv5te/alt_stub.S */
22669/*
22670 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22671 * any interesting requests and then jump to the real instruction
22672 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22673 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22674 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22675 * bail to the real handler if breakFlags==0.
22676 */
22677    ldrb   r3, [rSELF, #offThread_breakFlags]
22678    adrl   lr, dvmAsmInstructionStart + (360 * 64)
22679    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22680    cmp    r3, #0
22681    bxeq   lr                   @ nothing to do - jump to real handler
22682    EXPORT_PC()
22683    mov    r0, rPC              @ arg0
22684    mov    r1, rFP              @ arg1
22685    mov    r2, rSELF            @ arg2
22686    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22687
22688/* ------------------------------ */
22689    .balign 64
22690.L_ALT_OP_UNUSED_69FF: /* 0x169 */
22691/* File: armv5te/alt_stub.S */
22692/*
22693 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22694 * any interesting requests and then jump to the real instruction
22695 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22696 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22697 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22698 * bail to the real handler if breakFlags==0.
22699 */
22700    ldrb   r3, [rSELF, #offThread_breakFlags]
22701    adrl   lr, dvmAsmInstructionStart + (361 * 64)
22702    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22703    cmp    r3, #0
22704    bxeq   lr                   @ nothing to do - jump to real handler
22705    EXPORT_PC()
22706    mov    r0, rPC              @ arg0
22707    mov    r1, rFP              @ arg1
22708    mov    r2, rSELF            @ arg2
22709    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22710
22711/* ------------------------------ */
22712    .balign 64
22713.L_ALT_OP_UNUSED_6AFF: /* 0x16a */
22714/* File: armv5te/alt_stub.S */
22715/*
22716 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22717 * any interesting requests and then jump to the real instruction
22718 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22719 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22720 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22721 * bail to the real handler if breakFlags==0.
22722 */
22723    ldrb   r3, [rSELF, #offThread_breakFlags]
22724    adrl   lr, dvmAsmInstructionStart + (362 * 64)
22725    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22726    cmp    r3, #0
22727    bxeq   lr                   @ nothing to do - jump to real handler
22728    EXPORT_PC()
22729    mov    r0, rPC              @ arg0
22730    mov    r1, rFP              @ arg1
22731    mov    r2, rSELF            @ arg2
22732    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22733
22734/* ------------------------------ */
22735    .balign 64
22736.L_ALT_OP_UNUSED_6BFF: /* 0x16b */
22737/* File: armv5te/alt_stub.S */
22738/*
22739 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22740 * any interesting requests and then jump to the real instruction
22741 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22742 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22743 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22744 * bail to the real handler if breakFlags==0.
22745 */
22746    ldrb   r3, [rSELF, #offThread_breakFlags]
22747    adrl   lr, dvmAsmInstructionStart + (363 * 64)
22748    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22749    cmp    r3, #0
22750    bxeq   lr                   @ nothing to do - jump to real handler
22751    EXPORT_PC()
22752    mov    r0, rPC              @ arg0
22753    mov    r1, rFP              @ arg1
22754    mov    r2, rSELF            @ arg2
22755    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22756
22757/* ------------------------------ */
22758    .balign 64
22759.L_ALT_OP_UNUSED_6CFF: /* 0x16c */
22760/* File: armv5te/alt_stub.S */
22761/*
22762 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22763 * any interesting requests and then jump to the real instruction
22764 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22765 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22766 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22767 * bail to the real handler if breakFlags==0.
22768 */
22769    ldrb   r3, [rSELF, #offThread_breakFlags]
22770    adrl   lr, dvmAsmInstructionStart + (364 * 64)
22771    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22772    cmp    r3, #0
22773    bxeq   lr                   @ nothing to do - jump to real handler
22774    EXPORT_PC()
22775    mov    r0, rPC              @ arg0
22776    mov    r1, rFP              @ arg1
22777    mov    r2, rSELF            @ arg2
22778    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22779
22780/* ------------------------------ */
22781    .balign 64
22782.L_ALT_OP_UNUSED_6DFF: /* 0x16d */
22783/* File: armv5te/alt_stub.S */
22784/*
22785 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22786 * any interesting requests and then jump to the real instruction
22787 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22788 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22789 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22790 * bail to the real handler if breakFlags==0.
22791 */
22792    ldrb   r3, [rSELF, #offThread_breakFlags]
22793    adrl   lr, dvmAsmInstructionStart + (365 * 64)
22794    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22795    cmp    r3, #0
22796    bxeq   lr                   @ nothing to do - jump to real handler
22797    EXPORT_PC()
22798    mov    r0, rPC              @ arg0
22799    mov    r1, rFP              @ arg1
22800    mov    r2, rSELF            @ arg2
22801    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22802
22803/* ------------------------------ */
22804    .balign 64
22805.L_ALT_OP_UNUSED_6EFF: /* 0x16e */
22806/* File: armv5te/alt_stub.S */
22807/*
22808 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22809 * any interesting requests and then jump to the real instruction
22810 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22811 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22812 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22813 * bail to the real handler if breakFlags==0.
22814 */
22815    ldrb   r3, [rSELF, #offThread_breakFlags]
22816    adrl   lr, dvmAsmInstructionStart + (366 * 64)
22817    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22818    cmp    r3, #0
22819    bxeq   lr                   @ nothing to do - jump to real handler
22820    EXPORT_PC()
22821    mov    r0, rPC              @ arg0
22822    mov    r1, rFP              @ arg1
22823    mov    r2, rSELF            @ arg2
22824    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22825
22826/* ------------------------------ */
22827    .balign 64
22828.L_ALT_OP_UNUSED_6FFF: /* 0x16f */
22829/* File: armv5te/alt_stub.S */
22830/*
22831 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22832 * any interesting requests and then jump to the real instruction
22833 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22834 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22835 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22836 * bail to the real handler if breakFlags==0.
22837 */
22838    ldrb   r3, [rSELF, #offThread_breakFlags]
22839    adrl   lr, dvmAsmInstructionStart + (367 * 64)
22840    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22841    cmp    r3, #0
22842    bxeq   lr                   @ nothing to do - jump to real handler
22843    EXPORT_PC()
22844    mov    r0, rPC              @ arg0
22845    mov    r1, rFP              @ arg1
22846    mov    r2, rSELF            @ arg2
22847    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22848
22849/* ------------------------------ */
22850    .balign 64
22851.L_ALT_OP_UNUSED_70FF: /* 0x170 */
22852/* File: armv5te/alt_stub.S */
22853/*
22854 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22855 * any interesting requests and then jump to the real instruction
22856 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22857 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22858 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22859 * bail to the real handler if breakFlags==0.
22860 */
22861    ldrb   r3, [rSELF, #offThread_breakFlags]
22862    adrl   lr, dvmAsmInstructionStart + (368 * 64)
22863    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22864    cmp    r3, #0
22865    bxeq   lr                   @ nothing to do - jump to real handler
22866    EXPORT_PC()
22867    mov    r0, rPC              @ arg0
22868    mov    r1, rFP              @ arg1
22869    mov    r2, rSELF            @ arg2
22870    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22871
22872/* ------------------------------ */
22873    .balign 64
22874.L_ALT_OP_UNUSED_71FF: /* 0x171 */
22875/* File: armv5te/alt_stub.S */
22876/*
22877 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22878 * any interesting requests and then jump to the real instruction
22879 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22880 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22881 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22882 * bail to the real handler if breakFlags==0.
22883 */
22884    ldrb   r3, [rSELF, #offThread_breakFlags]
22885    adrl   lr, dvmAsmInstructionStart + (369 * 64)
22886    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22887    cmp    r3, #0
22888    bxeq   lr                   @ nothing to do - jump to real handler
22889    EXPORT_PC()
22890    mov    r0, rPC              @ arg0
22891    mov    r1, rFP              @ arg1
22892    mov    r2, rSELF            @ arg2
22893    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22894
22895/* ------------------------------ */
22896    .balign 64
22897.L_ALT_OP_UNUSED_72FF: /* 0x172 */
22898/* File: armv5te/alt_stub.S */
22899/*
22900 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22901 * any interesting requests and then jump to the real instruction
22902 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22903 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22904 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22905 * bail to the real handler if breakFlags==0.
22906 */
22907    ldrb   r3, [rSELF, #offThread_breakFlags]
22908    adrl   lr, dvmAsmInstructionStart + (370 * 64)
22909    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22910    cmp    r3, #0
22911    bxeq   lr                   @ nothing to do - jump to real handler
22912    EXPORT_PC()
22913    mov    r0, rPC              @ arg0
22914    mov    r1, rFP              @ arg1
22915    mov    r2, rSELF            @ arg2
22916    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22917
22918/* ------------------------------ */
22919    .balign 64
22920.L_ALT_OP_UNUSED_73FF: /* 0x173 */
22921/* File: armv5te/alt_stub.S */
22922/*
22923 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22924 * any interesting requests and then jump to the real instruction
22925 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22926 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22927 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22928 * bail to the real handler if breakFlags==0.
22929 */
22930    ldrb   r3, [rSELF, #offThread_breakFlags]
22931    adrl   lr, dvmAsmInstructionStart + (371 * 64)
22932    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22933    cmp    r3, #0
22934    bxeq   lr                   @ nothing to do - jump to real handler
22935    EXPORT_PC()
22936    mov    r0, rPC              @ arg0
22937    mov    r1, rFP              @ arg1
22938    mov    r2, rSELF            @ arg2
22939    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22940
22941/* ------------------------------ */
22942    .balign 64
22943.L_ALT_OP_UNUSED_74FF: /* 0x174 */
22944/* File: armv5te/alt_stub.S */
22945/*
22946 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22947 * any interesting requests and then jump to the real instruction
22948 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22949 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22950 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22951 * bail to the real handler if breakFlags==0.
22952 */
22953    ldrb   r3, [rSELF, #offThread_breakFlags]
22954    adrl   lr, dvmAsmInstructionStart + (372 * 64)
22955    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22956    cmp    r3, #0
22957    bxeq   lr                   @ nothing to do - jump to real handler
22958    EXPORT_PC()
22959    mov    r0, rPC              @ arg0
22960    mov    r1, rFP              @ arg1
22961    mov    r2, rSELF            @ arg2
22962    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22963
22964/* ------------------------------ */
22965    .balign 64
22966.L_ALT_OP_UNUSED_75FF: /* 0x175 */
22967/* File: armv5te/alt_stub.S */
22968/*
22969 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22970 * any interesting requests and then jump to the real instruction
22971 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22972 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22973 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22974 * bail to the real handler if breakFlags==0.
22975 */
22976    ldrb   r3, [rSELF, #offThread_breakFlags]
22977    adrl   lr, dvmAsmInstructionStart + (373 * 64)
22978    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22979    cmp    r3, #0
22980    bxeq   lr                   @ nothing to do - jump to real handler
22981    EXPORT_PC()
22982    mov    r0, rPC              @ arg0
22983    mov    r1, rFP              @ arg1
22984    mov    r2, rSELF            @ arg2
22985    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22986
22987/* ------------------------------ */
22988    .balign 64
22989.L_ALT_OP_UNUSED_76FF: /* 0x176 */
22990/* File: armv5te/alt_stub.S */
22991/*
22992 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22993 * any interesting requests and then jump to the real instruction
22994 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22995 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22996 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22997 * bail to the real handler if breakFlags==0.
22998 */
22999    ldrb   r3, [rSELF, #offThread_breakFlags]
23000    adrl   lr, dvmAsmInstructionStart + (374 * 64)
23001    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23002    cmp    r3, #0
23003    bxeq   lr                   @ nothing to do - jump to real handler
23004    EXPORT_PC()
23005    mov    r0, rPC              @ arg0
23006    mov    r1, rFP              @ arg1
23007    mov    r2, rSELF            @ arg2
23008    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23009
23010/* ------------------------------ */
23011    .balign 64
23012.L_ALT_OP_UNUSED_77FF: /* 0x177 */
23013/* File: armv5te/alt_stub.S */
23014/*
23015 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23016 * any interesting requests and then jump to the real instruction
23017 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23018 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23019 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23020 * bail to the real handler if breakFlags==0.
23021 */
23022    ldrb   r3, [rSELF, #offThread_breakFlags]
23023    adrl   lr, dvmAsmInstructionStart + (375 * 64)
23024    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23025    cmp    r3, #0
23026    bxeq   lr                   @ nothing to do - jump to real handler
23027    EXPORT_PC()
23028    mov    r0, rPC              @ arg0
23029    mov    r1, rFP              @ arg1
23030    mov    r2, rSELF            @ arg2
23031    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23032
23033/* ------------------------------ */
23034    .balign 64
23035.L_ALT_OP_UNUSED_78FF: /* 0x178 */
23036/* File: armv5te/alt_stub.S */
23037/*
23038 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23039 * any interesting requests and then jump to the real instruction
23040 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23041 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23042 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23043 * bail to the real handler if breakFlags==0.
23044 */
23045    ldrb   r3, [rSELF, #offThread_breakFlags]
23046    adrl   lr, dvmAsmInstructionStart + (376 * 64)
23047    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23048    cmp    r3, #0
23049    bxeq   lr                   @ nothing to do - jump to real handler
23050    EXPORT_PC()
23051    mov    r0, rPC              @ arg0
23052    mov    r1, rFP              @ arg1
23053    mov    r2, rSELF            @ arg2
23054    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23055
23056/* ------------------------------ */
23057    .balign 64
23058.L_ALT_OP_UNUSED_79FF: /* 0x179 */
23059/* File: armv5te/alt_stub.S */
23060/*
23061 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23062 * any interesting requests and then jump to the real instruction
23063 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23064 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23065 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23066 * bail to the real handler if breakFlags==0.
23067 */
23068    ldrb   r3, [rSELF, #offThread_breakFlags]
23069    adrl   lr, dvmAsmInstructionStart + (377 * 64)
23070    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23071    cmp    r3, #0
23072    bxeq   lr                   @ nothing to do - jump to real handler
23073    EXPORT_PC()
23074    mov    r0, rPC              @ arg0
23075    mov    r1, rFP              @ arg1
23076    mov    r2, rSELF            @ arg2
23077    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23078
23079/* ------------------------------ */
23080    .balign 64
23081.L_ALT_OP_UNUSED_7AFF: /* 0x17a */
23082/* File: armv5te/alt_stub.S */
23083/*
23084 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23085 * any interesting requests and then jump to the real instruction
23086 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23087 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23088 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23089 * bail to the real handler if breakFlags==0.
23090 */
23091    ldrb   r3, [rSELF, #offThread_breakFlags]
23092    adrl   lr, dvmAsmInstructionStart + (378 * 64)
23093    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23094    cmp    r3, #0
23095    bxeq   lr                   @ nothing to do - jump to real handler
23096    EXPORT_PC()
23097    mov    r0, rPC              @ arg0
23098    mov    r1, rFP              @ arg1
23099    mov    r2, rSELF            @ arg2
23100    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23101
23102/* ------------------------------ */
23103    .balign 64
23104.L_ALT_OP_UNUSED_7BFF: /* 0x17b */
23105/* File: armv5te/alt_stub.S */
23106/*
23107 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23108 * any interesting requests and then jump to the real instruction
23109 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23110 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23111 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23112 * bail to the real handler if breakFlags==0.
23113 */
23114    ldrb   r3, [rSELF, #offThread_breakFlags]
23115    adrl   lr, dvmAsmInstructionStart + (379 * 64)
23116    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23117    cmp    r3, #0
23118    bxeq   lr                   @ nothing to do - jump to real handler
23119    EXPORT_PC()
23120    mov    r0, rPC              @ arg0
23121    mov    r1, rFP              @ arg1
23122    mov    r2, rSELF            @ arg2
23123    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23124
23125/* ------------------------------ */
23126    .balign 64
23127.L_ALT_OP_UNUSED_7CFF: /* 0x17c */
23128/* File: armv5te/alt_stub.S */
23129/*
23130 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23131 * any interesting requests and then jump to the real instruction
23132 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23133 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23134 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23135 * bail to the real handler if breakFlags==0.
23136 */
23137    ldrb   r3, [rSELF, #offThread_breakFlags]
23138    adrl   lr, dvmAsmInstructionStart + (380 * 64)
23139    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23140    cmp    r3, #0
23141    bxeq   lr                   @ nothing to do - jump to real handler
23142    EXPORT_PC()
23143    mov    r0, rPC              @ arg0
23144    mov    r1, rFP              @ arg1
23145    mov    r2, rSELF            @ arg2
23146    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23147
23148/* ------------------------------ */
23149    .balign 64
23150.L_ALT_OP_UNUSED_7DFF: /* 0x17d */
23151/* File: armv5te/alt_stub.S */
23152/*
23153 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23154 * any interesting requests and then jump to the real instruction
23155 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23156 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23157 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23158 * bail to the real handler if breakFlags==0.
23159 */
23160    ldrb   r3, [rSELF, #offThread_breakFlags]
23161    adrl   lr, dvmAsmInstructionStart + (381 * 64)
23162    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23163    cmp    r3, #0
23164    bxeq   lr                   @ nothing to do - jump to real handler
23165    EXPORT_PC()
23166    mov    r0, rPC              @ arg0
23167    mov    r1, rFP              @ arg1
23168    mov    r2, rSELF            @ arg2
23169    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23170
23171/* ------------------------------ */
23172    .balign 64
23173.L_ALT_OP_UNUSED_7EFF: /* 0x17e */
23174/* File: armv5te/alt_stub.S */
23175/*
23176 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23177 * any interesting requests and then jump to the real instruction
23178 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23179 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23180 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23181 * bail to the real handler if breakFlags==0.
23182 */
23183    ldrb   r3, [rSELF, #offThread_breakFlags]
23184    adrl   lr, dvmAsmInstructionStart + (382 * 64)
23185    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23186    cmp    r3, #0
23187    bxeq   lr                   @ nothing to do - jump to real handler
23188    EXPORT_PC()
23189    mov    r0, rPC              @ arg0
23190    mov    r1, rFP              @ arg1
23191    mov    r2, rSELF            @ arg2
23192    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23193
23194/* ------------------------------ */
23195    .balign 64
23196.L_ALT_OP_UNUSED_7FFF: /* 0x17f */
23197/* File: armv5te/alt_stub.S */
23198/*
23199 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23200 * any interesting requests and then jump to the real instruction
23201 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23202 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23203 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23204 * bail to the real handler if breakFlags==0.
23205 */
23206    ldrb   r3, [rSELF, #offThread_breakFlags]
23207    adrl   lr, dvmAsmInstructionStart + (383 * 64)
23208    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23209    cmp    r3, #0
23210    bxeq   lr                   @ nothing to do - jump to real handler
23211    EXPORT_PC()
23212    mov    r0, rPC              @ arg0
23213    mov    r1, rFP              @ arg1
23214    mov    r2, rSELF            @ arg2
23215    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23216
23217/* ------------------------------ */
23218    .balign 64
23219.L_ALT_OP_UNUSED_80FF: /* 0x180 */
23220/* File: armv5te/alt_stub.S */
23221/*
23222 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23223 * any interesting requests and then jump to the real instruction
23224 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23225 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23226 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23227 * bail to the real handler if breakFlags==0.
23228 */
23229    ldrb   r3, [rSELF, #offThread_breakFlags]
23230    adrl   lr, dvmAsmInstructionStart + (384 * 64)
23231    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23232    cmp    r3, #0
23233    bxeq   lr                   @ nothing to do - jump to real handler
23234    EXPORT_PC()
23235    mov    r0, rPC              @ arg0
23236    mov    r1, rFP              @ arg1
23237    mov    r2, rSELF            @ arg2
23238    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23239
23240/* ------------------------------ */
23241    .balign 64
23242.L_ALT_OP_UNUSED_81FF: /* 0x181 */
23243/* File: armv5te/alt_stub.S */
23244/*
23245 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23246 * any interesting requests and then jump to the real instruction
23247 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23248 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23249 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23250 * bail to the real handler if breakFlags==0.
23251 */
23252    ldrb   r3, [rSELF, #offThread_breakFlags]
23253    adrl   lr, dvmAsmInstructionStart + (385 * 64)
23254    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23255    cmp    r3, #0
23256    bxeq   lr                   @ nothing to do - jump to real handler
23257    EXPORT_PC()
23258    mov    r0, rPC              @ arg0
23259    mov    r1, rFP              @ arg1
23260    mov    r2, rSELF            @ arg2
23261    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23262
23263/* ------------------------------ */
23264    .balign 64
23265.L_ALT_OP_UNUSED_82FF: /* 0x182 */
23266/* File: armv5te/alt_stub.S */
23267/*
23268 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23269 * any interesting requests and then jump to the real instruction
23270 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23271 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23272 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23273 * bail to the real handler if breakFlags==0.
23274 */
23275    ldrb   r3, [rSELF, #offThread_breakFlags]
23276    adrl   lr, dvmAsmInstructionStart + (386 * 64)
23277    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23278    cmp    r3, #0
23279    bxeq   lr                   @ nothing to do - jump to real handler
23280    EXPORT_PC()
23281    mov    r0, rPC              @ arg0
23282    mov    r1, rFP              @ arg1
23283    mov    r2, rSELF            @ arg2
23284    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23285
23286/* ------------------------------ */
23287    .balign 64
23288.L_ALT_OP_UNUSED_83FF: /* 0x183 */
23289/* File: armv5te/alt_stub.S */
23290/*
23291 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23292 * any interesting requests and then jump to the real instruction
23293 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23294 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23295 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23296 * bail to the real handler if breakFlags==0.
23297 */
23298    ldrb   r3, [rSELF, #offThread_breakFlags]
23299    adrl   lr, dvmAsmInstructionStart + (387 * 64)
23300    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23301    cmp    r3, #0
23302    bxeq   lr                   @ nothing to do - jump to real handler
23303    EXPORT_PC()
23304    mov    r0, rPC              @ arg0
23305    mov    r1, rFP              @ arg1
23306    mov    r2, rSELF            @ arg2
23307    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23308
23309/* ------------------------------ */
23310    .balign 64
23311.L_ALT_OP_UNUSED_84FF: /* 0x184 */
23312/* File: armv5te/alt_stub.S */
23313/*
23314 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23315 * any interesting requests and then jump to the real instruction
23316 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23317 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23318 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23319 * bail to the real handler if breakFlags==0.
23320 */
23321    ldrb   r3, [rSELF, #offThread_breakFlags]
23322    adrl   lr, dvmAsmInstructionStart + (388 * 64)
23323    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23324    cmp    r3, #0
23325    bxeq   lr                   @ nothing to do - jump to real handler
23326    EXPORT_PC()
23327    mov    r0, rPC              @ arg0
23328    mov    r1, rFP              @ arg1
23329    mov    r2, rSELF            @ arg2
23330    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23331
23332/* ------------------------------ */
23333    .balign 64
23334.L_ALT_OP_UNUSED_85FF: /* 0x185 */
23335/* File: armv5te/alt_stub.S */
23336/*
23337 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23338 * any interesting requests and then jump to the real instruction
23339 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23340 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23341 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23342 * bail to the real handler if breakFlags==0.
23343 */
23344    ldrb   r3, [rSELF, #offThread_breakFlags]
23345    adrl   lr, dvmAsmInstructionStart + (389 * 64)
23346    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23347    cmp    r3, #0
23348    bxeq   lr                   @ nothing to do - jump to real handler
23349    EXPORT_PC()
23350    mov    r0, rPC              @ arg0
23351    mov    r1, rFP              @ arg1
23352    mov    r2, rSELF            @ arg2
23353    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23354
23355/* ------------------------------ */
23356    .balign 64
23357.L_ALT_OP_UNUSED_86FF: /* 0x186 */
23358/* File: armv5te/alt_stub.S */
23359/*
23360 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23361 * any interesting requests and then jump to the real instruction
23362 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23363 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23364 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23365 * bail to the real handler if breakFlags==0.
23366 */
23367    ldrb   r3, [rSELF, #offThread_breakFlags]
23368    adrl   lr, dvmAsmInstructionStart + (390 * 64)
23369    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23370    cmp    r3, #0
23371    bxeq   lr                   @ nothing to do - jump to real handler
23372    EXPORT_PC()
23373    mov    r0, rPC              @ arg0
23374    mov    r1, rFP              @ arg1
23375    mov    r2, rSELF            @ arg2
23376    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23377
23378/* ------------------------------ */
23379    .balign 64
23380.L_ALT_OP_UNUSED_87FF: /* 0x187 */
23381/* File: armv5te/alt_stub.S */
23382/*
23383 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23384 * any interesting requests and then jump to the real instruction
23385 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23386 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23387 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23388 * bail to the real handler if breakFlags==0.
23389 */
23390    ldrb   r3, [rSELF, #offThread_breakFlags]
23391    adrl   lr, dvmAsmInstructionStart + (391 * 64)
23392    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23393    cmp    r3, #0
23394    bxeq   lr                   @ nothing to do - jump to real handler
23395    EXPORT_PC()
23396    mov    r0, rPC              @ arg0
23397    mov    r1, rFP              @ arg1
23398    mov    r2, rSELF            @ arg2
23399    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23400
23401/* ------------------------------ */
23402    .balign 64
23403.L_ALT_OP_UNUSED_88FF: /* 0x188 */
23404/* File: armv5te/alt_stub.S */
23405/*
23406 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23407 * any interesting requests and then jump to the real instruction
23408 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23409 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23410 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23411 * bail to the real handler if breakFlags==0.
23412 */
23413    ldrb   r3, [rSELF, #offThread_breakFlags]
23414    adrl   lr, dvmAsmInstructionStart + (392 * 64)
23415    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23416    cmp    r3, #0
23417    bxeq   lr                   @ nothing to do - jump to real handler
23418    EXPORT_PC()
23419    mov    r0, rPC              @ arg0
23420    mov    r1, rFP              @ arg1
23421    mov    r2, rSELF            @ arg2
23422    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23423
23424/* ------------------------------ */
23425    .balign 64
23426.L_ALT_OP_UNUSED_89FF: /* 0x189 */
23427/* File: armv5te/alt_stub.S */
23428/*
23429 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23430 * any interesting requests and then jump to the real instruction
23431 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23432 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23433 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23434 * bail to the real handler if breakFlags==0.
23435 */
23436    ldrb   r3, [rSELF, #offThread_breakFlags]
23437    adrl   lr, dvmAsmInstructionStart + (393 * 64)
23438    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23439    cmp    r3, #0
23440    bxeq   lr                   @ nothing to do - jump to real handler
23441    EXPORT_PC()
23442    mov    r0, rPC              @ arg0
23443    mov    r1, rFP              @ arg1
23444    mov    r2, rSELF            @ arg2
23445    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23446
23447/* ------------------------------ */
23448    .balign 64
23449.L_ALT_OP_UNUSED_8AFF: /* 0x18a */
23450/* File: armv5te/alt_stub.S */
23451/*
23452 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23453 * any interesting requests and then jump to the real instruction
23454 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23455 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23456 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23457 * bail to the real handler if breakFlags==0.
23458 */
23459    ldrb   r3, [rSELF, #offThread_breakFlags]
23460    adrl   lr, dvmAsmInstructionStart + (394 * 64)
23461    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23462    cmp    r3, #0
23463    bxeq   lr                   @ nothing to do - jump to real handler
23464    EXPORT_PC()
23465    mov    r0, rPC              @ arg0
23466    mov    r1, rFP              @ arg1
23467    mov    r2, rSELF            @ arg2
23468    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23469
23470/* ------------------------------ */
23471    .balign 64
23472.L_ALT_OP_UNUSED_8BFF: /* 0x18b */
23473/* File: armv5te/alt_stub.S */
23474/*
23475 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23476 * any interesting requests and then jump to the real instruction
23477 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23478 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23479 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23480 * bail to the real handler if breakFlags==0.
23481 */
23482    ldrb   r3, [rSELF, #offThread_breakFlags]
23483    adrl   lr, dvmAsmInstructionStart + (395 * 64)
23484    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23485    cmp    r3, #0
23486    bxeq   lr                   @ nothing to do - jump to real handler
23487    EXPORT_PC()
23488    mov    r0, rPC              @ arg0
23489    mov    r1, rFP              @ arg1
23490    mov    r2, rSELF            @ arg2
23491    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23492
23493/* ------------------------------ */
23494    .balign 64
23495.L_ALT_OP_UNUSED_8CFF: /* 0x18c */
23496/* File: armv5te/alt_stub.S */
23497/*
23498 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23499 * any interesting requests and then jump to the real instruction
23500 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23501 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23502 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23503 * bail to the real handler if breakFlags==0.
23504 */
23505    ldrb   r3, [rSELF, #offThread_breakFlags]
23506    adrl   lr, dvmAsmInstructionStart + (396 * 64)
23507    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23508    cmp    r3, #0
23509    bxeq   lr                   @ nothing to do - jump to real handler
23510    EXPORT_PC()
23511    mov    r0, rPC              @ arg0
23512    mov    r1, rFP              @ arg1
23513    mov    r2, rSELF            @ arg2
23514    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23515
23516/* ------------------------------ */
23517    .balign 64
23518.L_ALT_OP_UNUSED_8DFF: /* 0x18d */
23519/* File: armv5te/alt_stub.S */
23520/*
23521 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23522 * any interesting requests and then jump to the real instruction
23523 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23524 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23525 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23526 * bail to the real handler if breakFlags==0.
23527 */
23528    ldrb   r3, [rSELF, #offThread_breakFlags]
23529    adrl   lr, dvmAsmInstructionStart + (397 * 64)
23530    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23531    cmp    r3, #0
23532    bxeq   lr                   @ nothing to do - jump to real handler
23533    EXPORT_PC()
23534    mov    r0, rPC              @ arg0
23535    mov    r1, rFP              @ arg1
23536    mov    r2, rSELF            @ arg2
23537    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23538
23539/* ------------------------------ */
23540    .balign 64
23541.L_ALT_OP_UNUSED_8EFF: /* 0x18e */
23542/* File: armv5te/alt_stub.S */
23543/*
23544 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23545 * any interesting requests and then jump to the real instruction
23546 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23547 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23548 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23549 * bail to the real handler if breakFlags==0.
23550 */
23551    ldrb   r3, [rSELF, #offThread_breakFlags]
23552    adrl   lr, dvmAsmInstructionStart + (398 * 64)
23553    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23554    cmp    r3, #0
23555    bxeq   lr                   @ nothing to do - jump to real handler
23556    EXPORT_PC()
23557    mov    r0, rPC              @ arg0
23558    mov    r1, rFP              @ arg1
23559    mov    r2, rSELF            @ arg2
23560    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23561
23562/* ------------------------------ */
23563    .balign 64
23564.L_ALT_OP_UNUSED_8FFF: /* 0x18f */
23565/* File: armv5te/alt_stub.S */
23566/*
23567 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23568 * any interesting requests and then jump to the real instruction
23569 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23570 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23571 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23572 * bail to the real handler if breakFlags==0.
23573 */
23574    ldrb   r3, [rSELF, #offThread_breakFlags]
23575    adrl   lr, dvmAsmInstructionStart + (399 * 64)
23576    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23577    cmp    r3, #0
23578    bxeq   lr                   @ nothing to do - jump to real handler
23579    EXPORT_PC()
23580    mov    r0, rPC              @ arg0
23581    mov    r1, rFP              @ arg1
23582    mov    r2, rSELF            @ arg2
23583    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23584
23585/* ------------------------------ */
23586    .balign 64
23587.L_ALT_OP_UNUSED_90FF: /* 0x190 */
23588/* File: armv5te/alt_stub.S */
23589/*
23590 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23591 * any interesting requests and then jump to the real instruction
23592 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23593 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23594 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23595 * bail to the real handler if breakFlags==0.
23596 */
23597    ldrb   r3, [rSELF, #offThread_breakFlags]
23598    adrl   lr, dvmAsmInstructionStart + (400 * 64)
23599    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23600    cmp    r3, #0
23601    bxeq   lr                   @ nothing to do - jump to real handler
23602    EXPORT_PC()
23603    mov    r0, rPC              @ arg0
23604    mov    r1, rFP              @ arg1
23605    mov    r2, rSELF            @ arg2
23606    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23607
23608/* ------------------------------ */
23609    .balign 64
23610.L_ALT_OP_UNUSED_91FF: /* 0x191 */
23611/* File: armv5te/alt_stub.S */
23612/*
23613 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23614 * any interesting requests and then jump to the real instruction
23615 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23616 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23617 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23618 * bail to the real handler if breakFlags==0.
23619 */
23620    ldrb   r3, [rSELF, #offThread_breakFlags]
23621    adrl   lr, dvmAsmInstructionStart + (401 * 64)
23622    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23623    cmp    r3, #0
23624    bxeq   lr                   @ nothing to do - jump to real handler
23625    EXPORT_PC()
23626    mov    r0, rPC              @ arg0
23627    mov    r1, rFP              @ arg1
23628    mov    r2, rSELF            @ arg2
23629    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23630
23631/* ------------------------------ */
23632    .balign 64
23633.L_ALT_OP_UNUSED_92FF: /* 0x192 */
23634/* File: armv5te/alt_stub.S */
23635/*
23636 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23637 * any interesting requests and then jump to the real instruction
23638 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23639 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23640 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23641 * bail to the real handler if breakFlags==0.
23642 */
23643    ldrb   r3, [rSELF, #offThread_breakFlags]
23644    adrl   lr, dvmAsmInstructionStart + (402 * 64)
23645    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23646    cmp    r3, #0
23647    bxeq   lr                   @ nothing to do - jump to real handler
23648    EXPORT_PC()
23649    mov    r0, rPC              @ arg0
23650    mov    r1, rFP              @ arg1
23651    mov    r2, rSELF            @ arg2
23652    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23653
23654/* ------------------------------ */
23655    .balign 64
23656.L_ALT_OP_UNUSED_93FF: /* 0x193 */
23657/* File: armv5te/alt_stub.S */
23658/*
23659 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23660 * any interesting requests and then jump to the real instruction
23661 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23662 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23663 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23664 * bail to the real handler if breakFlags==0.
23665 */
23666    ldrb   r3, [rSELF, #offThread_breakFlags]
23667    adrl   lr, dvmAsmInstructionStart + (403 * 64)
23668    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23669    cmp    r3, #0
23670    bxeq   lr                   @ nothing to do - jump to real handler
23671    EXPORT_PC()
23672    mov    r0, rPC              @ arg0
23673    mov    r1, rFP              @ arg1
23674    mov    r2, rSELF            @ arg2
23675    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23676
23677/* ------------------------------ */
23678    .balign 64
23679.L_ALT_OP_UNUSED_94FF: /* 0x194 */
23680/* File: armv5te/alt_stub.S */
23681/*
23682 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23683 * any interesting requests and then jump to the real instruction
23684 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23685 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23686 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23687 * bail to the real handler if breakFlags==0.
23688 */
23689    ldrb   r3, [rSELF, #offThread_breakFlags]
23690    adrl   lr, dvmAsmInstructionStart + (404 * 64)
23691    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23692    cmp    r3, #0
23693    bxeq   lr                   @ nothing to do - jump to real handler
23694    EXPORT_PC()
23695    mov    r0, rPC              @ arg0
23696    mov    r1, rFP              @ arg1
23697    mov    r2, rSELF            @ arg2
23698    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23699
23700/* ------------------------------ */
23701    .balign 64
23702.L_ALT_OP_UNUSED_95FF: /* 0x195 */
23703/* File: armv5te/alt_stub.S */
23704/*
23705 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23706 * any interesting requests and then jump to the real instruction
23707 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23708 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23709 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23710 * bail to the real handler if breakFlags==0.
23711 */
23712    ldrb   r3, [rSELF, #offThread_breakFlags]
23713    adrl   lr, dvmAsmInstructionStart + (405 * 64)
23714    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23715    cmp    r3, #0
23716    bxeq   lr                   @ nothing to do - jump to real handler
23717    EXPORT_PC()
23718    mov    r0, rPC              @ arg0
23719    mov    r1, rFP              @ arg1
23720    mov    r2, rSELF            @ arg2
23721    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23722
23723/* ------------------------------ */
23724    .balign 64
23725.L_ALT_OP_UNUSED_96FF: /* 0x196 */
23726/* File: armv5te/alt_stub.S */
23727/*
23728 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23729 * any interesting requests and then jump to the real instruction
23730 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23731 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23732 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23733 * bail to the real handler if breakFlags==0.
23734 */
23735    ldrb   r3, [rSELF, #offThread_breakFlags]
23736    adrl   lr, dvmAsmInstructionStart + (406 * 64)
23737    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23738    cmp    r3, #0
23739    bxeq   lr                   @ nothing to do - jump to real handler
23740    EXPORT_PC()
23741    mov    r0, rPC              @ arg0
23742    mov    r1, rFP              @ arg1
23743    mov    r2, rSELF            @ arg2
23744    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23745
23746/* ------------------------------ */
23747    .balign 64
23748.L_ALT_OP_UNUSED_97FF: /* 0x197 */
23749/* File: armv5te/alt_stub.S */
23750/*
23751 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23752 * any interesting requests and then jump to the real instruction
23753 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23754 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23755 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23756 * bail to the real handler if breakFlags==0.
23757 */
23758    ldrb   r3, [rSELF, #offThread_breakFlags]
23759    adrl   lr, dvmAsmInstructionStart + (407 * 64)
23760    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23761    cmp    r3, #0
23762    bxeq   lr                   @ nothing to do - jump to real handler
23763    EXPORT_PC()
23764    mov    r0, rPC              @ arg0
23765    mov    r1, rFP              @ arg1
23766    mov    r2, rSELF            @ arg2
23767    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23768
23769/* ------------------------------ */
23770    .balign 64
23771.L_ALT_OP_UNUSED_98FF: /* 0x198 */
23772/* File: armv5te/alt_stub.S */
23773/*
23774 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23775 * any interesting requests and then jump to the real instruction
23776 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23777 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23778 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23779 * bail to the real handler if breakFlags==0.
23780 */
23781    ldrb   r3, [rSELF, #offThread_breakFlags]
23782    adrl   lr, dvmAsmInstructionStart + (408 * 64)
23783    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23784    cmp    r3, #0
23785    bxeq   lr                   @ nothing to do - jump to real handler
23786    EXPORT_PC()
23787    mov    r0, rPC              @ arg0
23788    mov    r1, rFP              @ arg1
23789    mov    r2, rSELF            @ arg2
23790    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23791
23792/* ------------------------------ */
23793    .balign 64
23794.L_ALT_OP_UNUSED_99FF: /* 0x199 */
23795/* File: armv5te/alt_stub.S */
23796/*
23797 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23798 * any interesting requests and then jump to the real instruction
23799 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23800 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23801 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23802 * bail to the real handler if breakFlags==0.
23803 */
23804    ldrb   r3, [rSELF, #offThread_breakFlags]
23805    adrl   lr, dvmAsmInstructionStart + (409 * 64)
23806    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23807    cmp    r3, #0
23808    bxeq   lr                   @ nothing to do - jump to real handler
23809    EXPORT_PC()
23810    mov    r0, rPC              @ arg0
23811    mov    r1, rFP              @ arg1
23812    mov    r2, rSELF            @ arg2
23813    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23814
23815/* ------------------------------ */
23816    .balign 64
23817.L_ALT_OP_UNUSED_9AFF: /* 0x19a */
23818/* File: armv5te/alt_stub.S */
23819/*
23820 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23821 * any interesting requests and then jump to the real instruction
23822 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23823 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23824 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23825 * bail to the real handler if breakFlags==0.
23826 */
23827    ldrb   r3, [rSELF, #offThread_breakFlags]
23828    adrl   lr, dvmAsmInstructionStart + (410 * 64)
23829    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23830    cmp    r3, #0
23831    bxeq   lr                   @ nothing to do - jump to real handler
23832    EXPORT_PC()
23833    mov    r0, rPC              @ arg0
23834    mov    r1, rFP              @ arg1
23835    mov    r2, rSELF            @ arg2
23836    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23837
23838/* ------------------------------ */
23839    .balign 64
23840.L_ALT_OP_UNUSED_9BFF: /* 0x19b */
23841/* File: armv5te/alt_stub.S */
23842/*
23843 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23844 * any interesting requests and then jump to the real instruction
23845 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23846 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23847 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23848 * bail to the real handler if breakFlags==0.
23849 */
23850    ldrb   r3, [rSELF, #offThread_breakFlags]
23851    adrl   lr, dvmAsmInstructionStart + (411 * 64)
23852    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23853    cmp    r3, #0
23854    bxeq   lr                   @ nothing to do - jump to real handler
23855    EXPORT_PC()
23856    mov    r0, rPC              @ arg0
23857    mov    r1, rFP              @ arg1
23858    mov    r2, rSELF            @ arg2
23859    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23860
23861/* ------------------------------ */
23862    .balign 64
23863.L_ALT_OP_UNUSED_9CFF: /* 0x19c */
23864/* File: armv5te/alt_stub.S */
23865/*
23866 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23867 * any interesting requests and then jump to the real instruction
23868 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23869 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23870 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23871 * bail to the real handler if breakFlags==0.
23872 */
23873    ldrb   r3, [rSELF, #offThread_breakFlags]
23874    adrl   lr, dvmAsmInstructionStart + (412 * 64)
23875    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23876    cmp    r3, #0
23877    bxeq   lr                   @ nothing to do - jump to real handler
23878    EXPORT_PC()
23879    mov    r0, rPC              @ arg0
23880    mov    r1, rFP              @ arg1
23881    mov    r2, rSELF            @ arg2
23882    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23883
23884/* ------------------------------ */
23885    .balign 64
23886.L_ALT_OP_UNUSED_9DFF: /* 0x19d */
23887/* File: armv5te/alt_stub.S */
23888/*
23889 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23890 * any interesting requests and then jump to the real instruction
23891 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23892 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23893 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23894 * bail to the real handler if breakFlags==0.
23895 */
23896    ldrb   r3, [rSELF, #offThread_breakFlags]
23897    adrl   lr, dvmAsmInstructionStart + (413 * 64)
23898    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23899    cmp    r3, #0
23900    bxeq   lr                   @ nothing to do - jump to real handler
23901    EXPORT_PC()
23902    mov    r0, rPC              @ arg0
23903    mov    r1, rFP              @ arg1
23904    mov    r2, rSELF            @ arg2
23905    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23906
23907/* ------------------------------ */
23908    .balign 64
23909.L_ALT_OP_UNUSED_9EFF: /* 0x19e */
23910/* File: armv5te/alt_stub.S */
23911/*
23912 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23913 * any interesting requests and then jump to the real instruction
23914 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23915 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23916 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23917 * bail to the real handler if breakFlags==0.
23918 */
23919    ldrb   r3, [rSELF, #offThread_breakFlags]
23920    adrl   lr, dvmAsmInstructionStart + (414 * 64)
23921    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23922    cmp    r3, #0
23923    bxeq   lr                   @ nothing to do - jump to real handler
23924    EXPORT_PC()
23925    mov    r0, rPC              @ arg0
23926    mov    r1, rFP              @ arg1
23927    mov    r2, rSELF            @ arg2
23928    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23929
23930/* ------------------------------ */
23931    .balign 64
23932.L_ALT_OP_UNUSED_9FFF: /* 0x19f */
23933/* File: armv5te/alt_stub.S */
23934/*
23935 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23936 * any interesting requests and then jump to the real instruction
23937 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23938 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23939 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23940 * bail to the real handler if breakFlags==0.
23941 */
23942    ldrb   r3, [rSELF, #offThread_breakFlags]
23943    adrl   lr, dvmAsmInstructionStart + (415 * 64)
23944    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23945    cmp    r3, #0
23946    bxeq   lr                   @ nothing to do - jump to real handler
23947    EXPORT_PC()
23948    mov    r0, rPC              @ arg0
23949    mov    r1, rFP              @ arg1
23950    mov    r2, rSELF            @ arg2
23951    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23952
23953/* ------------------------------ */
23954    .balign 64
23955.L_ALT_OP_UNUSED_A0FF: /* 0x1a0 */
23956/* File: armv5te/alt_stub.S */
23957/*
23958 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23959 * any interesting requests and then jump to the real instruction
23960 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23961 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23962 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23963 * bail to the real handler if breakFlags==0.
23964 */
23965    ldrb   r3, [rSELF, #offThread_breakFlags]
23966    adrl   lr, dvmAsmInstructionStart + (416 * 64)
23967    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23968    cmp    r3, #0
23969    bxeq   lr                   @ nothing to do - jump to real handler
23970    EXPORT_PC()
23971    mov    r0, rPC              @ arg0
23972    mov    r1, rFP              @ arg1
23973    mov    r2, rSELF            @ arg2
23974    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23975
23976/* ------------------------------ */
23977    .balign 64
23978.L_ALT_OP_UNUSED_A1FF: /* 0x1a1 */
23979/* File: armv5te/alt_stub.S */
23980/*
23981 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23982 * any interesting requests and then jump to the real instruction
23983 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23984 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23985 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23986 * bail to the real handler if breakFlags==0.
23987 */
23988    ldrb   r3, [rSELF, #offThread_breakFlags]
23989    adrl   lr, dvmAsmInstructionStart + (417 * 64)
23990    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23991    cmp    r3, #0
23992    bxeq   lr                   @ nothing to do - jump to real handler
23993    EXPORT_PC()
23994    mov    r0, rPC              @ arg0
23995    mov    r1, rFP              @ arg1
23996    mov    r2, rSELF            @ arg2
23997    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23998
23999/* ------------------------------ */
24000    .balign 64
24001.L_ALT_OP_UNUSED_A2FF: /* 0x1a2 */
24002/* File: armv5te/alt_stub.S */
24003/*
24004 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24005 * any interesting requests and then jump to the real instruction
24006 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24007 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24008 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24009 * bail to the real handler if breakFlags==0.
24010 */
24011    ldrb   r3, [rSELF, #offThread_breakFlags]
24012    adrl   lr, dvmAsmInstructionStart + (418 * 64)
24013    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24014    cmp    r3, #0
24015    bxeq   lr                   @ nothing to do - jump to real handler
24016    EXPORT_PC()
24017    mov    r0, rPC              @ arg0
24018    mov    r1, rFP              @ arg1
24019    mov    r2, rSELF            @ arg2
24020    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24021
24022/* ------------------------------ */
24023    .balign 64
24024.L_ALT_OP_UNUSED_A3FF: /* 0x1a3 */
24025/* File: armv5te/alt_stub.S */
24026/*
24027 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24028 * any interesting requests and then jump to the real instruction
24029 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24030 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24031 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24032 * bail to the real handler if breakFlags==0.
24033 */
24034    ldrb   r3, [rSELF, #offThread_breakFlags]
24035    adrl   lr, dvmAsmInstructionStart + (419 * 64)
24036    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24037    cmp    r3, #0
24038    bxeq   lr                   @ nothing to do - jump to real handler
24039    EXPORT_PC()
24040    mov    r0, rPC              @ arg0
24041    mov    r1, rFP              @ arg1
24042    mov    r2, rSELF            @ arg2
24043    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24044
24045/* ------------------------------ */
24046    .balign 64
24047.L_ALT_OP_UNUSED_A4FF: /* 0x1a4 */
24048/* File: armv5te/alt_stub.S */
24049/*
24050 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24051 * any interesting requests and then jump to the real instruction
24052 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24053 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24054 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24055 * bail to the real handler if breakFlags==0.
24056 */
24057    ldrb   r3, [rSELF, #offThread_breakFlags]
24058    adrl   lr, dvmAsmInstructionStart + (420 * 64)
24059    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24060    cmp    r3, #0
24061    bxeq   lr                   @ nothing to do - jump to real handler
24062    EXPORT_PC()
24063    mov    r0, rPC              @ arg0
24064    mov    r1, rFP              @ arg1
24065    mov    r2, rSELF            @ arg2
24066    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24067
24068/* ------------------------------ */
24069    .balign 64
24070.L_ALT_OP_UNUSED_A5FF: /* 0x1a5 */
24071/* File: armv5te/alt_stub.S */
24072/*
24073 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24074 * any interesting requests and then jump to the real instruction
24075 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24076 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24077 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24078 * bail to the real handler if breakFlags==0.
24079 */
24080    ldrb   r3, [rSELF, #offThread_breakFlags]
24081    adrl   lr, dvmAsmInstructionStart + (421 * 64)
24082    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24083    cmp    r3, #0
24084    bxeq   lr                   @ nothing to do - jump to real handler
24085    EXPORT_PC()
24086    mov    r0, rPC              @ arg0
24087    mov    r1, rFP              @ arg1
24088    mov    r2, rSELF            @ arg2
24089    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24090
24091/* ------------------------------ */
24092    .balign 64
24093.L_ALT_OP_UNUSED_A6FF: /* 0x1a6 */
24094/* File: armv5te/alt_stub.S */
24095/*
24096 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24097 * any interesting requests and then jump to the real instruction
24098 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24099 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24100 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24101 * bail to the real handler if breakFlags==0.
24102 */
24103    ldrb   r3, [rSELF, #offThread_breakFlags]
24104    adrl   lr, dvmAsmInstructionStart + (422 * 64)
24105    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24106    cmp    r3, #0
24107    bxeq   lr                   @ nothing to do - jump to real handler
24108    EXPORT_PC()
24109    mov    r0, rPC              @ arg0
24110    mov    r1, rFP              @ arg1
24111    mov    r2, rSELF            @ arg2
24112    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24113
24114/* ------------------------------ */
24115    .balign 64
24116.L_ALT_OP_UNUSED_A7FF: /* 0x1a7 */
24117/* File: armv5te/alt_stub.S */
24118/*
24119 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24120 * any interesting requests and then jump to the real instruction
24121 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24122 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24123 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24124 * bail to the real handler if breakFlags==0.
24125 */
24126    ldrb   r3, [rSELF, #offThread_breakFlags]
24127    adrl   lr, dvmAsmInstructionStart + (423 * 64)
24128    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24129    cmp    r3, #0
24130    bxeq   lr                   @ nothing to do - jump to real handler
24131    EXPORT_PC()
24132    mov    r0, rPC              @ arg0
24133    mov    r1, rFP              @ arg1
24134    mov    r2, rSELF            @ arg2
24135    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24136
24137/* ------------------------------ */
24138    .balign 64
24139.L_ALT_OP_UNUSED_A8FF: /* 0x1a8 */
24140/* File: armv5te/alt_stub.S */
24141/*
24142 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24143 * any interesting requests and then jump to the real instruction
24144 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24145 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24146 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24147 * bail to the real handler if breakFlags==0.
24148 */
24149    ldrb   r3, [rSELF, #offThread_breakFlags]
24150    adrl   lr, dvmAsmInstructionStart + (424 * 64)
24151    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24152    cmp    r3, #0
24153    bxeq   lr                   @ nothing to do - jump to real handler
24154    EXPORT_PC()
24155    mov    r0, rPC              @ arg0
24156    mov    r1, rFP              @ arg1
24157    mov    r2, rSELF            @ arg2
24158    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24159
24160/* ------------------------------ */
24161    .balign 64
24162.L_ALT_OP_UNUSED_A9FF: /* 0x1a9 */
24163/* File: armv5te/alt_stub.S */
24164/*
24165 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24166 * any interesting requests and then jump to the real instruction
24167 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24168 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24169 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24170 * bail to the real handler if breakFlags==0.
24171 */
24172    ldrb   r3, [rSELF, #offThread_breakFlags]
24173    adrl   lr, dvmAsmInstructionStart + (425 * 64)
24174    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24175    cmp    r3, #0
24176    bxeq   lr                   @ nothing to do - jump to real handler
24177    EXPORT_PC()
24178    mov    r0, rPC              @ arg0
24179    mov    r1, rFP              @ arg1
24180    mov    r2, rSELF            @ arg2
24181    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24182
24183/* ------------------------------ */
24184    .balign 64
24185.L_ALT_OP_UNUSED_AAFF: /* 0x1aa */
24186/* File: armv5te/alt_stub.S */
24187/*
24188 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24189 * any interesting requests and then jump to the real instruction
24190 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24191 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24192 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24193 * bail to the real handler if breakFlags==0.
24194 */
24195    ldrb   r3, [rSELF, #offThread_breakFlags]
24196    adrl   lr, dvmAsmInstructionStart + (426 * 64)
24197    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24198    cmp    r3, #0
24199    bxeq   lr                   @ nothing to do - jump to real handler
24200    EXPORT_PC()
24201    mov    r0, rPC              @ arg0
24202    mov    r1, rFP              @ arg1
24203    mov    r2, rSELF            @ arg2
24204    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24205
24206/* ------------------------------ */
24207    .balign 64
24208.L_ALT_OP_UNUSED_ABFF: /* 0x1ab */
24209/* File: armv5te/alt_stub.S */
24210/*
24211 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24212 * any interesting requests and then jump to the real instruction
24213 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24214 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24215 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24216 * bail to the real handler if breakFlags==0.
24217 */
24218    ldrb   r3, [rSELF, #offThread_breakFlags]
24219    adrl   lr, dvmAsmInstructionStart + (427 * 64)
24220    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24221    cmp    r3, #0
24222    bxeq   lr                   @ nothing to do - jump to real handler
24223    EXPORT_PC()
24224    mov    r0, rPC              @ arg0
24225    mov    r1, rFP              @ arg1
24226    mov    r2, rSELF            @ arg2
24227    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24228
24229/* ------------------------------ */
24230    .balign 64
24231.L_ALT_OP_UNUSED_ACFF: /* 0x1ac */
24232/* File: armv5te/alt_stub.S */
24233/*
24234 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24235 * any interesting requests and then jump to the real instruction
24236 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24237 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24238 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24239 * bail to the real handler if breakFlags==0.
24240 */
24241    ldrb   r3, [rSELF, #offThread_breakFlags]
24242    adrl   lr, dvmAsmInstructionStart + (428 * 64)
24243    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24244    cmp    r3, #0
24245    bxeq   lr                   @ nothing to do - jump to real handler
24246    EXPORT_PC()
24247    mov    r0, rPC              @ arg0
24248    mov    r1, rFP              @ arg1
24249    mov    r2, rSELF            @ arg2
24250    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24251
24252/* ------------------------------ */
24253    .balign 64
24254.L_ALT_OP_UNUSED_ADFF: /* 0x1ad */
24255/* File: armv5te/alt_stub.S */
24256/*
24257 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24258 * any interesting requests and then jump to the real instruction
24259 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24260 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24261 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24262 * bail to the real handler if breakFlags==0.
24263 */
24264    ldrb   r3, [rSELF, #offThread_breakFlags]
24265    adrl   lr, dvmAsmInstructionStart + (429 * 64)
24266    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24267    cmp    r3, #0
24268    bxeq   lr                   @ nothing to do - jump to real handler
24269    EXPORT_PC()
24270    mov    r0, rPC              @ arg0
24271    mov    r1, rFP              @ arg1
24272    mov    r2, rSELF            @ arg2
24273    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24274
24275/* ------------------------------ */
24276    .balign 64
24277.L_ALT_OP_UNUSED_AEFF: /* 0x1ae */
24278/* File: armv5te/alt_stub.S */
24279/*
24280 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24281 * any interesting requests and then jump to the real instruction
24282 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24283 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24284 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24285 * bail to the real handler if breakFlags==0.
24286 */
24287    ldrb   r3, [rSELF, #offThread_breakFlags]
24288    adrl   lr, dvmAsmInstructionStart + (430 * 64)
24289    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24290    cmp    r3, #0
24291    bxeq   lr                   @ nothing to do - jump to real handler
24292    EXPORT_PC()
24293    mov    r0, rPC              @ arg0
24294    mov    r1, rFP              @ arg1
24295    mov    r2, rSELF            @ arg2
24296    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24297
24298/* ------------------------------ */
24299    .balign 64
24300.L_ALT_OP_UNUSED_AFFF: /* 0x1af */
24301/* File: armv5te/alt_stub.S */
24302/*
24303 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24304 * any interesting requests and then jump to the real instruction
24305 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24306 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24307 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24308 * bail to the real handler if breakFlags==0.
24309 */
24310    ldrb   r3, [rSELF, #offThread_breakFlags]
24311    adrl   lr, dvmAsmInstructionStart + (431 * 64)
24312    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24313    cmp    r3, #0
24314    bxeq   lr                   @ nothing to do - jump to real handler
24315    EXPORT_PC()
24316    mov    r0, rPC              @ arg0
24317    mov    r1, rFP              @ arg1
24318    mov    r2, rSELF            @ arg2
24319    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24320
24321/* ------------------------------ */
24322    .balign 64
24323.L_ALT_OP_UNUSED_B0FF: /* 0x1b0 */
24324/* File: armv5te/alt_stub.S */
24325/*
24326 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24327 * any interesting requests and then jump to the real instruction
24328 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24329 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24330 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24331 * bail to the real handler if breakFlags==0.
24332 */
24333    ldrb   r3, [rSELF, #offThread_breakFlags]
24334    adrl   lr, dvmAsmInstructionStart + (432 * 64)
24335    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24336    cmp    r3, #0
24337    bxeq   lr                   @ nothing to do - jump to real handler
24338    EXPORT_PC()
24339    mov    r0, rPC              @ arg0
24340    mov    r1, rFP              @ arg1
24341    mov    r2, rSELF            @ arg2
24342    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24343
24344/* ------------------------------ */
24345    .balign 64
24346.L_ALT_OP_UNUSED_B1FF: /* 0x1b1 */
24347/* File: armv5te/alt_stub.S */
24348/*
24349 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24350 * any interesting requests and then jump to the real instruction
24351 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24352 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24353 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24354 * bail to the real handler if breakFlags==0.
24355 */
24356    ldrb   r3, [rSELF, #offThread_breakFlags]
24357    adrl   lr, dvmAsmInstructionStart + (433 * 64)
24358    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24359    cmp    r3, #0
24360    bxeq   lr                   @ nothing to do - jump to real handler
24361    EXPORT_PC()
24362    mov    r0, rPC              @ arg0
24363    mov    r1, rFP              @ arg1
24364    mov    r2, rSELF            @ arg2
24365    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24366
24367/* ------------------------------ */
24368    .balign 64
24369.L_ALT_OP_UNUSED_B2FF: /* 0x1b2 */
24370/* File: armv5te/alt_stub.S */
24371/*
24372 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24373 * any interesting requests and then jump to the real instruction
24374 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24375 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24376 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24377 * bail to the real handler if breakFlags==0.
24378 */
24379    ldrb   r3, [rSELF, #offThread_breakFlags]
24380    adrl   lr, dvmAsmInstructionStart + (434 * 64)
24381    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24382    cmp    r3, #0
24383    bxeq   lr                   @ nothing to do - jump to real handler
24384    EXPORT_PC()
24385    mov    r0, rPC              @ arg0
24386    mov    r1, rFP              @ arg1
24387    mov    r2, rSELF            @ arg2
24388    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24389
24390/* ------------------------------ */
24391    .balign 64
24392.L_ALT_OP_UNUSED_B3FF: /* 0x1b3 */
24393/* File: armv5te/alt_stub.S */
24394/*
24395 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24396 * any interesting requests and then jump to the real instruction
24397 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24398 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24399 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24400 * bail to the real handler if breakFlags==0.
24401 */
24402    ldrb   r3, [rSELF, #offThread_breakFlags]
24403    adrl   lr, dvmAsmInstructionStart + (435 * 64)
24404    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24405    cmp    r3, #0
24406    bxeq   lr                   @ nothing to do - jump to real handler
24407    EXPORT_PC()
24408    mov    r0, rPC              @ arg0
24409    mov    r1, rFP              @ arg1
24410    mov    r2, rSELF            @ arg2
24411    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24412
24413/* ------------------------------ */
24414    .balign 64
24415.L_ALT_OP_UNUSED_B4FF: /* 0x1b4 */
24416/* File: armv5te/alt_stub.S */
24417/*
24418 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24419 * any interesting requests and then jump to the real instruction
24420 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24421 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24422 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24423 * bail to the real handler if breakFlags==0.
24424 */
24425    ldrb   r3, [rSELF, #offThread_breakFlags]
24426    adrl   lr, dvmAsmInstructionStart + (436 * 64)
24427    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24428    cmp    r3, #0
24429    bxeq   lr                   @ nothing to do - jump to real handler
24430    EXPORT_PC()
24431    mov    r0, rPC              @ arg0
24432    mov    r1, rFP              @ arg1
24433    mov    r2, rSELF            @ arg2
24434    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24435
24436/* ------------------------------ */
24437    .balign 64
24438.L_ALT_OP_UNUSED_B5FF: /* 0x1b5 */
24439/* File: armv5te/alt_stub.S */
24440/*
24441 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24442 * any interesting requests and then jump to the real instruction
24443 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24444 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24445 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24446 * bail to the real handler if breakFlags==0.
24447 */
24448    ldrb   r3, [rSELF, #offThread_breakFlags]
24449    adrl   lr, dvmAsmInstructionStart + (437 * 64)
24450    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24451    cmp    r3, #0
24452    bxeq   lr                   @ nothing to do - jump to real handler
24453    EXPORT_PC()
24454    mov    r0, rPC              @ arg0
24455    mov    r1, rFP              @ arg1
24456    mov    r2, rSELF            @ arg2
24457    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24458
24459/* ------------------------------ */
24460    .balign 64
24461.L_ALT_OP_UNUSED_B6FF: /* 0x1b6 */
24462/* File: armv5te/alt_stub.S */
24463/*
24464 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24465 * any interesting requests and then jump to the real instruction
24466 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24467 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24468 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24469 * bail to the real handler if breakFlags==0.
24470 */
24471    ldrb   r3, [rSELF, #offThread_breakFlags]
24472    adrl   lr, dvmAsmInstructionStart + (438 * 64)
24473    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24474    cmp    r3, #0
24475    bxeq   lr                   @ nothing to do - jump to real handler
24476    EXPORT_PC()
24477    mov    r0, rPC              @ arg0
24478    mov    r1, rFP              @ arg1
24479    mov    r2, rSELF            @ arg2
24480    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24481
24482/* ------------------------------ */
24483    .balign 64
24484.L_ALT_OP_UNUSED_B7FF: /* 0x1b7 */
24485/* File: armv5te/alt_stub.S */
24486/*
24487 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24488 * any interesting requests and then jump to the real instruction
24489 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24490 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24491 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24492 * bail to the real handler if breakFlags==0.
24493 */
24494    ldrb   r3, [rSELF, #offThread_breakFlags]
24495    adrl   lr, dvmAsmInstructionStart + (439 * 64)
24496    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24497    cmp    r3, #0
24498    bxeq   lr                   @ nothing to do - jump to real handler
24499    EXPORT_PC()
24500    mov    r0, rPC              @ arg0
24501    mov    r1, rFP              @ arg1
24502    mov    r2, rSELF            @ arg2
24503    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24504
24505/* ------------------------------ */
24506    .balign 64
24507.L_ALT_OP_UNUSED_B8FF: /* 0x1b8 */
24508/* File: armv5te/alt_stub.S */
24509/*
24510 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24511 * any interesting requests and then jump to the real instruction
24512 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24513 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24514 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24515 * bail to the real handler if breakFlags==0.
24516 */
24517    ldrb   r3, [rSELF, #offThread_breakFlags]
24518    adrl   lr, dvmAsmInstructionStart + (440 * 64)
24519    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24520    cmp    r3, #0
24521    bxeq   lr                   @ nothing to do - jump to real handler
24522    EXPORT_PC()
24523    mov    r0, rPC              @ arg0
24524    mov    r1, rFP              @ arg1
24525    mov    r2, rSELF            @ arg2
24526    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24527
24528/* ------------------------------ */
24529    .balign 64
24530.L_ALT_OP_UNUSED_B9FF: /* 0x1b9 */
24531/* File: armv5te/alt_stub.S */
24532/*
24533 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24534 * any interesting requests and then jump to the real instruction
24535 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24536 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24537 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24538 * bail to the real handler if breakFlags==0.
24539 */
24540    ldrb   r3, [rSELF, #offThread_breakFlags]
24541    adrl   lr, dvmAsmInstructionStart + (441 * 64)
24542    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24543    cmp    r3, #0
24544    bxeq   lr                   @ nothing to do - jump to real handler
24545    EXPORT_PC()
24546    mov    r0, rPC              @ arg0
24547    mov    r1, rFP              @ arg1
24548    mov    r2, rSELF            @ arg2
24549    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24550
24551/* ------------------------------ */
24552    .balign 64
24553.L_ALT_OP_UNUSED_BAFF: /* 0x1ba */
24554/* File: armv5te/alt_stub.S */
24555/*
24556 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24557 * any interesting requests and then jump to the real instruction
24558 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24559 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24560 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24561 * bail to the real handler if breakFlags==0.
24562 */
24563    ldrb   r3, [rSELF, #offThread_breakFlags]
24564    adrl   lr, dvmAsmInstructionStart + (442 * 64)
24565    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24566    cmp    r3, #0
24567    bxeq   lr                   @ nothing to do - jump to real handler
24568    EXPORT_PC()
24569    mov    r0, rPC              @ arg0
24570    mov    r1, rFP              @ arg1
24571    mov    r2, rSELF            @ arg2
24572    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24573
24574/* ------------------------------ */
24575    .balign 64
24576.L_ALT_OP_UNUSED_BBFF: /* 0x1bb */
24577/* File: armv5te/alt_stub.S */
24578/*
24579 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24580 * any interesting requests and then jump to the real instruction
24581 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24582 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24583 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24584 * bail to the real handler if breakFlags==0.
24585 */
24586    ldrb   r3, [rSELF, #offThread_breakFlags]
24587    adrl   lr, dvmAsmInstructionStart + (443 * 64)
24588    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24589    cmp    r3, #0
24590    bxeq   lr                   @ nothing to do - jump to real handler
24591    EXPORT_PC()
24592    mov    r0, rPC              @ arg0
24593    mov    r1, rFP              @ arg1
24594    mov    r2, rSELF            @ arg2
24595    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24596
24597/* ------------------------------ */
24598    .balign 64
24599.L_ALT_OP_UNUSED_BCFF: /* 0x1bc */
24600/* File: armv5te/alt_stub.S */
24601/*
24602 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24603 * any interesting requests and then jump to the real instruction
24604 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24605 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24606 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24607 * bail to the real handler if breakFlags==0.
24608 */
24609    ldrb   r3, [rSELF, #offThread_breakFlags]
24610    adrl   lr, dvmAsmInstructionStart + (444 * 64)
24611    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24612    cmp    r3, #0
24613    bxeq   lr                   @ nothing to do - jump to real handler
24614    EXPORT_PC()
24615    mov    r0, rPC              @ arg0
24616    mov    r1, rFP              @ arg1
24617    mov    r2, rSELF            @ arg2
24618    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24619
24620/* ------------------------------ */
24621    .balign 64
24622.L_ALT_OP_UNUSED_BDFF: /* 0x1bd */
24623/* File: armv5te/alt_stub.S */
24624/*
24625 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24626 * any interesting requests and then jump to the real instruction
24627 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24628 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24629 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24630 * bail to the real handler if breakFlags==0.
24631 */
24632    ldrb   r3, [rSELF, #offThread_breakFlags]
24633    adrl   lr, dvmAsmInstructionStart + (445 * 64)
24634    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24635    cmp    r3, #0
24636    bxeq   lr                   @ nothing to do - jump to real handler
24637    EXPORT_PC()
24638    mov    r0, rPC              @ arg0
24639    mov    r1, rFP              @ arg1
24640    mov    r2, rSELF            @ arg2
24641    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24642
24643/* ------------------------------ */
24644    .balign 64
24645.L_ALT_OP_UNUSED_BEFF: /* 0x1be */
24646/* File: armv5te/alt_stub.S */
24647/*
24648 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24649 * any interesting requests and then jump to the real instruction
24650 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24651 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24652 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24653 * bail to the real handler if breakFlags==0.
24654 */
24655    ldrb   r3, [rSELF, #offThread_breakFlags]
24656    adrl   lr, dvmAsmInstructionStart + (446 * 64)
24657    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24658    cmp    r3, #0
24659    bxeq   lr                   @ nothing to do - jump to real handler
24660    EXPORT_PC()
24661    mov    r0, rPC              @ arg0
24662    mov    r1, rFP              @ arg1
24663    mov    r2, rSELF            @ arg2
24664    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24665
24666/* ------------------------------ */
24667    .balign 64
24668.L_ALT_OP_UNUSED_BFFF: /* 0x1bf */
24669/* File: armv5te/alt_stub.S */
24670/*
24671 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24672 * any interesting requests and then jump to the real instruction
24673 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24674 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24675 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24676 * bail to the real handler if breakFlags==0.
24677 */
24678    ldrb   r3, [rSELF, #offThread_breakFlags]
24679    adrl   lr, dvmAsmInstructionStart + (447 * 64)
24680    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24681    cmp    r3, #0
24682    bxeq   lr                   @ nothing to do - jump to real handler
24683    EXPORT_PC()
24684    mov    r0, rPC              @ arg0
24685    mov    r1, rFP              @ arg1
24686    mov    r2, rSELF            @ arg2
24687    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24688
24689/* ------------------------------ */
24690    .balign 64
24691.L_ALT_OP_UNUSED_C0FF: /* 0x1c0 */
24692/* File: armv5te/alt_stub.S */
24693/*
24694 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24695 * any interesting requests and then jump to the real instruction
24696 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24697 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24698 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24699 * bail to the real handler if breakFlags==0.
24700 */
24701    ldrb   r3, [rSELF, #offThread_breakFlags]
24702    adrl   lr, dvmAsmInstructionStart + (448 * 64)
24703    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24704    cmp    r3, #0
24705    bxeq   lr                   @ nothing to do - jump to real handler
24706    EXPORT_PC()
24707    mov    r0, rPC              @ arg0
24708    mov    r1, rFP              @ arg1
24709    mov    r2, rSELF            @ arg2
24710    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24711
24712/* ------------------------------ */
24713    .balign 64
24714.L_ALT_OP_UNUSED_C1FF: /* 0x1c1 */
24715/* File: armv5te/alt_stub.S */
24716/*
24717 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24718 * any interesting requests and then jump to the real instruction
24719 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24720 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24721 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24722 * bail to the real handler if breakFlags==0.
24723 */
24724    ldrb   r3, [rSELF, #offThread_breakFlags]
24725    adrl   lr, dvmAsmInstructionStart + (449 * 64)
24726    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24727    cmp    r3, #0
24728    bxeq   lr                   @ nothing to do - jump to real handler
24729    EXPORT_PC()
24730    mov    r0, rPC              @ arg0
24731    mov    r1, rFP              @ arg1
24732    mov    r2, rSELF            @ arg2
24733    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24734
24735/* ------------------------------ */
24736    .balign 64
24737.L_ALT_OP_UNUSED_C2FF: /* 0x1c2 */
24738/* File: armv5te/alt_stub.S */
24739/*
24740 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24741 * any interesting requests and then jump to the real instruction
24742 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24743 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24744 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24745 * bail to the real handler if breakFlags==0.
24746 */
24747    ldrb   r3, [rSELF, #offThread_breakFlags]
24748    adrl   lr, dvmAsmInstructionStart + (450 * 64)
24749    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24750    cmp    r3, #0
24751    bxeq   lr                   @ nothing to do - jump to real handler
24752    EXPORT_PC()
24753    mov    r0, rPC              @ arg0
24754    mov    r1, rFP              @ arg1
24755    mov    r2, rSELF            @ arg2
24756    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24757
24758/* ------------------------------ */
24759    .balign 64
24760.L_ALT_OP_UNUSED_C3FF: /* 0x1c3 */
24761/* File: armv5te/alt_stub.S */
24762/*
24763 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24764 * any interesting requests and then jump to the real instruction
24765 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24766 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24767 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24768 * bail to the real handler if breakFlags==0.
24769 */
24770    ldrb   r3, [rSELF, #offThread_breakFlags]
24771    adrl   lr, dvmAsmInstructionStart + (451 * 64)
24772    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24773    cmp    r3, #0
24774    bxeq   lr                   @ nothing to do - jump to real handler
24775    EXPORT_PC()
24776    mov    r0, rPC              @ arg0
24777    mov    r1, rFP              @ arg1
24778    mov    r2, rSELF            @ arg2
24779    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24780
24781/* ------------------------------ */
24782    .balign 64
24783.L_ALT_OP_UNUSED_C4FF: /* 0x1c4 */
24784/* File: armv5te/alt_stub.S */
24785/*
24786 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24787 * any interesting requests and then jump to the real instruction
24788 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24789 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24790 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24791 * bail to the real handler if breakFlags==0.
24792 */
24793    ldrb   r3, [rSELF, #offThread_breakFlags]
24794    adrl   lr, dvmAsmInstructionStart + (452 * 64)
24795    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24796    cmp    r3, #0
24797    bxeq   lr                   @ nothing to do - jump to real handler
24798    EXPORT_PC()
24799    mov    r0, rPC              @ arg0
24800    mov    r1, rFP              @ arg1
24801    mov    r2, rSELF            @ arg2
24802    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24803
24804/* ------------------------------ */
24805    .balign 64
24806.L_ALT_OP_UNUSED_C5FF: /* 0x1c5 */
24807/* File: armv5te/alt_stub.S */
24808/*
24809 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24810 * any interesting requests and then jump to the real instruction
24811 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24812 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24813 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24814 * bail to the real handler if breakFlags==0.
24815 */
24816    ldrb   r3, [rSELF, #offThread_breakFlags]
24817    adrl   lr, dvmAsmInstructionStart + (453 * 64)
24818    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24819    cmp    r3, #0
24820    bxeq   lr                   @ nothing to do - jump to real handler
24821    EXPORT_PC()
24822    mov    r0, rPC              @ arg0
24823    mov    r1, rFP              @ arg1
24824    mov    r2, rSELF            @ arg2
24825    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24826
24827/* ------------------------------ */
24828    .balign 64
24829.L_ALT_OP_UNUSED_C6FF: /* 0x1c6 */
24830/* File: armv5te/alt_stub.S */
24831/*
24832 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24833 * any interesting requests and then jump to the real instruction
24834 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24835 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24836 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24837 * bail to the real handler if breakFlags==0.
24838 */
24839    ldrb   r3, [rSELF, #offThread_breakFlags]
24840    adrl   lr, dvmAsmInstructionStart + (454 * 64)
24841    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24842    cmp    r3, #0
24843    bxeq   lr                   @ nothing to do - jump to real handler
24844    EXPORT_PC()
24845    mov    r0, rPC              @ arg0
24846    mov    r1, rFP              @ arg1
24847    mov    r2, rSELF            @ arg2
24848    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24849
24850/* ------------------------------ */
24851    .balign 64
24852.L_ALT_OP_UNUSED_C7FF: /* 0x1c7 */
24853/* File: armv5te/alt_stub.S */
24854/*
24855 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24856 * any interesting requests and then jump to the real instruction
24857 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24858 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24859 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24860 * bail to the real handler if breakFlags==0.
24861 */
24862    ldrb   r3, [rSELF, #offThread_breakFlags]
24863    adrl   lr, dvmAsmInstructionStart + (455 * 64)
24864    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24865    cmp    r3, #0
24866    bxeq   lr                   @ nothing to do - jump to real handler
24867    EXPORT_PC()
24868    mov    r0, rPC              @ arg0
24869    mov    r1, rFP              @ arg1
24870    mov    r2, rSELF            @ arg2
24871    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24872
24873/* ------------------------------ */
24874    .balign 64
24875.L_ALT_OP_UNUSED_C8FF: /* 0x1c8 */
24876/* File: armv5te/alt_stub.S */
24877/*
24878 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24879 * any interesting requests and then jump to the real instruction
24880 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24881 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24882 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24883 * bail to the real handler if breakFlags==0.
24884 */
24885    ldrb   r3, [rSELF, #offThread_breakFlags]
24886    adrl   lr, dvmAsmInstructionStart + (456 * 64)
24887    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24888    cmp    r3, #0
24889    bxeq   lr                   @ nothing to do - jump to real handler
24890    EXPORT_PC()
24891    mov    r0, rPC              @ arg0
24892    mov    r1, rFP              @ arg1
24893    mov    r2, rSELF            @ arg2
24894    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24895
24896/* ------------------------------ */
24897    .balign 64
24898.L_ALT_OP_UNUSED_C9FF: /* 0x1c9 */
24899/* File: armv5te/alt_stub.S */
24900/*
24901 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24902 * any interesting requests and then jump to the real instruction
24903 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24904 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24905 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24906 * bail to the real handler if breakFlags==0.
24907 */
24908    ldrb   r3, [rSELF, #offThread_breakFlags]
24909    adrl   lr, dvmAsmInstructionStart + (457 * 64)
24910    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24911    cmp    r3, #0
24912    bxeq   lr                   @ nothing to do - jump to real handler
24913    EXPORT_PC()
24914    mov    r0, rPC              @ arg0
24915    mov    r1, rFP              @ arg1
24916    mov    r2, rSELF            @ arg2
24917    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24918
24919/* ------------------------------ */
24920    .balign 64
24921.L_ALT_OP_UNUSED_CAFF: /* 0x1ca */
24922/* File: armv5te/alt_stub.S */
24923/*
24924 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24925 * any interesting requests and then jump to the real instruction
24926 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24927 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24928 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24929 * bail to the real handler if breakFlags==0.
24930 */
24931    ldrb   r3, [rSELF, #offThread_breakFlags]
24932    adrl   lr, dvmAsmInstructionStart + (458 * 64)
24933    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24934    cmp    r3, #0
24935    bxeq   lr                   @ nothing to do - jump to real handler
24936    EXPORT_PC()
24937    mov    r0, rPC              @ arg0
24938    mov    r1, rFP              @ arg1
24939    mov    r2, rSELF            @ arg2
24940    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24941
24942/* ------------------------------ */
24943    .balign 64
24944.L_ALT_OP_UNUSED_CBFF: /* 0x1cb */
24945/* File: armv5te/alt_stub.S */
24946/*
24947 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24948 * any interesting requests and then jump to the real instruction
24949 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24950 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24951 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24952 * bail to the real handler if breakFlags==0.
24953 */
24954    ldrb   r3, [rSELF, #offThread_breakFlags]
24955    adrl   lr, dvmAsmInstructionStart + (459 * 64)
24956    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24957    cmp    r3, #0
24958    bxeq   lr                   @ nothing to do - jump to real handler
24959    EXPORT_PC()
24960    mov    r0, rPC              @ arg0
24961    mov    r1, rFP              @ arg1
24962    mov    r2, rSELF            @ arg2
24963    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24964
24965/* ------------------------------ */
24966    .balign 64
24967.L_ALT_OP_UNUSED_CCFF: /* 0x1cc */
24968/* File: armv5te/alt_stub.S */
24969/*
24970 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24971 * any interesting requests and then jump to the real instruction
24972 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24973 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24974 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24975 * bail to the real handler if breakFlags==0.
24976 */
24977    ldrb   r3, [rSELF, #offThread_breakFlags]
24978    adrl   lr, dvmAsmInstructionStart + (460 * 64)
24979    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24980    cmp    r3, #0
24981    bxeq   lr                   @ nothing to do - jump to real handler
24982    EXPORT_PC()
24983    mov    r0, rPC              @ arg0
24984    mov    r1, rFP              @ arg1
24985    mov    r2, rSELF            @ arg2
24986    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24987
24988/* ------------------------------ */
24989    .balign 64
24990.L_ALT_OP_UNUSED_CDFF: /* 0x1cd */
24991/* File: armv5te/alt_stub.S */
24992/*
24993 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24994 * any interesting requests and then jump to the real instruction
24995 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24996 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24997 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24998 * bail to the real handler if breakFlags==0.
24999 */
25000    ldrb   r3, [rSELF, #offThread_breakFlags]
25001    adrl   lr, dvmAsmInstructionStart + (461 * 64)
25002    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25003    cmp    r3, #0
25004    bxeq   lr                   @ nothing to do - jump to real handler
25005    EXPORT_PC()
25006    mov    r0, rPC              @ arg0
25007    mov    r1, rFP              @ arg1
25008    mov    r2, rSELF            @ arg2
25009    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25010
25011/* ------------------------------ */
25012    .balign 64
25013.L_ALT_OP_UNUSED_CEFF: /* 0x1ce */
25014/* File: armv5te/alt_stub.S */
25015/*
25016 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25017 * any interesting requests and then jump to the real instruction
25018 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25019 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25020 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25021 * bail to the real handler if breakFlags==0.
25022 */
25023    ldrb   r3, [rSELF, #offThread_breakFlags]
25024    adrl   lr, dvmAsmInstructionStart + (462 * 64)
25025    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25026    cmp    r3, #0
25027    bxeq   lr                   @ nothing to do - jump to real handler
25028    EXPORT_PC()
25029    mov    r0, rPC              @ arg0
25030    mov    r1, rFP              @ arg1
25031    mov    r2, rSELF            @ arg2
25032    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25033
25034/* ------------------------------ */
25035    .balign 64
25036.L_ALT_OP_UNUSED_CFFF: /* 0x1cf */
25037/* File: armv5te/alt_stub.S */
25038/*
25039 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25040 * any interesting requests and then jump to the real instruction
25041 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25042 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25043 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25044 * bail to the real handler if breakFlags==0.
25045 */
25046    ldrb   r3, [rSELF, #offThread_breakFlags]
25047    adrl   lr, dvmAsmInstructionStart + (463 * 64)
25048    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25049    cmp    r3, #0
25050    bxeq   lr                   @ nothing to do - jump to real handler
25051    EXPORT_PC()
25052    mov    r0, rPC              @ arg0
25053    mov    r1, rFP              @ arg1
25054    mov    r2, rSELF            @ arg2
25055    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25056
25057/* ------------------------------ */
25058    .balign 64
25059.L_ALT_OP_UNUSED_D0FF: /* 0x1d0 */
25060/* File: armv5te/alt_stub.S */
25061/*
25062 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25063 * any interesting requests and then jump to the real instruction
25064 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25065 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25066 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25067 * bail to the real handler if breakFlags==0.
25068 */
25069    ldrb   r3, [rSELF, #offThread_breakFlags]
25070    adrl   lr, dvmAsmInstructionStart + (464 * 64)
25071    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25072    cmp    r3, #0
25073    bxeq   lr                   @ nothing to do - jump to real handler
25074    EXPORT_PC()
25075    mov    r0, rPC              @ arg0
25076    mov    r1, rFP              @ arg1
25077    mov    r2, rSELF            @ arg2
25078    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25079
25080/* ------------------------------ */
25081    .balign 64
25082.L_ALT_OP_UNUSED_D1FF: /* 0x1d1 */
25083/* File: armv5te/alt_stub.S */
25084/*
25085 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25086 * any interesting requests and then jump to the real instruction
25087 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25088 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25089 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25090 * bail to the real handler if breakFlags==0.
25091 */
25092    ldrb   r3, [rSELF, #offThread_breakFlags]
25093    adrl   lr, dvmAsmInstructionStart + (465 * 64)
25094    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25095    cmp    r3, #0
25096    bxeq   lr                   @ nothing to do - jump to real handler
25097    EXPORT_PC()
25098    mov    r0, rPC              @ arg0
25099    mov    r1, rFP              @ arg1
25100    mov    r2, rSELF            @ arg2
25101    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25102
25103/* ------------------------------ */
25104    .balign 64
25105.L_ALT_OP_UNUSED_D2FF: /* 0x1d2 */
25106/* File: armv5te/alt_stub.S */
25107/*
25108 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25109 * any interesting requests and then jump to the real instruction
25110 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25111 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25112 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25113 * bail to the real handler if breakFlags==0.
25114 */
25115    ldrb   r3, [rSELF, #offThread_breakFlags]
25116    adrl   lr, dvmAsmInstructionStart + (466 * 64)
25117    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25118    cmp    r3, #0
25119    bxeq   lr                   @ nothing to do - jump to real handler
25120    EXPORT_PC()
25121    mov    r0, rPC              @ arg0
25122    mov    r1, rFP              @ arg1
25123    mov    r2, rSELF            @ arg2
25124    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25125
25126/* ------------------------------ */
25127    .balign 64
25128.L_ALT_OP_UNUSED_D3FF: /* 0x1d3 */
25129/* File: armv5te/alt_stub.S */
25130/*
25131 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25132 * any interesting requests and then jump to the real instruction
25133 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25134 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25135 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25136 * bail to the real handler if breakFlags==0.
25137 */
25138    ldrb   r3, [rSELF, #offThread_breakFlags]
25139    adrl   lr, dvmAsmInstructionStart + (467 * 64)
25140    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25141    cmp    r3, #0
25142    bxeq   lr                   @ nothing to do - jump to real handler
25143    EXPORT_PC()
25144    mov    r0, rPC              @ arg0
25145    mov    r1, rFP              @ arg1
25146    mov    r2, rSELF            @ arg2
25147    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25148
25149/* ------------------------------ */
25150    .balign 64
25151.L_ALT_OP_UNUSED_D4FF: /* 0x1d4 */
25152/* File: armv5te/alt_stub.S */
25153/*
25154 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25155 * any interesting requests and then jump to the real instruction
25156 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25157 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25158 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25159 * bail to the real handler if breakFlags==0.
25160 */
25161    ldrb   r3, [rSELF, #offThread_breakFlags]
25162    adrl   lr, dvmAsmInstructionStart + (468 * 64)
25163    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25164    cmp    r3, #0
25165    bxeq   lr                   @ nothing to do - jump to real handler
25166    EXPORT_PC()
25167    mov    r0, rPC              @ arg0
25168    mov    r1, rFP              @ arg1
25169    mov    r2, rSELF            @ arg2
25170    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25171
25172/* ------------------------------ */
25173    .balign 64
25174.L_ALT_OP_UNUSED_D5FF: /* 0x1d5 */
25175/* File: armv5te/alt_stub.S */
25176/*
25177 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25178 * any interesting requests and then jump to the real instruction
25179 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25180 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25181 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25182 * bail to the real handler if breakFlags==0.
25183 */
25184    ldrb   r3, [rSELF, #offThread_breakFlags]
25185    adrl   lr, dvmAsmInstructionStart + (469 * 64)
25186    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25187    cmp    r3, #0
25188    bxeq   lr                   @ nothing to do - jump to real handler
25189    EXPORT_PC()
25190    mov    r0, rPC              @ arg0
25191    mov    r1, rFP              @ arg1
25192    mov    r2, rSELF            @ arg2
25193    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25194
25195/* ------------------------------ */
25196    .balign 64
25197.L_ALT_OP_UNUSED_D6FF: /* 0x1d6 */
25198/* File: armv5te/alt_stub.S */
25199/*
25200 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25201 * any interesting requests and then jump to the real instruction
25202 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25203 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25204 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25205 * bail to the real handler if breakFlags==0.
25206 */
25207    ldrb   r3, [rSELF, #offThread_breakFlags]
25208    adrl   lr, dvmAsmInstructionStart + (470 * 64)
25209    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25210    cmp    r3, #0
25211    bxeq   lr                   @ nothing to do - jump to real handler
25212    EXPORT_PC()
25213    mov    r0, rPC              @ arg0
25214    mov    r1, rFP              @ arg1
25215    mov    r2, rSELF            @ arg2
25216    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25217
25218/* ------------------------------ */
25219    .balign 64
25220.L_ALT_OP_UNUSED_D7FF: /* 0x1d7 */
25221/* File: armv5te/alt_stub.S */
25222/*
25223 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25224 * any interesting requests and then jump to the real instruction
25225 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25226 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25227 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25228 * bail to the real handler if breakFlags==0.
25229 */
25230    ldrb   r3, [rSELF, #offThread_breakFlags]
25231    adrl   lr, dvmAsmInstructionStart + (471 * 64)
25232    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25233    cmp    r3, #0
25234    bxeq   lr                   @ nothing to do - jump to real handler
25235    EXPORT_PC()
25236    mov    r0, rPC              @ arg0
25237    mov    r1, rFP              @ arg1
25238    mov    r2, rSELF            @ arg2
25239    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25240
25241/* ------------------------------ */
25242    .balign 64
25243.L_ALT_OP_UNUSED_D8FF: /* 0x1d8 */
25244/* File: armv5te/alt_stub.S */
25245/*
25246 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25247 * any interesting requests and then jump to the real instruction
25248 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25249 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25250 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25251 * bail to the real handler if breakFlags==0.
25252 */
25253    ldrb   r3, [rSELF, #offThread_breakFlags]
25254    adrl   lr, dvmAsmInstructionStart + (472 * 64)
25255    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25256    cmp    r3, #0
25257    bxeq   lr                   @ nothing to do - jump to real handler
25258    EXPORT_PC()
25259    mov    r0, rPC              @ arg0
25260    mov    r1, rFP              @ arg1
25261    mov    r2, rSELF            @ arg2
25262    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25263
25264/* ------------------------------ */
25265    .balign 64
25266.L_ALT_OP_UNUSED_D9FF: /* 0x1d9 */
25267/* File: armv5te/alt_stub.S */
25268/*
25269 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25270 * any interesting requests and then jump to the real instruction
25271 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25272 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25273 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25274 * bail to the real handler if breakFlags==0.
25275 */
25276    ldrb   r3, [rSELF, #offThread_breakFlags]
25277    adrl   lr, dvmAsmInstructionStart + (473 * 64)
25278    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25279    cmp    r3, #0
25280    bxeq   lr                   @ nothing to do - jump to real handler
25281    EXPORT_PC()
25282    mov    r0, rPC              @ arg0
25283    mov    r1, rFP              @ arg1
25284    mov    r2, rSELF            @ arg2
25285    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25286
25287/* ------------------------------ */
25288    .balign 64
25289.L_ALT_OP_UNUSED_DAFF: /* 0x1da */
25290/* File: armv5te/alt_stub.S */
25291/*
25292 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25293 * any interesting requests and then jump to the real instruction
25294 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25295 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25296 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25297 * bail to the real handler if breakFlags==0.
25298 */
25299    ldrb   r3, [rSELF, #offThread_breakFlags]
25300    adrl   lr, dvmAsmInstructionStart + (474 * 64)
25301    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25302    cmp    r3, #0
25303    bxeq   lr                   @ nothing to do - jump to real handler
25304    EXPORT_PC()
25305    mov    r0, rPC              @ arg0
25306    mov    r1, rFP              @ arg1
25307    mov    r2, rSELF            @ arg2
25308    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25309
25310/* ------------------------------ */
25311    .balign 64
25312.L_ALT_OP_UNUSED_DBFF: /* 0x1db */
25313/* File: armv5te/alt_stub.S */
25314/*
25315 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25316 * any interesting requests and then jump to the real instruction
25317 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25318 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25319 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25320 * bail to the real handler if breakFlags==0.
25321 */
25322    ldrb   r3, [rSELF, #offThread_breakFlags]
25323    adrl   lr, dvmAsmInstructionStart + (475 * 64)
25324    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25325    cmp    r3, #0
25326    bxeq   lr                   @ nothing to do - jump to real handler
25327    EXPORT_PC()
25328    mov    r0, rPC              @ arg0
25329    mov    r1, rFP              @ arg1
25330    mov    r2, rSELF            @ arg2
25331    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25332
25333/* ------------------------------ */
25334    .balign 64
25335.L_ALT_OP_UNUSED_DCFF: /* 0x1dc */
25336/* File: armv5te/alt_stub.S */
25337/*
25338 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25339 * any interesting requests and then jump to the real instruction
25340 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25341 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25342 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25343 * bail to the real handler if breakFlags==0.
25344 */
25345    ldrb   r3, [rSELF, #offThread_breakFlags]
25346    adrl   lr, dvmAsmInstructionStart + (476 * 64)
25347    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25348    cmp    r3, #0
25349    bxeq   lr                   @ nothing to do - jump to real handler
25350    EXPORT_PC()
25351    mov    r0, rPC              @ arg0
25352    mov    r1, rFP              @ arg1
25353    mov    r2, rSELF            @ arg2
25354    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25355
25356/* ------------------------------ */
25357    .balign 64
25358.L_ALT_OP_UNUSED_DDFF: /* 0x1dd */
25359/* File: armv5te/alt_stub.S */
25360/*
25361 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25362 * any interesting requests and then jump to the real instruction
25363 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25364 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25365 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25366 * bail to the real handler if breakFlags==0.
25367 */
25368    ldrb   r3, [rSELF, #offThread_breakFlags]
25369    adrl   lr, dvmAsmInstructionStart + (477 * 64)
25370    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25371    cmp    r3, #0
25372    bxeq   lr                   @ nothing to do - jump to real handler
25373    EXPORT_PC()
25374    mov    r0, rPC              @ arg0
25375    mov    r1, rFP              @ arg1
25376    mov    r2, rSELF            @ arg2
25377    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25378
25379/* ------------------------------ */
25380    .balign 64
25381.L_ALT_OP_UNUSED_DEFF: /* 0x1de */
25382/* File: armv5te/alt_stub.S */
25383/*
25384 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25385 * any interesting requests and then jump to the real instruction
25386 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25387 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25388 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25389 * bail to the real handler if breakFlags==0.
25390 */
25391    ldrb   r3, [rSELF, #offThread_breakFlags]
25392    adrl   lr, dvmAsmInstructionStart + (478 * 64)
25393    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25394    cmp    r3, #0
25395    bxeq   lr                   @ nothing to do - jump to real handler
25396    EXPORT_PC()
25397    mov    r0, rPC              @ arg0
25398    mov    r1, rFP              @ arg1
25399    mov    r2, rSELF            @ arg2
25400    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25401
25402/* ------------------------------ */
25403    .balign 64
25404.L_ALT_OP_UNUSED_DFFF: /* 0x1df */
25405/* File: armv5te/alt_stub.S */
25406/*
25407 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25408 * any interesting requests and then jump to the real instruction
25409 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25410 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25411 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25412 * bail to the real handler if breakFlags==0.
25413 */
25414    ldrb   r3, [rSELF, #offThread_breakFlags]
25415    adrl   lr, dvmAsmInstructionStart + (479 * 64)
25416    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25417    cmp    r3, #0
25418    bxeq   lr                   @ nothing to do - jump to real handler
25419    EXPORT_PC()
25420    mov    r0, rPC              @ arg0
25421    mov    r1, rFP              @ arg1
25422    mov    r2, rSELF            @ arg2
25423    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25424
25425/* ------------------------------ */
25426    .balign 64
25427.L_ALT_OP_UNUSED_E0FF: /* 0x1e0 */
25428/* File: armv5te/alt_stub.S */
25429/*
25430 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25431 * any interesting requests and then jump to the real instruction
25432 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25433 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25434 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25435 * bail to the real handler if breakFlags==0.
25436 */
25437    ldrb   r3, [rSELF, #offThread_breakFlags]
25438    adrl   lr, dvmAsmInstructionStart + (480 * 64)
25439    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25440    cmp    r3, #0
25441    bxeq   lr                   @ nothing to do - jump to real handler
25442    EXPORT_PC()
25443    mov    r0, rPC              @ arg0
25444    mov    r1, rFP              @ arg1
25445    mov    r2, rSELF            @ arg2
25446    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25447
25448/* ------------------------------ */
25449    .balign 64
25450.L_ALT_OP_UNUSED_E1FF: /* 0x1e1 */
25451/* File: armv5te/alt_stub.S */
25452/*
25453 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25454 * any interesting requests and then jump to the real instruction
25455 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25456 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25457 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25458 * bail to the real handler if breakFlags==0.
25459 */
25460    ldrb   r3, [rSELF, #offThread_breakFlags]
25461    adrl   lr, dvmAsmInstructionStart + (481 * 64)
25462    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25463    cmp    r3, #0
25464    bxeq   lr                   @ nothing to do - jump to real handler
25465    EXPORT_PC()
25466    mov    r0, rPC              @ arg0
25467    mov    r1, rFP              @ arg1
25468    mov    r2, rSELF            @ arg2
25469    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25470
25471/* ------------------------------ */
25472    .balign 64
25473.L_ALT_OP_UNUSED_E2FF: /* 0x1e2 */
25474/* File: armv5te/alt_stub.S */
25475/*
25476 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25477 * any interesting requests and then jump to the real instruction
25478 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25479 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25480 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25481 * bail to the real handler if breakFlags==0.
25482 */
25483    ldrb   r3, [rSELF, #offThread_breakFlags]
25484    adrl   lr, dvmAsmInstructionStart + (482 * 64)
25485    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25486    cmp    r3, #0
25487    bxeq   lr                   @ nothing to do - jump to real handler
25488    EXPORT_PC()
25489    mov    r0, rPC              @ arg0
25490    mov    r1, rFP              @ arg1
25491    mov    r2, rSELF            @ arg2
25492    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25493
25494/* ------------------------------ */
25495    .balign 64
25496.L_ALT_OP_UNUSED_E3FF: /* 0x1e3 */
25497/* File: armv5te/alt_stub.S */
25498/*
25499 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25500 * any interesting requests and then jump to the real instruction
25501 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25502 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25503 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25504 * bail to the real handler if breakFlags==0.
25505 */
25506    ldrb   r3, [rSELF, #offThread_breakFlags]
25507    adrl   lr, dvmAsmInstructionStart + (483 * 64)
25508    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25509    cmp    r3, #0
25510    bxeq   lr                   @ nothing to do - jump to real handler
25511    EXPORT_PC()
25512    mov    r0, rPC              @ arg0
25513    mov    r1, rFP              @ arg1
25514    mov    r2, rSELF            @ arg2
25515    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25516
25517/* ------------------------------ */
25518    .balign 64
25519.L_ALT_OP_UNUSED_E4FF: /* 0x1e4 */
25520/* File: armv5te/alt_stub.S */
25521/*
25522 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25523 * any interesting requests and then jump to the real instruction
25524 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25525 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25526 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25527 * bail to the real handler if breakFlags==0.
25528 */
25529    ldrb   r3, [rSELF, #offThread_breakFlags]
25530    adrl   lr, dvmAsmInstructionStart + (484 * 64)
25531    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25532    cmp    r3, #0
25533    bxeq   lr                   @ nothing to do - jump to real handler
25534    EXPORT_PC()
25535    mov    r0, rPC              @ arg0
25536    mov    r1, rFP              @ arg1
25537    mov    r2, rSELF            @ arg2
25538    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25539
25540/* ------------------------------ */
25541    .balign 64
25542.L_ALT_OP_UNUSED_E5FF: /* 0x1e5 */
25543/* File: armv5te/alt_stub.S */
25544/*
25545 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25546 * any interesting requests and then jump to the real instruction
25547 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25548 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25549 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25550 * bail to the real handler if breakFlags==0.
25551 */
25552    ldrb   r3, [rSELF, #offThread_breakFlags]
25553    adrl   lr, dvmAsmInstructionStart + (485 * 64)
25554    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25555    cmp    r3, #0
25556    bxeq   lr                   @ nothing to do - jump to real handler
25557    EXPORT_PC()
25558    mov    r0, rPC              @ arg0
25559    mov    r1, rFP              @ arg1
25560    mov    r2, rSELF            @ arg2
25561    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25562
25563/* ------------------------------ */
25564    .balign 64
25565.L_ALT_OP_UNUSED_E6FF: /* 0x1e6 */
25566/* File: armv5te/alt_stub.S */
25567/*
25568 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25569 * any interesting requests and then jump to the real instruction
25570 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25571 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25572 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25573 * bail to the real handler if breakFlags==0.
25574 */
25575    ldrb   r3, [rSELF, #offThread_breakFlags]
25576    adrl   lr, dvmAsmInstructionStart + (486 * 64)
25577    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25578    cmp    r3, #0
25579    bxeq   lr                   @ nothing to do - jump to real handler
25580    EXPORT_PC()
25581    mov    r0, rPC              @ arg0
25582    mov    r1, rFP              @ arg1
25583    mov    r2, rSELF            @ arg2
25584    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25585
25586/* ------------------------------ */
25587    .balign 64
25588.L_ALT_OP_UNUSED_E7FF: /* 0x1e7 */
25589/* File: armv5te/alt_stub.S */
25590/*
25591 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25592 * any interesting requests and then jump to the real instruction
25593 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25594 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25595 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25596 * bail to the real handler if breakFlags==0.
25597 */
25598    ldrb   r3, [rSELF, #offThread_breakFlags]
25599    adrl   lr, dvmAsmInstructionStart + (487 * 64)
25600    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25601    cmp    r3, #0
25602    bxeq   lr                   @ nothing to do - jump to real handler
25603    EXPORT_PC()
25604    mov    r0, rPC              @ arg0
25605    mov    r1, rFP              @ arg1
25606    mov    r2, rSELF            @ arg2
25607    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25608
25609/* ------------------------------ */
25610    .balign 64
25611.L_ALT_OP_UNUSED_E8FF: /* 0x1e8 */
25612/* File: armv5te/alt_stub.S */
25613/*
25614 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25615 * any interesting requests and then jump to the real instruction
25616 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25617 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25618 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25619 * bail to the real handler if breakFlags==0.
25620 */
25621    ldrb   r3, [rSELF, #offThread_breakFlags]
25622    adrl   lr, dvmAsmInstructionStart + (488 * 64)
25623    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25624    cmp    r3, #0
25625    bxeq   lr                   @ nothing to do - jump to real handler
25626    EXPORT_PC()
25627    mov    r0, rPC              @ arg0
25628    mov    r1, rFP              @ arg1
25629    mov    r2, rSELF            @ arg2
25630    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25631
25632/* ------------------------------ */
25633    .balign 64
25634.L_ALT_OP_UNUSED_E9FF: /* 0x1e9 */
25635/* File: armv5te/alt_stub.S */
25636/*
25637 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25638 * any interesting requests and then jump to the real instruction
25639 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25640 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25641 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25642 * bail to the real handler if breakFlags==0.
25643 */
25644    ldrb   r3, [rSELF, #offThread_breakFlags]
25645    adrl   lr, dvmAsmInstructionStart + (489 * 64)
25646    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25647    cmp    r3, #0
25648    bxeq   lr                   @ nothing to do - jump to real handler
25649    EXPORT_PC()
25650    mov    r0, rPC              @ arg0
25651    mov    r1, rFP              @ arg1
25652    mov    r2, rSELF            @ arg2
25653    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25654
25655/* ------------------------------ */
25656    .balign 64
25657.L_ALT_OP_UNUSED_EAFF: /* 0x1ea */
25658/* File: armv5te/alt_stub.S */
25659/*
25660 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25661 * any interesting requests and then jump to the real instruction
25662 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25663 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25664 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25665 * bail to the real handler if breakFlags==0.
25666 */
25667    ldrb   r3, [rSELF, #offThread_breakFlags]
25668    adrl   lr, dvmAsmInstructionStart + (490 * 64)
25669    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25670    cmp    r3, #0
25671    bxeq   lr                   @ nothing to do - jump to real handler
25672    EXPORT_PC()
25673    mov    r0, rPC              @ arg0
25674    mov    r1, rFP              @ arg1
25675    mov    r2, rSELF            @ arg2
25676    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25677
25678/* ------------------------------ */
25679    .balign 64
25680.L_ALT_OP_UNUSED_EBFF: /* 0x1eb */
25681/* File: armv5te/alt_stub.S */
25682/*
25683 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25684 * any interesting requests and then jump to the real instruction
25685 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25686 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25687 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25688 * bail to the real handler if breakFlags==0.
25689 */
25690    ldrb   r3, [rSELF, #offThread_breakFlags]
25691    adrl   lr, dvmAsmInstructionStart + (491 * 64)
25692    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25693    cmp    r3, #0
25694    bxeq   lr                   @ nothing to do - jump to real handler
25695    EXPORT_PC()
25696    mov    r0, rPC              @ arg0
25697    mov    r1, rFP              @ arg1
25698    mov    r2, rSELF            @ arg2
25699    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25700
25701/* ------------------------------ */
25702    .balign 64
25703.L_ALT_OP_UNUSED_ECFF: /* 0x1ec */
25704/* File: armv5te/alt_stub.S */
25705/*
25706 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25707 * any interesting requests and then jump to the real instruction
25708 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25709 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25710 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25711 * bail to the real handler if breakFlags==0.
25712 */
25713    ldrb   r3, [rSELF, #offThread_breakFlags]
25714    adrl   lr, dvmAsmInstructionStart + (492 * 64)
25715    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25716    cmp    r3, #0
25717    bxeq   lr                   @ nothing to do - jump to real handler
25718    EXPORT_PC()
25719    mov    r0, rPC              @ arg0
25720    mov    r1, rFP              @ arg1
25721    mov    r2, rSELF            @ arg2
25722    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25723
25724/* ------------------------------ */
25725    .balign 64
25726.L_ALT_OP_UNUSED_EDFF: /* 0x1ed */
25727/* File: armv5te/alt_stub.S */
25728/*
25729 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25730 * any interesting requests and then jump to the real instruction
25731 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25732 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25733 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25734 * bail to the real handler if breakFlags==0.
25735 */
25736    ldrb   r3, [rSELF, #offThread_breakFlags]
25737    adrl   lr, dvmAsmInstructionStart + (493 * 64)
25738    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25739    cmp    r3, #0
25740    bxeq   lr                   @ nothing to do - jump to real handler
25741    EXPORT_PC()
25742    mov    r0, rPC              @ arg0
25743    mov    r1, rFP              @ arg1
25744    mov    r2, rSELF            @ arg2
25745    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25746
25747/* ------------------------------ */
25748    .balign 64
25749.L_ALT_OP_UNUSED_EEFF: /* 0x1ee */
25750/* File: armv5te/alt_stub.S */
25751/*
25752 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25753 * any interesting requests and then jump to the real instruction
25754 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25755 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25756 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25757 * bail to the real handler if breakFlags==0.
25758 */
25759    ldrb   r3, [rSELF, #offThread_breakFlags]
25760    adrl   lr, dvmAsmInstructionStart + (494 * 64)
25761    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25762    cmp    r3, #0
25763    bxeq   lr                   @ nothing to do - jump to real handler
25764    EXPORT_PC()
25765    mov    r0, rPC              @ arg0
25766    mov    r1, rFP              @ arg1
25767    mov    r2, rSELF            @ arg2
25768    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25769
25770/* ------------------------------ */
25771    .balign 64
25772.L_ALT_OP_UNUSED_EFFF: /* 0x1ef */
25773/* File: armv5te/alt_stub.S */
25774/*
25775 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25776 * any interesting requests and then jump to the real instruction
25777 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25778 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25779 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25780 * bail to the real handler if breakFlags==0.
25781 */
25782    ldrb   r3, [rSELF, #offThread_breakFlags]
25783    adrl   lr, dvmAsmInstructionStart + (495 * 64)
25784    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25785    cmp    r3, #0
25786    bxeq   lr                   @ nothing to do - jump to real handler
25787    EXPORT_PC()
25788    mov    r0, rPC              @ arg0
25789    mov    r1, rFP              @ arg1
25790    mov    r2, rSELF            @ arg2
25791    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25792
25793/* ------------------------------ */
25794    .balign 64
25795.L_ALT_OP_UNUSED_F0FF: /* 0x1f0 */
25796/* File: armv5te/alt_stub.S */
25797/*
25798 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25799 * any interesting requests and then jump to the real instruction
25800 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25801 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25802 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25803 * bail to the real handler if breakFlags==0.
25804 */
25805    ldrb   r3, [rSELF, #offThread_breakFlags]
25806    adrl   lr, dvmAsmInstructionStart + (496 * 64)
25807    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25808    cmp    r3, #0
25809    bxeq   lr                   @ nothing to do - jump to real handler
25810    EXPORT_PC()
25811    mov    r0, rPC              @ arg0
25812    mov    r1, rFP              @ arg1
25813    mov    r2, rSELF            @ arg2
25814    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25815
25816/* ------------------------------ */
25817    .balign 64
25818.L_ALT_OP_UNUSED_F1FF: /* 0x1f1 */
25819/* File: armv5te/alt_stub.S */
25820/*
25821 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25822 * any interesting requests and then jump to the real instruction
25823 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25824 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25825 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25826 * bail to the real handler if breakFlags==0.
25827 */
25828    ldrb   r3, [rSELF, #offThread_breakFlags]
25829    adrl   lr, dvmAsmInstructionStart + (497 * 64)
25830    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25831    cmp    r3, #0
25832    bxeq   lr                   @ nothing to do - jump to real handler
25833    EXPORT_PC()
25834    mov    r0, rPC              @ arg0
25835    mov    r1, rFP              @ arg1
25836    mov    r2, rSELF            @ arg2
25837    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25838
25839/* ------------------------------ */
25840    .balign 64
25841.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
25842/* File: armv5te/alt_stub.S */
25843/*
25844 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25845 * any interesting requests and then jump to the real instruction
25846 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25847 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25848 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25849 * bail to the real handler if breakFlags==0.
25850 */
25851    ldrb   r3, [rSELF, #offThread_breakFlags]
25852    adrl   lr, dvmAsmInstructionStart + (498 * 64)
25853    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25854    cmp    r3, #0
25855    bxeq   lr                   @ nothing to do - jump to real handler
25856    EXPORT_PC()
25857    mov    r0, rPC              @ arg0
25858    mov    r1, rFP              @ arg1
25859    mov    r2, rSELF            @ arg2
25860    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25861
25862/* ------------------------------ */
25863    .balign 64
25864.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
25865/* File: armv5te/alt_stub.S */
25866/*
25867 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25868 * any interesting requests and then jump to the real instruction
25869 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25870 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25871 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25872 * bail to the real handler if breakFlags==0.
25873 */
25874    ldrb   r3, [rSELF, #offThread_breakFlags]
25875    adrl   lr, dvmAsmInstructionStart + (499 * 64)
25876    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25877    cmp    r3, #0
25878    bxeq   lr                   @ nothing to do - jump to real handler
25879    EXPORT_PC()
25880    mov    r0, rPC              @ arg0
25881    mov    r1, rFP              @ arg1
25882    mov    r2, rSELF            @ arg2
25883    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25884
25885/* ------------------------------ */
25886    .balign 64
25887.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
25888/* File: armv5te/alt_stub.S */
25889/*
25890 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25891 * any interesting requests and then jump to the real instruction
25892 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25893 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25894 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25895 * bail to the real handler if breakFlags==0.
25896 */
25897    ldrb   r3, [rSELF, #offThread_breakFlags]
25898    adrl   lr, dvmAsmInstructionStart + (500 * 64)
25899    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25900    cmp    r3, #0
25901    bxeq   lr                   @ nothing to do - jump to real handler
25902    EXPORT_PC()
25903    mov    r0, rPC              @ arg0
25904    mov    r1, rFP              @ arg1
25905    mov    r2, rSELF            @ arg2
25906    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25907
25908/* ------------------------------ */
25909    .balign 64
25910.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
25911/* File: armv5te/alt_stub.S */
25912/*
25913 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25914 * any interesting requests and then jump to the real instruction
25915 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25916 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25917 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25918 * bail to the real handler if breakFlags==0.
25919 */
25920    ldrb   r3, [rSELF, #offThread_breakFlags]
25921    adrl   lr, dvmAsmInstructionStart + (501 * 64)
25922    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25923    cmp    r3, #0
25924    bxeq   lr                   @ nothing to do - jump to real handler
25925    EXPORT_PC()
25926    mov    r0, rPC              @ arg0
25927    mov    r1, rFP              @ arg1
25928    mov    r2, rSELF            @ arg2
25929    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25930
25931/* ------------------------------ */
25932    .balign 64
25933.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
25934/* File: armv5te/alt_stub.S */
25935/*
25936 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25937 * any interesting requests and then jump to the real instruction
25938 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25939 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25940 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25941 * bail to the real handler if breakFlags==0.
25942 */
25943    ldrb   r3, [rSELF, #offThread_breakFlags]
25944    adrl   lr, dvmAsmInstructionStart + (502 * 64)
25945    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25946    cmp    r3, #0
25947    bxeq   lr                   @ nothing to do - jump to real handler
25948    EXPORT_PC()
25949    mov    r0, rPC              @ arg0
25950    mov    r1, rFP              @ arg1
25951    mov    r2, rSELF            @ arg2
25952    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25953
25954/* ------------------------------ */
25955    .balign 64
25956.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
25957/* File: armv5te/alt_stub.S */
25958/*
25959 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25960 * any interesting requests and then jump to the real instruction
25961 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25962 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25963 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25964 * bail to the real handler if breakFlags==0.
25965 */
25966    ldrb   r3, [rSELF, #offThread_breakFlags]
25967    adrl   lr, dvmAsmInstructionStart + (503 * 64)
25968    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25969    cmp    r3, #0
25970    bxeq   lr                   @ nothing to do - jump to real handler
25971    EXPORT_PC()
25972    mov    r0, rPC              @ arg0
25973    mov    r1, rFP              @ arg1
25974    mov    r2, rSELF            @ arg2
25975    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25976
25977/* ------------------------------ */
25978    .balign 64
25979.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
25980/* File: armv5te/alt_stub.S */
25981/*
25982 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25983 * any interesting requests and then jump to the real instruction
25984 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25985 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25986 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25987 * bail to the real handler if breakFlags==0.
25988 */
25989    ldrb   r3, [rSELF, #offThread_breakFlags]
25990    adrl   lr, dvmAsmInstructionStart + (504 * 64)
25991    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25992    cmp    r3, #0
25993    bxeq   lr                   @ nothing to do - jump to real handler
25994    EXPORT_PC()
25995    mov    r0, rPC              @ arg0
25996    mov    r1, rFP              @ arg1
25997    mov    r2, rSELF            @ arg2
25998    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25999
26000/* ------------------------------ */
26001    .balign 64
26002.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
26003/* File: armv5te/alt_stub.S */
26004/*
26005 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26006 * any interesting requests and then jump to the real instruction
26007 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26008 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26009 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26010 * bail to the real handler if breakFlags==0.
26011 */
26012    ldrb   r3, [rSELF, #offThread_breakFlags]
26013    adrl   lr, dvmAsmInstructionStart + (505 * 64)
26014    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26015    cmp    r3, #0
26016    bxeq   lr                   @ nothing to do - jump to real handler
26017    EXPORT_PC()
26018    mov    r0, rPC              @ arg0
26019    mov    r1, rFP              @ arg1
26020    mov    r2, rSELF            @ arg2
26021    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26022
26023/* ------------------------------ */
26024    .balign 64
26025.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
26026/* File: armv5te/alt_stub.S */
26027/*
26028 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26029 * any interesting requests and then jump to the real instruction
26030 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26031 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26032 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26033 * bail to the real handler if breakFlags==0.
26034 */
26035    ldrb   r3, [rSELF, #offThread_breakFlags]
26036    adrl   lr, dvmAsmInstructionStart + (506 * 64)
26037    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26038    cmp    r3, #0
26039    bxeq   lr                   @ nothing to do - jump to real handler
26040    EXPORT_PC()
26041    mov    r0, rPC              @ arg0
26042    mov    r1, rFP              @ arg1
26043    mov    r2, rSELF            @ arg2
26044    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26045
26046/* ------------------------------ */
26047    .balign 64
26048.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
26049/* File: armv5te/alt_stub.S */
26050/*
26051 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26052 * any interesting requests and then jump to the real instruction
26053 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26054 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26055 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26056 * bail to the real handler if breakFlags==0.
26057 */
26058    ldrb   r3, [rSELF, #offThread_breakFlags]
26059    adrl   lr, dvmAsmInstructionStart + (507 * 64)
26060    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26061    cmp    r3, #0
26062    bxeq   lr                   @ nothing to do - jump to real handler
26063    EXPORT_PC()
26064    mov    r0, rPC              @ arg0
26065    mov    r1, rFP              @ arg1
26066    mov    r2, rSELF            @ arg2
26067    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26068
26069/* ------------------------------ */
26070    .balign 64
26071.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
26072/* File: armv5te/alt_stub.S */
26073/*
26074 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26075 * any interesting requests and then jump to the real instruction
26076 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26077 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26078 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26079 * bail to the real handler if breakFlags==0.
26080 */
26081    ldrb   r3, [rSELF, #offThread_breakFlags]
26082    adrl   lr, dvmAsmInstructionStart + (508 * 64)
26083    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26084    cmp    r3, #0
26085    bxeq   lr                   @ nothing to do - jump to real handler
26086    EXPORT_PC()
26087    mov    r0, rPC              @ arg0
26088    mov    r1, rFP              @ arg1
26089    mov    r2, rSELF            @ arg2
26090    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26091
26092/* ------------------------------ */
26093    .balign 64
26094.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
26095/* File: armv5te/alt_stub.S */
26096/*
26097 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26098 * any interesting requests and then jump to the real instruction
26099 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26100 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26101 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26102 * bail to the real handler if breakFlags==0.
26103 */
26104    ldrb   r3, [rSELF, #offThread_breakFlags]
26105    adrl   lr, dvmAsmInstructionStart + (509 * 64)
26106    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26107    cmp    r3, #0
26108    bxeq   lr                   @ nothing to do - jump to real handler
26109    EXPORT_PC()
26110    mov    r0, rPC              @ arg0
26111    mov    r1, rFP              @ arg1
26112    mov    r2, rSELF            @ arg2
26113    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26114
26115/* ------------------------------ */
26116    .balign 64
26117.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
26118/* File: armv5te/alt_stub.S */
26119/*
26120 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26121 * any interesting requests and then jump to the real instruction
26122 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26123 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26124 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26125 * bail to the real handler if breakFlags==0.
26126 */
26127    ldrb   r3, [rSELF, #offThread_breakFlags]
26128    adrl   lr, dvmAsmInstructionStart + (510 * 64)
26129    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26130    cmp    r3, #0
26131    bxeq   lr                   @ nothing to do - jump to real handler
26132    EXPORT_PC()
26133    mov    r0, rPC              @ arg0
26134    mov    r1, rFP              @ arg1
26135    mov    r2, rSELF            @ arg2
26136    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26137
26138/* ------------------------------ */
26139    .balign 64
26140.L_ALT_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
26141/* File: armv5te/alt_stub.S */
26142/*
26143 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26144 * any interesting requests and then jump to the real instruction
26145 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26146 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26147 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26148 * bail to the real handler if breakFlags==0.
26149 */
26150    ldrb   r3, [rSELF, #offThread_breakFlags]
26151    adrl   lr, dvmAsmInstructionStart + (511 * 64)
26152    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26153    cmp    r3, #0
26154    bxeq   lr                   @ nothing to do - jump to real handler
26155    EXPORT_PC()
26156    mov    r0, rPC              @ arg0
26157    mov    r1, rFP              @ arg1
26158    mov    r2, rSELF            @ arg2
26159    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26160
26161    .balign 64
26162    .size   dvmAsmAltInstructionStart, .-dvmAsmAltInstructionStart
26163    .global dvmAsmAltInstructionEnd
26164dvmAsmAltInstructionEnd:
26165/* File: armv5te/footer.S */
26166/*
26167 * ===========================================================================
26168 *  Common subroutines and data
26169 * ===========================================================================
26170 */
26171
26172    .text
26173    .align  2
26174
26175#if defined(WITH_JIT)
26176
26177#if defined(WITH_SELF_VERIFICATION)
26178/*
26179 * "longjmp" to a translation after single-stepping.  Before returning
26180 * to translation, must save state for self-verification.
26181 */
26182    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26183dvmJitResumeTranslation:
26184    mov    rSELF, r0                             @ restore self
26185    mov    rPC, r1                               @ restore Dalvik pc
26186    mov    rFP, r2                               @ restore Dalvik fp
26187    ldr    r10, [rSELF,#offThread_jitResumeNPC]  @ resume address
26188    mov    r2, #0
26189    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26190    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26191    b      jitSVShadowRunStart                   @ resume as if cache hit
26192                                                 @ expects resume addr in r10
26193
26194    .global dvmJitToInterpPunt
26195dvmJitToInterpPunt:
26196    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
26197    mov    r3, #0
26198    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26199    b      jitSVShadowRunEnd            @ doesn't return
26200
26201    .global dvmJitToInterpSingleStep
26202dvmJitToInterpSingleStep:
26203    mov    rPC, r0              @ set up dalvik pc
26204    EXPORT_PC()
26205    str    lr, [rSELF,#offThread_jitResumeNPC]
26206    str    sp, [rSELF,#offThread_jitResumeNSP]
26207    str    r1, [rSELF,#offThread_jitResumeDPC]
26208    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
26209    b      jitSVShadowRunEnd            @ doesn't return
26210
26211
26212    .global dvmJitToInterpNoChainNoProfile
26213dvmJitToInterpNoChainNoProfile:
26214    mov    r0,rPC                       @ pass our target PC
26215    mov    r2,#kSVSNoProfile            @ r2<- interpreter entry point
26216    mov    r3, #0                       @ 0 means !inJitCodeCache
26217    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26218    b      jitSVShadowRunEnd            @ doesn't return
26219
26220    .global dvmJitToInterpTraceSelectNoChain
26221dvmJitToInterpTraceSelectNoChain:
26222    mov    r0,rPC                       @ pass our target PC
26223    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26224    mov    r3, #0                       @ 0 means !inJitCodeCache
26225    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26226    b      jitSVShadowRunEnd            @ doesn't return
26227
26228    .global dvmJitToInterpTraceSelect
26229dvmJitToInterpTraceSelect:
26230    ldr    r0,[lr, #-1]                 @ pass our target PC
26231    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26232    mov    r3, #0                       @ 0 means !inJitCodeCache
26233    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26234    b      jitSVShadowRunEnd            @ doesn't return
26235
26236    .global dvmJitToInterpBackwardBranch
26237dvmJitToInterpBackwardBranch:
26238    ldr    r0,[lr, #-1]                 @ pass our target PC
26239    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
26240    mov    r3, #0                       @ 0 means !inJitCodeCache
26241    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26242    b      jitSVShadowRunEnd            @ doesn't return
26243
26244    .global dvmJitToInterpNormal
26245dvmJitToInterpNormal:
26246    ldr    r0,[lr, #-1]                 @ pass our target PC
26247    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
26248    mov    r3, #0                       @ 0 means !inJitCodeCache
26249    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26250    b      jitSVShadowRunEnd            @ doesn't return
26251
26252    .global dvmJitToInterpNoChain
26253dvmJitToInterpNoChain:
26254    mov    r0,rPC                       @ pass our target PC
26255    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
26256    mov    r3, #0                       @ 0 means !inJitCodeCache
26257    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26258    b      jitSVShadowRunEnd            @ doesn't return
26259#else
26260
26261/*
26262 * "longjmp" to a translation after single-stepping.
26263 */
26264    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26265dvmJitResumeTranslation:
26266    mov    rSELF, r0                             @ restore self
26267    mov    rPC, r1                               @ restore Dalvik pc
26268    mov    rFP, r2                               @ restore Dalvik fp
26269    ldr    r0, [rSELF,#offThread_jitResumeNPC]
26270    mov    r2, #0
26271    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26272    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26273    bx     r0                                    @ resume translation
26274
26275/*
26276 * Return from the translation cache to the interpreter when the compiler is
26277 * having issues translating/executing a Dalvik instruction. We have to skip
26278 * the code cache lookup otherwise it is possible to indefinitely bouce
26279 * between the interpreter and the code cache if the instruction that fails
26280 * to be compiled happens to be at a trace start.
26281 */
26282    .global dvmJitToInterpPunt
26283dvmJitToInterpPunt:
26284    mov    rPC, r0
26285#if defined(WITH_JIT_TUNING)
26286    mov    r0,lr
26287    bl     dvmBumpPunt;
26288#endif
26289    EXPORT_PC()
26290    mov    r0, #0
26291    str    r0, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26292    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26293    FETCH_INST()
26294    GET_INST_OPCODE(ip)
26295    GOTO_OPCODE(ip)
26296
26297/*
26298 * Return to the interpreter to handle a single instruction.
26299 * We'll use the normal single-stepping mechanism via interpBreak,
26300 * but also save the native pc of the resume point in the translation
26301 * and the native sp so that we can later do the equivalent of a
26302 * longjmp() to resume.
26303 * On entry:
26304 *    dPC <= Dalvik PC of instrucion to interpret
26305 *    lr <= resume point in translation
26306 *    r1 <= Dalvik PC of next instruction
26307 */
26308    .global dvmJitToInterpSingleStep
26309dvmJitToInterpSingleStep:
26310    mov    rPC, r0              @ set up dalvik pc
26311    EXPORT_PC()
26312    str    lr, [rSELF,#offThread_jitResumeNPC]
26313    str    sp, [rSELF,#offThread_jitResumeNSP]
26314    str    r1, [rSELF,#offThread_jitResumeDPC]
26315    mov    r1, #1
26316    str    r1, [rSELF,#offThread_singleStepCount]  @ just step once
26317    mov    r0, rSELF
26318    mov    r1, #kSubModeCountedStep
26319    bl     dvmEnableSubMode     @ (self, newMode)
26320    ldr    rIBASE, [rSELF,#offThread_curHandlerTable]
26321    FETCH_INST()
26322    GET_INST_OPCODE(ip)
26323    GOTO_OPCODE(ip)
26324
26325/*
26326 * Return from the translation cache and immediately request
26327 * a translation for the exit target.  Commonly used for callees.
26328 */
26329    .global dvmJitToInterpTraceSelectNoChain
26330dvmJitToInterpTraceSelectNoChain:
26331#if defined(WITH_JIT_TUNING)
26332    bl     dvmBumpNoChain
26333#endif
26334    mov    r0,rPC
26335    mov    r1,rSELF
26336    bl     dvmJitGetTraceAddrThread @ (pc, self)
26337    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26338    mov    r1, rPC                  @ arg1 of translation may need this
26339    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26340    cmp    r0,#0                    @ !0 means translation exists
26341    bxne   r0                       @ continue native execution if so
26342    b      2f                       @ branch over to use the interpreter
26343
26344/*
26345 * Return from the translation cache and immediately request
26346 * a translation for the exit target.  Commonly used following
26347 * invokes.
26348 */
26349    .global dvmJitToInterpTraceSelect
26350dvmJitToInterpTraceSelect:
26351    ldr    rPC,[lr, #-1]           @ get our target PC
26352    add    rINST,lr,#-5            @ save start of chain branch
26353    add    rINST, #-4              @  .. which is 9 bytes back
26354    mov    r0,rPC
26355    mov    r1,rSELF
26356    bl     dvmJitGetTraceAddrThread @ (pc, self)
26357    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26358    cmp    r0,#0
26359    beq    2f
26360    mov    r1,rINST
26361    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26362    mov    r1, rPC                  @ arg1 of translation may need this
26363    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
26364    cmp    r0,#0                    @ successful chain?
26365    bxne   r0                       @ continue native execution
26366    b      toInterpreter            @ didn't chain - resume with interpreter
26367
26368/* No translation, so request one if profiling isn't disabled*/
263692:
26370    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26371    ldr    r0, [rSELF, #offThread_pJitProfTable]
26372    FETCH_INST()
26373    cmp    r0, #0
26374    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
26375    bne    common_selectTrace
26376    GET_INST_OPCODE(ip)
26377    GOTO_OPCODE(ip)
26378
26379/*
26380 * Return from the translation cache to the interpreter.
26381 * The return was done with a BLX from thumb mode, and
26382 * the following 32-bit word contains the target rPC value.
26383 * Note that lr (r14) will have its low-order bit set to denote
26384 * its thumb-mode origin.
26385 *
26386 * We'll need to stash our lr origin away, recover the new
26387 * target and then check to see if there is a translation available
26388 * for our new target.  If so, we do a translation chain and
26389 * go back to native execution.  Otherwise, it's back to the
26390 * interpreter (after treating this entry as a potential
26391 * trace start).
26392 */
26393    .global dvmJitToInterpNormal
26394dvmJitToInterpNormal:
26395    ldr    rPC,[lr, #-1]           @ get our target PC
26396    add    rINST,lr,#-5            @ save start of chain branch
26397    add    rINST,#-4               @ .. which is 9 bytes back
26398#if defined(WITH_JIT_TUNING)
26399    bl     dvmBumpNormal
26400#endif
26401    mov    r0,rPC
26402    mov    r1,rSELF
26403    bl     dvmJitGetTraceAddrThread @ (pc, self)
26404    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26405    cmp    r0,#0
26406    beq    toInterpreter            @ go if not, otherwise do chain
26407    mov    r1,rINST
26408    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26409    mov    r1, rPC                  @ arg1 of translation may need this
26410    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26411    cmp    r0,#0                    @ successful chain?
26412    bxne   r0                       @ continue native execution
26413    b      toInterpreter            @ didn't chain - resume with interpreter
26414
26415/*
26416 * Return from the translation cache to the interpreter to do method invocation.
26417 * Check if translation exists for the callee, but don't chain to it.
26418 */
26419    .global dvmJitToInterpNoChainNoProfile
26420dvmJitToInterpNoChainNoProfile:
26421#if defined(WITH_JIT_TUNING)
26422    bl     dvmBumpNoChain
26423#endif
26424    mov    r0,rPC
26425    mov    r1,rSELF
26426    bl     dvmJitGetTraceAddrThread @ (pc, self)
26427    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26428    mov    r1, rPC                  @ arg1 of translation may need this
26429    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26430    cmp    r0,#0
26431    bxne   r0                       @ continue native execution if so
26432    EXPORT_PC()
26433    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26434    FETCH_INST()
26435    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26436    GOTO_OPCODE(ip)                     @ jump to next instruction
26437
26438/*
26439 * Return from the translation cache to the interpreter to do method invocation.
26440 * Check if translation exists for the callee, but don't chain to it.
26441 */
26442    .global dvmJitToInterpNoChain
26443dvmJitToInterpNoChain:
26444#if defined(WITH_JIT_TUNING)
26445    bl     dvmBumpNoChain
26446#endif
26447    mov    r0,rPC
26448    mov    r1,rSELF
26449    bl     dvmJitGetTraceAddrThread @ (pc, self)
26450    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26451    mov    r1, rPC                  @ arg1 of translation may need this
26452    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26453    cmp    r0,#0
26454    bxne   r0                       @ continue native execution if so
26455#endif
26456
26457/*
26458 * No translation, restore interpreter regs and start interpreting.
26459 * rSELF & rFP were preserved in the translated code, and rPC has
26460 * already been restored by the time we get here.  We'll need to set
26461 * up rIBASE & rINST, and load the address of the JitTable into r0.
26462 */
26463toInterpreter:
26464    EXPORT_PC()
26465    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26466    FETCH_INST()
26467    ldr    r0, [rSELF, #offThread_pJitProfTable]
26468    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26469    @ NOTE: intended fallthrough
26470
26471/*
26472 * Similar to common_updateProfile, but tests for null pJitProfTable
26473 * r0 holds pJifProfTAble, rINST is loaded, rPC is current and
26474 * rIBASE has been recently refreshed.
26475 */
26476common_testUpdateProfile:
26477    cmp     r0, #0               @ JIT switched off?
26478    beq     4f                   @ return to interp if so
26479
26480/*
26481 * Common code to update potential trace start counter, and initiate
26482 * a trace-build if appropriate.
26483 * On entry here:
26484 *    r0    <= pJitProfTable (verified non-NULL)
26485 *    rPC   <= Dalvik PC
26486 *    rINST <= next instruction
26487 */
26488common_updateProfile:
26489    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
26490    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
26491    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
26492    GET_INST_OPCODE(ip)
26493    subs    r1,r1,#1           @ decrement counter
26494    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
26495    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
26496
26497    /* Looks good, reset the counter */
26498    ldr     r1, [rSELF, #offThread_jitThreshold]
26499    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
26500    EXPORT_PC()
26501    mov     r0,rPC
26502    mov     r1,rSELF
26503    bl      dvmJitGetTraceAddrThread    @ (pc, self)
26504    str     r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26505    mov     r1, rPC                     @ arg1 of translation may need this
26506    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
26507    cmp     r0,#0
26508#if !defined(WITH_SELF_VERIFICATION)
26509    bxne    r0                          @ jump to the translation
26510    mov     r2,#kJitTSelectRequest      @ ask for trace selection
26511    @ fall-through to common_selectTrace
26512#else
26513    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
26514    beq     common_selectTrace
26515    /*
26516     * At this point, we have a target translation.  However, if
26517     * that translation is actually the interpret-only pseudo-translation
26518     * we want to treat it the same as no translation.
26519     */
26520    mov     r10, r0                     @ save target
26521    bl      dvmCompilerGetInterpretTemplate
26522    cmp     r0, r10                     @ special case?
26523    bne     jitSVShadowRunStart         @ set up self verification shadow space
26524    @ Need to clear the inJitCodeCache flag
26525    mov    r3, #0                       @ 0 means not in the JIT code cache
26526    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26527    GET_INST_OPCODE(ip)
26528    GOTO_OPCODE(ip)
26529    /* no return */
26530#endif
26531
26532/*
26533 * On entry:
26534 *  r2 is jit state.
26535 */
26536common_selectTrace:
26537    ldrh    r0,[rSELF,#offThread_subMode]
26538    ands    r0, #(kSubModeJitTraceBuild | kSubModeJitSV)
26539    bne     3f                         @ already doing JIT work, continue
26540    str     r2,[rSELF,#offThread_jitState]
26541    mov     r0, rSELF
26542/*
26543 * Call out to validate trace-building request.  If successful,
26544 * rIBASE will be swapped to to send us into single-stepping trace
26545 * building mode, so we need to refresh before we continue.
26546 */
26547    EXPORT_PC()
26548    SAVE_PC_FP_TO_SELF()                 @ copy of pc/fp to Thread
26549    bl      dvmJitCheckTraceRequest
265503:
26551    FETCH_INST()
26552    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
265534:
26554    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26555    GOTO_OPCODE(ip)
26556    /* no return */
26557#endif
26558
26559#if defined(WITH_SELF_VERIFICATION)
26560/*
26561 * Save PC and registers to shadow memory for self verification mode
26562 * before jumping to native translation.
26563 * On entry:
26564 *    rPC, rFP, rSELF: the values that they should contain
26565 *    r10: the address of the target translation.
26566 */
26567jitSVShadowRunStart:
26568    mov     r0,rPC                      @ r0<- program counter
26569    mov     r1,rFP                      @ r1<- frame pointer
26570    mov     r2,rSELF                    @ r2<- self (Thread) pointer
26571    mov     r3,r10                      @ r3<- target translation
26572    bl      dvmSelfVerificationSaveState @ save registers to shadow space
26573    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
26574    bx      r10                         @ jump to the translation
26575
26576/*
26577 * Restore PC, registers, and interpreter state to original values
26578 * before jumping back to the interpreter.
26579 * On entry:
26580 *   r0:  dPC
26581 *   r2:  self verification state
26582 */
26583jitSVShadowRunEnd:
26584    mov    r1,rFP                        @ pass ending fp
26585    mov    r3,rSELF                      @ pass self ptr for convenience
26586    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
26587    LOAD_PC_FP_FROM_SELF()               @ restore pc, fp
26588    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
26589    cmp    r1,#0                         @ check for punt condition
26590    beq    1f
26591    @ Set up SV single-stepping
26592    mov    r0, rSELF
26593    mov    r1, #kSubModeJitSV
26594    bl     dvmEnableSubMode              @ (self, subMode)
26595    mov    r2,#kJitSelfVerification      @ ask for self verification
26596    str    r2,[rSELF,#offThread_jitState]
26597    @ intentional fallthrough
265981:                                       @ exit to interpreter without check
26599    EXPORT_PC()
26600    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26601    FETCH_INST()
26602    GET_INST_OPCODE(ip)
26603    GOTO_OPCODE(ip)
26604#endif
26605
26606/*
26607 * The equivalent of "goto bail", this calls through the "bail handler".
26608 * It will end this interpreter activation, and return to the caller
26609 * of dvmMterpStdRun.
26610 *
26611 * State registers will be saved to the "thread" area before bailing
26612 * debugging purposes
26613 */
26614common_gotoBail:
26615    SAVE_PC_FP_TO_SELF()                @ export state to "thread"
26616    mov     r0, rSELF                   @ r0<- self ptr
26617    b       dvmMterpStdBail             @ call(self, changeInterp)
26618
26619/*
26620 * The JIT's invoke method needs to remember the callsite class and
26621 * target pair.  Save them here so that they are available to
26622 * dvmCheckJit following the interpretation of this invoke.
26623 */
26624#if defined(WITH_JIT)
26625save_callsiteinfo:
26626    cmp     r9, #0
26627    ldrne   r9, [r9, #offObject_clazz]
26628    str     r0, [rSELF, #offThread_methodToCall]
26629    str     r9, [rSELF, #offThread_callsiteClass]
26630    bx      lr
26631#endif
26632
26633/*
26634 * Common code for jumbo method invocation.
26635 * NOTE: this adjusts rPC to account for the difference in instruction width.
26636 * As a result, the savedPc in the stack frame will not be wholly accurate. So
26637 * long as that is only used for source file line number calculations, we're
26638 * okay.
26639 */
26640common_invokeMethodJumboNoThis:
26641#if defined(WITH_JIT)
26642 /* On entry: r0 is "Method* methodToCall */
26643    mov     r9, #0                      @ clear "this"
26644#endif
26645common_invokeMethodJumbo:
26646 /* On entry: r0 is "Method* methodToCall, r9 is "this" */
26647.LinvokeNewJumbo:
26648#if defined(WITH_JIT)
26649    ldrh    r1, [rSELF, #offThread_subMode]
26650    ands    r1, #kSubModeJitTraceBuild
26651    blne    save_callsiteinfo
26652#endif
26653    @ prepare to copy args to "outs" area of current frame
26654    add     rPC, rPC, #4                @ adjust pc to make return consistent
26655    FETCH(r2, 1)                        @ r2<- BBBB (arg count)
26656    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26657    cmp     r2, #0                      @ no args?
26658    beq     .LinvokeArgsDone            @ if no args, skip the rest
26659    FETCH(r1, 2)                        @ r1<- CCCC
26660    b       .LinvokeRangeArgs           @ handle args like invoke range
26661
26662/*
26663 * Common code for method invocation with range.
26664 *
26665 * On entry:
26666 *  r0 is "Method* methodToCall", r9 is "this"
26667 */
26668common_invokeMethodRange:
26669.LinvokeNewRange:
26670#if defined(WITH_JIT)
26671    ldrh    r1, [rSELF, #offThread_subMode]
26672    ands    r1, #kSubModeJitTraceBuild
26673    blne    save_callsiteinfo
26674#endif
26675    @ prepare to copy args to "outs" area of current frame
26676    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
26677    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26678    beq     .LinvokeArgsDone            @ if no args, skip the rest
26679    FETCH(r1, 2)                        @ r1<- CCCC
26680
26681.LinvokeRangeArgs:
26682    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
26683    @ (very few methods have > 10 args; could unroll for common cases)
26684    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
26685    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
266861:  ldr     r1, [r3], #4                @ val = *fp++
26687    subs    r2, r2, #1                  @ count--
26688    str     r1, [r10], #4               @ *outs++ = val
26689    bne     1b                          @ ...while count != 0
26690    b       .LinvokeArgsDone
26691
26692/*
26693 * Common code for method invocation without range.
26694 *
26695 * On entry:
26696 *  r0 is "Method* methodToCall", r9 is "this"
26697 */
26698common_invokeMethodNoRange:
26699.LinvokeNewNoRange:
26700#if defined(WITH_JIT)
26701    ldrh    r1, [rSELF, #offThread_subMode]
26702    ands    r1, #kSubModeJitTraceBuild
26703    blne    save_callsiteinfo
26704#endif
26705    @ prepare to copy args to "outs" area of current frame
26706    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
26707    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26708    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
26709    beq     .LinvokeArgsDone
26710
26711    @ r0=methodToCall, r1=GFED, r2=count, r10=outs
26712.LinvokeNonRange:
26713    rsb     r2, r2, #5                  @ r2<- 5-r2
26714    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
26715    bl      common_abort                @ (skipped due to ARM prefetch)
267165:  and     ip, rINST, #0x0f00          @ isolate A
26717    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
26718    mov     r0, r0                      @ nop
26719    str     r2, [r10, #-4]!             @ *--outs = vA
267204:  and     ip, r1, #0xf000             @ isolate G
26721    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
26722    mov     r0, r0                      @ nop
26723    str     r2, [r10, #-4]!             @ *--outs = vG
267243:  and     ip, r1, #0x0f00             @ isolate F
26725    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
26726    mov     r0, r0                      @ nop
26727    str     r2, [r10, #-4]!             @ *--outs = vF
267282:  and     ip, r1, #0x00f0             @ isolate E
26729    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
26730    mov     r0, r0                      @ nop
26731    str     r2, [r10, #-4]!             @ *--outs = vE
267321:  and     ip, r1, #0x000f             @ isolate D
26733    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
26734    mov     r0, r0                      @ nop
26735    str     r2, [r10, #-4]!             @ *--outs = vD
267360:  @ fall through to .LinvokeArgsDone
26737
26738.LinvokeArgsDone: @ r0=methodToCall
26739    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
26740    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
26741    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
26742    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
26743    @ find space for the new stack frame, check for overflow
26744    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
26745    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
26746    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
26747@    bl      common_dumpRegs
26748    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
26749    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
26750    cmp     r3, r9                      @ bottom < interpStackEnd?
26751    ldrh    lr, [rSELF, #offThread_subMode]
26752    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
26753    blo     .LstackOverflow             @ yes, this frame will overflow stack
26754
26755    @ set up newSaveArea
26756#ifdef EASY_GDB
26757    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
26758    str     ip, [r10, #offStackSaveArea_prevSave]
26759#endif
26760    str     rFP, [r10, #offStackSaveArea_prevFrame]
26761    str     rPC, [r10, #offStackSaveArea_savedPc]
26762#if defined(WITH_JIT)
26763    mov     r9, #0
26764    str     r9, [r10, #offStackSaveArea_returnAddr]
26765#endif
26766    str     r0, [r10, #offStackSaveArea_method]
26767
26768    @ Profiling?
26769    cmp     lr, #0                      @ any special modes happening?
26770    bne     2f                          @ go if so
267711:
26772    tst     r3, #ACC_NATIVE
26773    bne     .LinvokeNative
26774
26775    /*
26776    stmfd   sp!, {r0-r3}
26777    bl      common_printNewline
26778    mov     r0, rFP
26779    mov     r1, #0
26780    bl      dvmDumpFp
26781    ldmfd   sp!, {r0-r3}
26782    stmfd   sp!, {r0-r3}
26783    mov     r0, r1
26784    mov     r1, r10
26785    bl      dvmDumpFp
26786    bl      common_printNewline
26787    ldmfd   sp!, {r0-r3}
26788    */
26789
26790    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
26791    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
26792    mov     rPC, r2                         @ publish new rPC
26793
26794    @ Update state values for the new method
26795    @ r0=methodToCall, r1=newFp, r3=newMethodClass, r9=newINST
26796    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
26797    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
26798    mov     r2, #1
26799    str     r2, [rSELF, #offThread_debugIsMethodEntry]
26800#if defined(WITH_JIT)
26801    ldr     r0, [rSELF, #offThread_pJitProfTable]
26802    mov     rFP, r1                         @ fp = newFp
26803    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
26804    mov     rINST, r9                       @ publish new rINST
26805    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26806    cmp     r0,#0
26807    bne     common_updateProfile
26808    GOTO_OPCODE(ip)                         @ jump to next instruction
26809#else
26810    mov     rFP, r1                         @ fp = newFp
26811    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
26812    mov     rINST, r9                       @ publish new rINST
26813    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26814    GOTO_OPCODE(ip)                         @ jump to next instruction
26815#endif
26816
268172:
26818    @ Profiling - record method entry.  r0: methodToCall
26819    stmfd   sp!, {r0-r3}                @ preserve r0-r3
26820    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
26821    mov     r1, r0
26822    mov     r0, rSELF
26823    bl      dvmReportInvoke             @ (self, method)
26824    ldmfd   sp!, {r0-r3}                @ restore r0-r3
26825    b       1b
26826
26827.LinvokeNative:
26828    @ Prep for the native call
26829    @ r0=methodToCall, r1=newFp, r10=newSaveArea
26830    ldrh    lr, [rSELF, #offThread_subMode]
26831    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
26832    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26833    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
26834    mov     r2, r0                      @ r2<- methodToCall
26835    mov     r0, r1                      @ r0<- newFp (points to args)
26836    add     r1, rSELF, #offThread_retval  @ r1<- &retval
26837    mov     r3, rSELF                   @ arg3<- self
26838
26839#ifdef ASSIST_DEBUGGER
26840    /* insert fake function header to help gdb find the stack frame */
26841    b       .Lskip
26842    .type   dalvik_mterp, %function
26843dalvik_mterp:
26844    .fnstart
26845    MTERP_ENTRY1
26846    MTERP_ENTRY2
26847.Lskip:
26848#endif
26849
26850    cmp     lr, #0                      @ any special SubModes active?
26851    bne     11f                         @ go handle them if so
26852    mov     lr, pc                      @ set return addr
26853    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
268547:
26855
26856    @ native return; r10=newSaveArea
26857    @ equivalent to dvmPopJniLocals
26858    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
26859    ldr     r1, [rSELF, #offThread_exception] @ check for exception
26860    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
26861    cmp     r1, #0                      @ null?
26862    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
26863    bne     common_exceptionThrown      @ no, handle exception
26864
26865    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
26866    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26867    GOTO_OPCODE(ip)                     @ jump to next instruction
26868
2686911:
26870    @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
26871    stmfd   sp!, {r0-r3}                @ save all but subModes
26872    mov     r0, r2                      @ r0<- methodToCall
26873    mov     r1, rSELF
26874    mov     r2, rFP
26875    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
26876    ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
26877
26878    @ Call the native method
26879    mov     lr, pc                      @ set return addr
26880    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
26881
26882    @ Restore the pre-call arguments
26883    ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
26884
26885    @ Finish up any post-invoke subMode requirements
26886    mov     r0, r2                      @ r0<- methodToCall
26887    mov     r1, rSELF
26888    mov     r2, rFP
26889    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
26890    b       7b                          @ resume
26891
26892.LstackOverflow:    @ r0=methodToCall
26893    mov     r1, r0                      @ r1<- methodToCall
26894    mov     r0, rSELF                   @ r0<- self
26895    bl      dvmHandleStackOverflow
26896    b       common_exceptionThrown
26897#ifdef ASSIST_DEBUGGER
26898    .fnend
26899    .size   dalvik_mterp, .-dalvik_mterp
26900#endif
26901
26902
26903    /*
26904     * Common code for method invocation, calling through "glue code".
26905     *
26906     * TODO: now that we have range and non-range invoke handlers, this
26907     *       needs to be split into two.  Maybe just create entry points
26908     *       that set r9 and jump here?
26909     *
26910     * On entry:
26911     *  r0 is "Method* methodToCall", the method we're trying to call
26912     *  r9 is "bool methodCallRange", indicating if this is a /range variant
26913     */
26914     .if    0
26915.LinvokeOld:
26916    sub     sp, sp, #8                  @ space for args + pad
26917    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
26918    mov     r2, r0                      @ A2<- methodToCall
26919    mov     r0, rSELF                   @ A0<- self
26920    SAVE_PC_FP_TO_SELF()                @ export state to "self"
26921    mov     r1, r9                      @ A1<- methodCallRange
26922    mov     r3, rINST, lsr #8           @ A3<- AA
26923    str     ip, [sp, #0]                @ A4<- ip
26924    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
26925    add     sp, sp, #8                  @ remove arg area
26926    b       common_resumeAfterGlueCall  @ continue to next instruction
26927    .endif
26928
26929
26930
26931/*
26932 * Common code for handling a return instruction.
26933 *
26934 * This does not return.
26935 */
26936common_returnFromMethod:
26937.LreturnNew:
26938    ldrh    lr, [rSELF, #offThread_subMode]
26939    SAVEAREA_FROM_FP(r0, rFP)
26940    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
26941    cmp     lr, #0                      @ any special subMode handling needed?
26942    bne     19f
2694314:
26944    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
26945    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
26946                                        @ r2<- method we're returning to
26947    cmp     r2, #0                      @ is this a break frame?
26948#if defined(WORKAROUND_CORTEX_A9_745320)
26949    /* Don't use conditional loads if the HW defect exists */
26950    beq     15f
26951    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
2695215:
26953#else
26954    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
26955#endif
26956    beq     common_gotoBail             @ break frame, bail out completely
26957
26958    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
26959    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
26960    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
26961    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
26962    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
26963#if defined(WITH_JIT)
26964    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
26965    mov     rPC, r9                     @ publish new rPC
26966    str     r1, [rSELF, #offThread_methodClassDex]
26967    str     r10, [rSELF, #offThread_inJitCodeCache]  @ may return to JIT'ed land
26968    cmp     r10, #0                      @ caller is compiled code
26969    blxne   r10
26970    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26971    GOTO_OPCODE(ip)                     @ jump to next instruction
26972#else
26973    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26974    mov     rPC, r9                     @ publish new rPC
26975    str     r1, [rSELF, #offThread_methodClassDex]
26976    GOTO_OPCODE(ip)                     @ jump to next instruction
26977#endif
26978
2697919:
26980    @ Handle special actions
26981    @ On entry, r0: StackSaveArea
26982    ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
26983    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
26984    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
26985    mov     r0, rSELF
26986    bl      dvmReportReturn             @ (self)
26987    SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
26988    b       14b                         @ continue
26989
26990    /*
26991     * Return handling, calls through "glue code".
26992     */
26993     .if    0
26994.LreturnOld:
26995    SAVE_PC_FP_TO_SELF()                @ export state
26996    mov     r0, rSELF                   @ arg to function
26997    bl      dvmMterp_returnFromMethod
26998    b       common_resumeAfterGlueCall
26999    .endif
27000
27001
27002/*
27003 * Somebody has thrown an exception.  Handle it.
27004 *
27005 * If the exception processing code returns to us (instead of falling
27006 * out of the interpreter), continue with whatever the next instruction
27007 * now happens to be.
27008 *
27009 * This does not return.
27010 */
27011     .global dvmMterpCommonExceptionThrown
27012dvmMterpCommonExceptionThrown:
27013common_exceptionThrown:
27014.LexceptionNew:
27015
27016    EXPORT_PC()
27017
27018    mov     r0, rSELF
27019    bl      dvmCheckSuspendPending
27020
27021    ldr     r9, [rSELF, #offThread_exception] @ r9<- self->exception
27022    mov     r1, rSELF                   @ r1<- self
27023    mov     r0, r9                      @ r0<- exception
27024    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
27025    ldrh    r2, [rSELF, #offThread_subMode]  @ get subMode flags
27026    mov     r3, #0                      @ r3<- NULL
27027    str     r3, [rSELF, #offThread_exception] @ self->exception = NULL
27028
27029    @ Special subMode?
27030    cmp     r2, #0                      @ any special subMode handling needed?
27031    bne     7f                          @ go if so
270328:
27033    /* set up args and a local for "&fp" */
27034    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
27035    str     rFP, [sp, #-4]!             @ *--sp = fp
27036    mov     ip, sp                      @ ip<- &fp
27037    mov     r3, #0                      @ r3<- false
27038    str     ip, [sp, #-4]!              @ *--sp = &fp
27039    ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
27040    mov     r0, rSELF                   @ r0<- self
27041    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
27042    ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
27043    mov     r2, r9                      @ r2<- exception
27044    sub     r1, rPC, r1                 @ r1<- pc - method->insns
27045    mov     r1, r1, asr #1              @ r1<- offset in code units
27046
27047    /* call, r0 gets catchRelPc (a code-unit offset) */
27048    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
27049
27050    /* fix earlier stack overflow if necessary; may trash rFP */
27051    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27052    cmp     r1, #0                      @ did we overflow earlier?
27053    beq     1f                          @ no, skip ahead
27054    mov     rFP, r0                     @ save relPc result in rFP
27055    mov     r0, rSELF                   @ r0<- self
27056    mov     r1, r9                      @ r1<- exception
27057    bl      dvmCleanupStackOverflow     @ call(self)
27058    mov     r0, rFP                     @ restore result
270591:
27060
27061    /* update frame pointer and check result from dvmFindCatchBlock */
27062    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
27063    cmp     r0, #0                      @ is catchRelPc < 0?
27064    add     sp, sp, #8                  @ restore stack
27065    bmi     .LnotCaughtLocally
27066
27067    /* adjust locals to match self->interpSave.curFrame and updated PC */
27068    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
27069    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
27070    str     r1, [rSELF, #offThread_method]  @ self->method = new method
27071    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
27072    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
27073    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
27074    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
27075    str     r2, [rSELF, #offThread_methodClassDex] @ self->pDvmDex = meth...
27076
27077    /* release the tracked alloc on the exception */
27078    mov     r0, r9                      @ r0<- exception
27079    mov     r1, rSELF                   @ r1<- self
27080    bl      dvmReleaseTrackedAlloc      @ release the exception
27081
27082    /* restore the exception if the handler wants it */
27083    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
27084    FETCH_INST()                        @ load rINST from rPC
27085    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27086    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
27087    streq   r9, [rSELF, #offThread_exception] @ yes, restore the exception
27088    GOTO_OPCODE(ip)                     @ jump to next instruction
27089
27090    @ Manage debugger bookkeeping
270917:
27092    str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
27093    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
27094    mov     r0, rSELF                       @ arg0<- self
27095    mov     r1, r9                          @ arg1<- exception
27096    bl      dvmReportExceptionThrow         @ (self, exception)
27097    b       8b                              @ resume with normal handling
27098
27099.LnotCaughtLocally: @ r9=exception
27100    /* fix stack overflow if necessary */
27101    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27102    cmp     r1, #0                      @ did we overflow earlier?
27103    movne   r0, rSELF                   @ if yes: r0<- self
27104    movne   r1, r9                      @ if yes: r1<- exception
27105    blne    dvmCleanupStackOverflow     @ if yes: call(self)
27106
27107    @ may want to show "not caught locally" debug messages here
27108#if DVM_SHOW_EXCEPTION >= 2
27109    /* call __android_log_print(prio, tag, format, ...) */
27110    /* "Exception %s from %s:%d not caught locally" */
27111    @ dvmLineNumFromPC(method, pc - method->insns)
27112    ldr     r0, [rSELF, #offThread_method]
27113    ldr     r1, [r0, #offMethod_insns]
27114    sub     r1, rPC, r1
27115    asr     r1, r1, #1
27116    bl      dvmLineNumFromPC
27117    str     r0, [sp, #-4]!
27118    @ dvmGetMethodSourceFile(method)
27119    ldr     r0, [rSELF, #offThread_method]
27120    bl      dvmGetMethodSourceFile
27121    str     r0, [sp, #-4]!
27122    @ exception->clazz->descriptor
27123    ldr     r3, [r9, #offObject_clazz]
27124    ldr     r3, [r3, #offClassObject_descriptor]
27125    @
27126    ldr     r2, strExceptionNotCaughtLocally
27127    ldr     r1, strLogTag
27128    mov     r0, #3                      @ LOG_DEBUG
27129    bl      __android_log_print
27130#endif
27131    str     r9, [rSELF, #offThread_exception] @ restore exception
27132    mov     r0, r9                      @ r0<- exception
27133    mov     r1, rSELF                   @ r1<- self
27134    bl      dvmReleaseTrackedAlloc      @ release the exception
27135    b       common_gotoBail             @ bail out
27136
27137
27138    /*
27139     * Exception handling, calls through "glue code".
27140     */
27141    .if     0
27142.LexceptionOld:
27143    SAVE_PC_FP_TO_SELF()                @ export state
27144    mov     r0, rSELF                   @ arg to function
27145    bl      dvmMterp_exceptionThrown
27146    b       common_resumeAfterGlueCall
27147    .endif
27148
27149#if defined(WITH_JIT)
27150    /*
27151     * If the JIT is actively building a trace we need to make sure
27152     * that the field is fully resolved before including the current
27153     * instruction.
27154     *
27155     * On entry:
27156     *     r10: &dvmDex->pResFields[field]
27157     *     r0:  field pointer (must preserve)
27158     */
27159common_verifyField:
27160    ldrh    r3, [rSELF, #offThread_subMode]  @ r3 <- submode byte
27161    ands    r3, #kSubModeJitTraceBuild
27162    bxeq    lr                          @ Not building trace, continue
27163    ldr     r1, [r10]                   @ r1<- reload resolved StaticField ptr
27164    cmp     r1, #0                      @ resolution complete?
27165    bxne    lr                          @ yes, continue
27166    stmfd   sp!, {r0-r2,lr}             @ save regs
27167    mov     r0, rSELF
27168    mov     r1, rPC
27169    bl      dvmJitEndTraceSelect        @ (self,pc) end trace before this inst
27170    ldmfd   sp!, {r0-r2, lr}
27171    bx      lr                          @ return
27172#endif
27173
27174/*
27175 * After returning from a "glued" function, pull out the updated
27176 * values and start executing at the next instruction.
27177 */
27178common_resumeAfterGlueCall:
27179    LOAD_PC_FP_FROM_SELF()              @ pull rPC and rFP out of thread
27180    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh
27181    FETCH_INST()                        @ load rINST from rPC
27182    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27183    GOTO_OPCODE(ip)                     @ jump to next instruction
27184
27185/*
27186 * Invalid array index. Note that our calling convention is strange; we use r1
27187 * and r3 because those just happen to be the registers all our callers are
27188 * using. We move r3 before calling the C function, but r1 happens to match.
27189 * r1: index
27190 * r3: size
27191 */
27192common_errArrayIndex:
27193    EXPORT_PC()
27194    mov     r0, r3
27195    bl      dvmThrowArrayIndexOutOfBoundsException
27196    b       common_exceptionThrown
27197
27198/*
27199 * Integer divide or mod by zero.
27200 */
27201common_errDivideByZero:
27202    EXPORT_PC()
27203    ldr     r0, strDivideByZero
27204    bl      dvmThrowArithmeticException
27205    b       common_exceptionThrown
27206
27207/*
27208 * Attempt to allocate an array with a negative size.
27209 * On entry: length in r1
27210 */
27211common_errNegativeArraySize:
27212    EXPORT_PC()
27213    mov     r0, r1                                @ arg0 <- len
27214    bl      dvmThrowNegativeArraySizeException    @ (len)
27215    b       common_exceptionThrown
27216
27217/*
27218 * Invocation of a non-existent method.
27219 * On entry: method name in r1
27220 */
27221common_errNoSuchMethod:
27222    EXPORT_PC()
27223    mov     r0, r1
27224    bl      dvmThrowNoSuchMethodError
27225    b       common_exceptionThrown
27226
27227/*
27228 * We encountered a null object when we weren't expecting one.  We
27229 * export the PC, throw a NullPointerException, and goto the exception
27230 * processing code.
27231 */
27232common_errNullObject:
27233    EXPORT_PC()
27234    mov     r0, #0
27235    bl      dvmThrowNullPointerException
27236    b       common_exceptionThrown
27237
27238/*
27239 * For debugging, cause an immediate fault.  The source address will
27240 * be in lr (use a bl instruction to jump here).
27241 */
27242common_abort:
27243    ldr     pc, .LdeadFood
27244.LdeadFood:
27245    .word   0xdeadf00d
27246
27247/*
27248 * Spit out a "we were here", preserving all registers.  (The attempt
27249 * to save ip won't work, but we need to save an even number of
27250 * registers for EABI 64-bit stack alignment.)
27251 */
27252    .macro  SQUEAK num
27253common_squeak\num:
27254    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27255    ldr     r0, strSqueak
27256    mov     r1, #\num
27257    bl      printf
27258    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27259    bx      lr
27260    .endm
27261
27262    SQUEAK  0
27263    SQUEAK  1
27264    SQUEAK  2
27265    SQUEAK  3
27266    SQUEAK  4
27267    SQUEAK  5
27268
27269/*
27270 * Spit out the number in r0, preserving registers.
27271 */
27272common_printNum:
27273    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27274    mov     r1, r0
27275    ldr     r0, strSqueak
27276    bl      printf
27277    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27278    bx      lr
27279
27280/*
27281 * Print a newline, preserving registers.
27282 */
27283common_printNewline:
27284    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27285    ldr     r0, strNewline
27286    bl      printf
27287    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27288    bx      lr
27289
27290    /*
27291     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
27292     */
27293common_printHex:
27294    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27295    mov     r1, r0
27296    ldr     r0, strPrintHex
27297    bl      printf
27298    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27299    bx      lr
27300
27301/*
27302 * Print the 64-bit quantity in r0-r1, preserving registers.
27303 */
27304common_printLong:
27305    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27306    mov     r3, r1
27307    mov     r2, r0
27308    ldr     r0, strPrintLong
27309    bl      printf
27310    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27311    bx      lr
27312
27313/*
27314 * Print full method info.  Pass the Method* in r0.  Preserves regs.
27315 */
27316common_printMethod:
27317    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27318    bl      dvmMterpPrintMethod
27319    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27320    bx      lr
27321
27322/*
27323 * Call a C helper function that dumps regs and possibly some
27324 * additional info.  Requires the C function to be compiled in.
27325 */
27326    .if     0
27327common_dumpRegs:
27328    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27329    bl      dvmMterpDumpArmRegs
27330    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27331    bx      lr
27332    .endif
27333
27334#if 0
27335/*
27336 * Experiment on VFP mode.
27337 *
27338 * uint32_t setFPSCR(uint32_t val, uint32_t mask)
27339 *
27340 * Updates the bits specified by "mask", setting them to the values in "val".
27341 */
27342setFPSCR:
27343    and     r0, r0, r1                  @ make sure no stray bits are set
27344    fmrx    r2, fpscr                   @ get VFP reg
27345    mvn     r1, r1                      @ bit-invert mask
27346    and     r2, r2, r1                  @ clear masked bits
27347    orr     r2, r2, r0                  @ set specified bits
27348    fmxr    fpscr, r2                   @ set VFP reg
27349    mov     r0, r2                      @ return new value
27350    bx      lr
27351
27352    .align  2
27353    .global dvmConfigureFP
27354    .type   dvmConfigureFP, %function
27355dvmConfigureFP:
27356    stmfd   sp!, {ip, lr}
27357    /* 0x03000000 sets DN/FZ */
27358    /* 0x00009f00 clears the six exception enable flags */
27359    bl      common_squeak0
27360    mov     r0, #0x03000000             @ r0<- 0x03000000
27361    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
27362    bl      setFPSCR
27363    ldmfd   sp!, {ip, pc}
27364#endif
27365
27366
27367/*
27368 * String references, must be close to the code that uses them.
27369 */
27370    .align  2
27371strDivideByZero:
27372    .word   .LstrDivideByZero
27373strLogTag:
27374    .word   .LstrLogTag
27375strExceptionNotCaughtLocally:
27376    .word   .LstrExceptionNotCaughtLocally
27377
27378strNewline:
27379    .word   .LstrNewline
27380strSqueak:
27381    .word   .LstrSqueak
27382strPrintHex:
27383    .word   .LstrPrintHex
27384strPrintLong:
27385    .word   .LstrPrintLong
27386
27387/*
27388 * Zero-terminated ASCII string data.
27389 *
27390 * On ARM we have two choices: do like gcc does, and LDR from a .word
27391 * with the address, or use an ADR pseudo-op to get the address
27392 * directly.  ADR saves 4 bytes and an indirection, but it's using a
27393 * PC-relative addressing mode and hence has a limited range, which
27394 * makes it not work well with mergeable string sections.
27395 */
27396    .section .rodata.str1.4,"aMS",%progbits,1
27397
27398.LstrBadEntryPoint:
27399    .asciz  "Bad entry point %d\n"
27400.LstrFilledNewArrayNotImpl:
27401    .asciz  "filled-new-array only implemented for objects and 'int'"
27402.LstrDivideByZero:
27403    .asciz  "divide by zero"
27404.LstrLogTag:
27405    .asciz  "mterp"
27406.LstrExceptionNotCaughtLocally:
27407    .asciz  "Exception %s from %s:%d not caught locally\n"
27408
27409.LstrNewline:
27410    .asciz  "\n"
27411.LstrSqueak:
27412    .asciz  "<%d>"
27413.LstrPrintHex:
27414    .asciz  "<%#x>"
27415.LstrPrintLong:
27416    .asciz  "<%lld>"
27417
27418