InterpAsm-armv5te.S revision 8b095215a4d5bde723819087f3455bdcc250a78f
1/*
2 * This file was generated automatically by gen-mterp.py for 'armv5te'.
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: armv5te/platform.S */
206/*
207 * ===========================================================================
208 *  CPU-version-specific defines
209 * ===========================================================================
210 */
211
212/*
213 * Macro for data memory barrier; not meaningful pre-ARMv6K.
214 */
215.macro  SMP_DMB
216.endm
217
218/*
219 * Macro for data memory barrier; not meaningful pre-ARMv6K.
220 */
221.macro  SMP_DMB_ST
222.endm
223
224/* File: armv5te/entry.S */
225/*
226 * Copyright (C) 2008 The Android Open Source Project
227 *
228 * Licensed under the Apache License, Version 2.0 (the "License");
229 * you may not use this file except in compliance with the License.
230 * You may obtain a copy of the License at
231 *
232 *      http://www.apache.org/licenses/LICENSE-2.0
233 *
234 * Unless required by applicable law or agreed to in writing, software
235 * distributed under the License is distributed on an "AS IS" BASIS,
236 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
237 * See the License for the specific language governing permissions and
238 * limitations under the License.
239 */
240/*
241 * Interpreter entry point.
242 */
243
244/*
245 * We don't have formal stack frames, so gdb scans upward in the code
246 * to find the start of the function (a label with the %function type),
247 * and then looks at the next few instructions to figure out what
248 * got pushed onto the stack.  From this it figures out how to restore
249 * the registers, including PC, for the previous stack frame.  If gdb
250 * sees a non-function label, it stops scanning, so either we need to
251 * have nothing but assembler-local labels between the entry point and
252 * the break, or we need to fake it out.
253 *
254 * When this is defined, we add some stuff to make gdb less confused.
255 */
256#define ASSIST_DEBUGGER 1
257
258    .text
259    .align  2
260    .global dvmMterpStdRun
261    .type   dvmMterpStdRun, %function
262
263/*
264 * On entry:
265 *  r0  Thread* self
266 *
267 * The return comes via a call to dvmMterpStdBail().
268 */
269dvmMterpStdRun:
270#define MTERP_ENTRY1 \
271    .save {r4-r10,fp,lr}; \
272    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
273#define MTERP_ENTRY2 \
274    .pad    #4; \
275    sub     sp, sp, #4                  @ align 64
276
277    .fnstart
278    MTERP_ENTRY1
279    MTERP_ENTRY2
280
281    /* save stack pointer, add magic word for debuggerd */
282    str     sp, [r0, #offThread_bailPtr]  @ save SP for eventual return
283
284    /* set up "named" registers, figure out entry point */
285    mov     rSELF, r0                   @ set rSELF
286    LOAD_PC_FP_FROM_SELF()              @ load rPC and rFP from "thread"
287    ldr     rIBASE, [rSELF, #offThread_curHandlerTable] @ set rIBASE
288
289#if defined(WITH_JIT)
290.LentryInstr:
291    /* Entry is always a possible trace start */
292    ldr     r0, [rSELF, #offThread_pJitProfTable]
293    FETCH_INST()
294    mov     r1, #0                      @ prepare the value for the new state
295    str     r1, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
296    cmp     r0,#0                       @ is profiling disabled?
297#if !defined(WITH_SELF_VERIFICATION)
298    bne     common_updateProfile        @ profiling is enabled
299#else
300    ldr     r2, [rSELF, #offThread_shadowSpace] @ to find out the jit exit state
301    beq     1f                          @ profiling is disabled
302    ldr     r3, [r2, #offShadowSpace_jitExitState]  @ jit exit state
303    cmp     r3, #kSVSTraceSelect        @ hot trace following?
304    moveq   r2,#kJitTSelectRequestHot   @ ask for trace selection
305    beq     common_selectTrace          @ go build the trace
306    cmp     r3, #kSVSNoProfile          @ don't profile the next instruction?
307    beq     1f                          @ intrepret the next instruction
308    b       common_updateProfile        @ collect profiles
309#endif
3101:
311    GET_INST_OPCODE(ip)
312    GOTO_OPCODE(ip)
313#else
314    /* start executing the instruction at rPC */
315    FETCH_INST()                        @ load rINST from rPC
316    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
317    GOTO_OPCODE(ip)                     @ jump to next instruction
318#endif
319
320.Lbad_arg:
321    ldr     r0, strBadEntryPoint
322    @ r1 holds value of entryPoint
323    bl      printf
324    bl      dvmAbort
325    .fnend
326    .size   dvmMterpStdRun, .-dvmMterpStdRun
327
328
329    .global dvmMterpStdBail
330    .type   dvmMterpStdBail, %function
331
332/*
333 * Restore the stack pointer and PC from the save point established on entry.
334 * This is essentially the same as a longjmp, but should be cheaper.  The
335 * last instruction causes us to return to whoever called dvmMterpStdRun.
336 *
337 * We pushed some registers on the stack in dvmMterpStdRun, then saved
338 * SP and LR.  Here we restore SP, restore the registers, and then restore
339 * LR to PC.
340 *
341 * On entry:
342 *  r0  Thread* self
343 */
344dvmMterpStdBail:
345    ldr     sp, [r0, #offThread_bailPtr]    @ sp<- saved SP
346    add     sp, sp, #4                      @ un-align 64
347    ldmfd   sp!, {r4-r10,fp,pc}             @ restore 9 regs and return
348
349
350/*
351 * String references.
352 */
353strBadEntryPoint:
354    .word   .LstrBadEntryPoint
355
356
357    .global dvmAsmInstructionStart
358    .type   dvmAsmInstructionStart, %function
359dvmAsmInstructionStart = .L_OP_NOP
360    .text
361
362/* ------------------------------ */
363    .balign 64
364.L_OP_NOP: /* 0x00 */
365/* File: armv5te/OP_NOP.S */
366    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
367    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
368    GOTO_OPCODE(ip)                     @ execute it
369
370#ifdef ASSIST_DEBUGGER
371    /* insert fake function header to help gdb find the stack frame */
372    .type   dalvik_inst, %function
373dalvik_inst:
374    .fnstart
375    MTERP_ENTRY1
376    MTERP_ENTRY2
377    .fnend
378#endif
379
380/* ------------------------------ */
381    .balign 64
382.L_OP_MOVE: /* 0x01 */
383/* File: armv5te/OP_MOVE.S */
384    /* for move, move-object, long-to-int */
385    /* op vA, vB */
386    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
387    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
388    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
389    GET_VREG(r2, r1)                    @ r2<- fp[B]
390    and     r0, r0, #15
391    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
392    SET_VREG(r2, r0)                    @ fp[A]<- r2
393    GOTO_OPCODE(ip)                     @ execute next instruction
394
395/* ------------------------------ */
396    .balign 64
397.L_OP_MOVE_FROM16: /* 0x02 */
398/* File: armv5te/OP_MOVE_FROM16.S */
399    /* for: move/from16, move-object/from16 */
400    /* op vAA, vBBBB */
401    FETCH(r1, 1)                        @ r1<- BBBB
402    mov     r0, rINST, lsr #8           @ r0<- AA
403    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
404    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
405    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
406    SET_VREG(r2, r0)                    @ fp[AA]<- r2
407    GOTO_OPCODE(ip)                     @ jump to next instruction
408
409/* ------------------------------ */
410    .balign 64
411.L_OP_MOVE_16: /* 0x03 */
412/* File: armv5te/OP_MOVE_16.S */
413    /* for: move/16, move-object/16 */
414    /* op vAAAA, vBBBB */
415    FETCH(r1, 2)                        @ r1<- BBBB
416    FETCH(r0, 1)                        @ r0<- AAAA
417    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
418    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
419    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
420    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
421    GOTO_OPCODE(ip)                     @ jump to next instruction
422
423/* ------------------------------ */
424    .balign 64
425.L_OP_MOVE_WIDE: /* 0x04 */
426/* File: armv5te/OP_MOVE_WIDE.S */
427    /* move-wide vA, vB */
428    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
429    mov     r2, rINST, lsr #8           @ r2<- A(+)
430    mov     r3, rINST, lsr #12          @ r3<- B
431    and     r2, r2, #15
432    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
433    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
434    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
435    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
436    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
437    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
438    GOTO_OPCODE(ip)                     @ jump to next instruction
439
440/* ------------------------------ */
441    .balign 64
442.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
443/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
444    /* move-wide/from16 vAA, vBBBB */
445    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
446    FETCH(r3, 1)                        @ r3<- BBBB
447    mov     r2, rINST, lsr #8           @ r2<- AA
448    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
449    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
450    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
451    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
452    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
453    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
454    GOTO_OPCODE(ip)                     @ jump to next instruction
455
456/* ------------------------------ */
457    .balign 64
458.L_OP_MOVE_WIDE_16: /* 0x06 */
459/* File: armv5te/OP_MOVE_WIDE_16.S */
460    /* move-wide/16 vAAAA, vBBBB */
461    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
462    FETCH(r3, 2)                        @ r3<- BBBB
463    FETCH(r2, 1)                        @ r2<- AAAA
464    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
465    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
466    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
467    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
468    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
469    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
470    GOTO_OPCODE(ip)                     @ jump to next instruction
471
472/* ------------------------------ */
473    .balign 64
474.L_OP_MOVE_OBJECT: /* 0x07 */
475/* File: armv5te/OP_MOVE_OBJECT.S */
476/* File: armv5te/OP_MOVE.S */
477    /* for move, move-object, long-to-int */
478    /* op vA, vB */
479    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
480    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
481    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
482    GET_VREG(r2, r1)                    @ r2<- fp[B]
483    and     r0, r0, #15
484    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
485    SET_VREG(r2, r0)                    @ fp[A]<- r2
486    GOTO_OPCODE(ip)                     @ execute next instruction
487
488
489/* ------------------------------ */
490    .balign 64
491.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
492/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
493/* File: armv5te/OP_MOVE_FROM16.S */
494    /* for: move/from16, move-object/from16 */
495    /* op vAA, vBBBB */
496    FETCH(r1, 1)                        @ r1<- BBBB
497    mov     r0, rINST, lsr #8           @ r0<- AA
498    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
499    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
500    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
501    SET_VREG(r2, r0)                    @ fp[AA]<- r2
502    GOTO_OPCODE(ip)                     @ jump to next instruction
503
504
505/* ------------------------------ */
506    .balign 64
507.L_OP_MOVE_OBJECT_16: /* 0x09 */
508/* File: armv5te/OP_MOVE_OBJECT_16.S */
509/* File: armv5te/OP_MOVE_16.S */
510    /* for: move/16, move-object/16 */
511    /* op vAAAA, vBBBB */
512    FETCH(r1, 2)                        @ r1<- BBBB
513    FETCH(r0, 1)                        @ r0<- AAAA
514    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
515    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
516    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
517    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
518    GOTO_OPCODE(ip)                     @ jump to next instruction
519
520
521/* ------------------------------ */
522    .balign 64
523.L_OP_MOVE_RESULT: /* 0x0a */
524/* File: armv5te/OP_MOVE_RESULT.S */
525    /* for: move-result, move-result-object */
526    /* op vAA */
527    mov     r2, rINST, lsr #8           @ r2<- AA
528    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
529    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
530    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
531    SET_VREG(r0, r2)                    @ fp[AA]<- r0
532    GOTO_OPCODE(ip)                     @ jump to next instruction
533
534/* ------------------------------ */
535    .balign 64
536.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
537/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
538    /* move-result-wide vAA */
539    mov     r2, rINST, lsr #8           @ r2<- AA
540    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
541    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
542    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
543    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
544    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
545    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
546    GOTO_OPCODE(ip)                     @ jump to next instruction
547
548/* ------------------------------ */
549    .balign 64
550.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
551/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
552/* File: armv5te/OP_MOVE_RESULT.S */
553    /* for: move-result, move-result-object */
554    /* op vAA */
555    mov     r2, rINST, lsr #8           @ r2<- AA
556    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
557    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
558    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
559    SET_VREG(r0, r2)                    @ fp[AA]<- r0
560    GOTO_OPCODE(ip)                     @ jump to next instruction
561
562
563/* ------------------------------ */
564    .balign 64
565.L_OP_MOVE_EXCEPTION: /* 0x0d */
566/* File: armv5te/OP_MOVE_EXCEPTION.S */
567    /* move-exception vAA */
568    mov     r2, rINST, lsr #8           @ r2<- AA
569    ldr     r3, [rSELF, #offThread_exception]  @ r3<- dvmGetException bypass
570    mov     r1, #0                      @ r1<- 0
571    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
572    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
573    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
574    str     r1, [rSELF, #offThread_exception]  @ dvmClearException bypass
575    GOTO_OPCODE(ip)                     @ jump to next instruction
576
577/* ------------------------------ */
578    .balign 64
579.L_OP_RETURN_VOID: /* 0x0e */
580/* File: armv5te/OP_RETURN_VOID.S */
581    b       common_returnFromMethod
582
583/* ------------------------------ */
584    .balign 64
585.L_OP_RETURN: /* 0x0f */
586/* File: armv5te/OP_RETURN.S */
587    /*
588     * Return a 32-bit value.  Copies the return value into the "thread"
589     * structure, then jumps to the return handler.
590     *
591     * for: return, return-object
592     */
593    /* op vAA */
594    mov     r2, rINST, lsr #8           @ r2<- AA
595    GET_VREG(r0, r2)                    @ r0<- vAA
596    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
597    b       common_returnFromMethod
598
599/* ------------------------------ */
600    .balign 64
601.L_OP_RETURN_WIDE: /* 0x10 */
602/* File: armv5te/OP_RETURN_WIDE.S */
603    /*
604     * Return a 64-bit value.  Copies the return value into the "thread"
605     * structure, then jumps to the return handler.
606     */
607    /* return-wide vAA */
608    mov     r2, rINST, lsr #8           @ r2<- AA
609    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
610    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
611    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
612    stmia   r3, {r0-r1}                 @ retval<- r0/r1
613    b       common_returnFromMethod
614
615/* ------------------------------ */
616    .balign 64
617.L_OP_RETURN_OBJECT: /* 0x11 */
618/* File: armv5te/OP_RETURN_OBJECT.S */
619/* File: armv5te/OP_RETURN.S */
620    /*
621     * Return a 32-bit value.  Copies the return value into the "thread"
622     * structure, then jumps to the return handler.
623     *
624     * for: return, return-object
625     */
626    /* op vAA */
627    mov     r2, rINST, lsr #8           @ r2<- AA
628    GET_VREG(r0, r2)                    @ r0<- vAA
629    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
630    b       common_returnFromMethod
631
632
633/* ------------------------------ */
634    .balign 64
635.L_OP_CONST_4: /* 0x12 */
636/* File: armv5te/OP_CONST_4.S */
637    /* const/4 vA, #+B */
638    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
639    mov     r0, rINST, lsr #8           @ r0<- A+
640    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
641    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
642    and     r0, r0, #15
643    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
644    SET_VREG(r1, r0)                    @ fp[A]<- r1
645    GOTO_OPCODE(ip)                     @ execute next instruction
646
647/* ------------------------------ */
648    .balign 64
649.L_OP_CONST_16: /* 0x13 */
650/* File: armv5te/OP_CONST_16.S */
651    /* const/16 vAA, #+BBBB */
652    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
653    mov     r3, rINST, lsr #8           @ r3<- AA
654    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
655    SET_VREG(r0, r3)                    @ vAA<- r0
656    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
657    GOTO_OPCODE(ip)                     @ jump to next instruction
658
659/* ------------------------------ */
660    .balign 64
661.L_OP_CONST: /* 0x14 */
662/* File: armv5te/OP_CONST.S */
663    /* const vAA, #+BBBBbbbb */
664    mov     r3, rINST, lsr #8           @ r3<- AA
665    FETCH(r0, 1)                        @ r0<- bbbb (low)
666    FETCH(r1, 2)                        @ r1<- BBBB (high)
667    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
668    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
669    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
670    SET_VREG(r0, r3)                    @ vAA<- r0
671    GOTO_OPCODE(ip)                     @ jump to next instruction
672
673/* ------------------------------ */
674    .balign 64
675.L_OP_CONST_HIGH16: /* 0x15 */
676/* File: armv5te/OP_CONST_HIGH16.S */
677    /* const/high16 vAA, #+BBBB0000 */
678    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
679    mov     r3, rINST, lsr #8           @ r3<- AA
680    mov     r0, r0, lsl #16             @ r0<- BBBB0000
681    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
682    SET_VREG(r0, r3)                    @ vAA<- r0
683    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
684    GOTO_OPCODE(ip)                     @ jump to next instruction
685
686/* ------------------------------ */
687    .balign 64
688.L_OP_CONST_WIDE_16: /* 0x16 */
689/* File: armv5te/OP_CONST_WIDE_16.S */
690    /* const-wide/16 vAA, #+BBBB */
691    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
692    mov     r3, rINST, lsr #8           @ r3<- AA
693    mov     r1, r0, asr #31             @ r1<- ssssssss
694    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
695    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
697    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
698    GOTO_OPCODE(ip)                     @ jump to next instruction
699
700/* ------------------------------ */
701    .balign 64
702.L_OP_CONST_WIDE_32: /* 0x17 */
703/* File: armv5te/OP_CONST_WIDE_32.S */
704    /* const-wide/32 vAA, #+BBBBbbbb */
705    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
706    mov     r3, rINST, lsr #8           @ r3<- AA
707    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
708    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
709    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
710    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
711    mov     r1, r0, asr #31             @ r1<- ssssssss
712    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
713    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
714    GOTO_OPCODE(ip)                     @ jump to next instruction
715
716/* ------------------------------ */
717    .balign 64
718.L_OP_CONST_WIDE: /* 0x18 */
719/* File: armv5te/OP_CONST_WIDE.S */
720    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
721    FETCH(r0, 1)                        @ r0<- bbbb (low)
722    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
723    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
724    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
725    FETCH(r3, 4)                        @ r3<- HHHH (high)
726    mov     r9, rINST, lsr #8           @ r9<- AA
727    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
728    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
729    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
730    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
731    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
732    GOTO_OPCODE(ip)                     @ jump to next instruction
733
734/* ------------------------------ */
735    .balign 64
736.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
737/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
738    /* const-wide/high16 vAA, #+BBBB000000000000 */
739    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
740    mov     r3, rINST, lsr #8           @ r3<- AA
741    mov     r0, #0                      @ r0<- 00000000
742    mov     r1, r1, lsl #16             @ r1<- BBBB0000
743    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
744    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
745    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
746    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
747    GOTO_OPCODE(ip)                     @ jump to next instruction
748
749/* ------------------------------ */
750    .balign 64
751.L_OP_CONST_STRING: /* 0x1a */
752/* File: armv5te/OP_CONST_STRING.S */
753    /* const/string vAA, String@BBBB */
754    FETCH(r1, 1)                        @ r1<- BBBB
755    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
756    mov     r9, rINST, lsr #8           @ r9<- AA
757    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
758    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
759    cmp     r0, #0                      @ not yet resolved?
760    beq     .LOP_CONST_STRING_resolve
761    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
762    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
763    SET_VREG(r0, r9)                    @ vAA<- r0
764    GOTO_OPCODE(ip)                     @ jump to next instruction
765
766/* ------------------------------ */
767    .balign 64
768.L_OP_CONST_STRING_JUMBO: /* 0x1b */
769/* File: armv5te/OP_CONST_STRING_JUMBO.S */
770    /* const/string vAA, String@BBBBBBBB */
771    FETCH(r0, 1)                        @ r0<- bbbb (low)
772    FETCH(r1, 2)                        @ r1<- BBBB (high)
773    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
774    mov     r9, rINST, lsr #8           @ r9<- AA
775    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
776    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
777    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
778    cmp     r0, #0
779    beq     .LOP_CONST_STRING_JUMBO_resolve
780    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
781    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
782    SET_VREG(r0, r9)                    @ vAA<- r0
783    GOTO_OPCODE(ip)                     @ jump to next instruction
784
785/* ------------------------------ */
786    .balign 64
787.L_OP_CONST_CLASS: /* 0x1c */
788/* File: armv5te/OP_CONST_CLASS.S */
789    /* const/class vAA, Class@BBBB */
790    FETCH(r1, 1)                        @ r1<- BBBB
791    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
792    mov     r9, rINST, lsr #8           @ r9<- AA
793    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
794    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
795    cmp     r0, #0                      @ not yet resolved?
796    beq     .LOP_CONST_CLASS_resolve
797    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
798    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
799    SET_VREG(r0, r9)                    @ vAA<- r0
800    GOTO_OPCODE(ip)                     @ jump to next instruction
801
802/* ------------------------------ */
803    .balign 64
804.L_OP_MONITOR_ENTER: /* 0x1d */
805/* File: armv5te/OP_MONITOR_ENTER.S */
806    /*
807     * Synchronize on an object.
808     */
809    /* monitor-enter vAA */
810    mov     r2, rINST, lsr #8           @ r2<- AA
811    GET_VREG(r1, r2)                    @ r1<- vAA (object)
812    mov     r0, rSELF                   @ r0<- self
813    cmp     r1, #0                      @ null object?
814    EXPORT_PC()                         @ need for precise GC
815    beq     common_errNullObject        @ null object, throw an exception
816    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
817    bl      dvmLockObject               @ call(self, obj)
818    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
819    GOTO_OPCODE(ip)                     @ jump to next instruction
820
821/* ------------------------------ */
822    .balign 64
823.L_OP_MONITOR_EXIT: /* 0x1e */
824/* File: armv5te/OP_MONITOR_EXIT.S */
825    /*
826     * Unlock an object.
827     *
828     * Exceptions that occur when unlocking a monitor need to appear as
829     * if they happened at the following instruction.  See the Dalvik
830     * instruction spec.
831     */
832    /* monitor-exit vAA */
833    mov     r2, rINST, lsr #8           @ r2<- AA
834    EXPORT_PC()                         @ before fetch: export the PC
835    GET_VREG(r1, r2)                    @ r1<- vAA (object)
836    cmp     r1, #0                      @ null object?
837    beq     1f                          @ yes
838    mov     r0, rSELF                   @ r0<- self
839    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
840    cmp     r0, #0                      @ failed?
841    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
842    beq     common_exceptionThrown      @ yes, exception is pending
843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
844    GOTO_OPCODE(ip)                     @ jump to next instruction
8451:
846    FETCH_ADVANCE_INST(1)               @ advance before throw
847    b      common_errNullObject
848
849/* ------------------------------ */
850    .balign 64
851.L_OP_CHECK_CAST: /* 0x1f */
852/* File: armv5te/OP_CHECK_CAST.S */
853    /*
854     * Check to see if a cast from one class to another is allowed.
855     */
856    /* check-cast vAA, class@BBBB */
857    mov     r3, rINST, lsr #8           @ r3<- AA
858    FETCH(r2, 1)                        @ r2<- BBBB
859    GET_VREG(r9, r3)                    @ r9<- object
860    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
861    cmp     r9, #0                      @ is object null?
862    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
863    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
864    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
865    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
866    cmp     r1, #0                      @ have we resolved this before?
867    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
868.LOP_CHECK_CAST_resolved:
869    cmp     r0, r1                      @ same class (trivial success)?
870    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
871.LOP_CHECK_CAST_okay:
872    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
873    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
874    GOTO_OPCODE(ip)                     @ jump to next instruction
875
876/* ------------------------------ */
877    .balign 64
878.L_OP_INSTANCE_OF: /* 0x20 */
879/* File: armv5te/OP_INSTANCE_OF.S */
880    /*
881     * Check to see if an object reference is an instance of a class.
882     *
883     * Most common situation is a non-null object, being compared against
884     * an already-resolved class.
885     */
886    /* instance-of vA, vB, class@CCCC */
887    mov     r3, rINST, lsr #12          @ r3<- B
888    mov     r9, rINST, lsr #8           @ r9<- A+
889    GET_VREG(r0, r3)                    @ r0<- vB (object)
890    and     r9, r9, #15                 @ r9<- A
891    cmp     r0, #0                      @ is object null?
892    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
893    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
894    FETCH(r3, 1)                        @ r3<- CCCC
895    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
896    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
897    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
898    cmp     r1, #0                      @ have we resolved this before?
899    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
900.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
901    cmp     r0, r1                      @ same class (trivial success)?
902    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
903    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
904
905/* ------------------------------ */
906    .balign 64
907.L_OP_ARRAY_LENGTH: /* 0x21 */
908/* File: armv5te/OP_ARRAY_LENGTH.S */
909    /*
910     * Return the length of an array.
911     */
912    mov     r1, rINST, lsr #12          @ r1<- B
913    mov     r2, rINST, lsr #8           @ r2<- A+
914    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
915    and     r2, r2, #15                 @ r2<- A
916    cmp     r0, #0                      @ is object null?
917    beq     common_errNullObject        @ yup, fail
918    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
919    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
920    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
921    SET_VREG(r3, r2)                    @ vB<- length
922    GOTO_OPCODE(ip)                     @ jump to next instruction
923
924/* ------------------------------ */
925    .balign 64
926.L_OP_NEW_INSTANCE: /* 0x22 */
927/* File: armv5te/OP_NEW_INSTANCE.S */
928    /*
929     * Create a new instance of a class.
930     */
931    /* new-instance vAA, class@BBBB */
932    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
933    FETCH(r1, 1)                        @ r1<- BBBB
934    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
935    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
936#if defined(WITH_JIT)
937    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
938#endif
939    EXPORT_PC()                         @ req'd for init, resolve, alloc
940    cmp     r0, #0                      @ already resolved?
941    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
942.LOP_NEW_INSTANCE_resolved:   @ r0=class
943    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
944    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
945    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
946.LOP_NEW_INSTANCE_initialized: @ r0=class
947    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
948    bl      dvmAllocObject              @ r0<- new object
949    b       .LOP_NEW_INSTANCE_finish          @ continue
950
951/* ------------------------------ */
952    .balign 64
953.L_OP_NEW_ARRAY: /* 0x23 */
954/* File: armv5te/OP_NEW_ARRAY.S */
955    /*
956     * Allocate an array of objects, specified with the array class
957     * and a count.
958     *
959     * The verifier guarantees that this is an array class, so we don't
960     * check for it here.
961     */
962    /* new-array vA, vB, class@CCCC */
963    mov     r0, rINST, lsr #12          @ r0<- B
964    FETCH(r2, 1)                        @ r2<- CCCC
965    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
966    GET_VREG(r1, r0)                    @ r1<- vB (array length)
967    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
968    cmp     r1, #0                      @ check length
969    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
970    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
971    cmp     r0, #0                      @ already resolved?
972    EXPORT_PC()                         @ req'd for resolve, alloc
973    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
974    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
975
976/* ------------------------------ */
977    .balign 64
978.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
979/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
980    /*
981     * Create a new array with elements filled from registers.
982     *
983     * for: filled-new-array, filled-new-array/range
984     */
985    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
986    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
987    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
988    FETCH(r1, 1)                        @ r1<- BBBB
989    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
990    EXPORT_PC()                         @ need for resolve and alloc
991    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
992    mov     r10, rINST, lsr #8          @ r10<- AA or BA
993    cmp     r0, #0                      @ already resolved?
994    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
9958:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
996    mov     r2, #0                      @ r2<- false
997    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
998    bl      dvmResolveClass             @ r0<- call(clazz, ref)
999    cmp     r0, #0                      @ got null?
1000    beq     common_exceptionThrown      @ yes, handle exception
1001    b       .LOP_FILLED_NEW_ARRAY_continue
1002
1003/* ------------------------------ */
1004    .balign 64
1005.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1006/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1007/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1008    /*
1009     * Create a new array with elements filled from registers.
1010     *
1011     * for: filled-new-array, filled-new-array/range
1012     */
1013    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1014    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1015    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
1016    FETCH(r1, 1)                        @ r1<- BBBB
1017    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1018    EXPORT_PC()                         @ need for resolve and alloc
1019    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1020    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1021    cmp     r0, #0                      @ already resolved?
1022    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
10238:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1024    mov     r2, #0                      @ r2<- false
1025    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1026    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1027    cmp     r0, #0                      @ got null?
1028    beq     common_exceptionThrown      @ yes, handle exception
1029    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1030
1031
1032/* ------------------------------ */
1033    .balign 64
1034.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1035/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1036    /* fill-array-data vAA, +BBBBBBBB */
1037    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1038    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1039    mov     r3, rINST, lsr #8           @ r3<- AA
1040    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1041    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1042    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1043    EXPORT_PC();
1044    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1045    cmp     r0, #0                      @ 0 means an exception is thrown
1046    beq     common_exceptionThrown      @ has exception
1047    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1048    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1049    GOTO_OPCODE(ip)                     @ jump to next instruction
1050
1051/* ------------------------------ */
1052    .balign 64
1053.L_OP_THROW: /* 0x27 */
1054/* File: armv5te/OP_THROW.S */
1055    /*
1056     * Throw an exception object in the current thread.
1057     */
1058    /* throw vAA */
1059    mov     r2, rINST, lsr #8           @ r2<- AA
1060    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1061    EXPORT_PC()                         @ exception handler can throw
1062    cmp     r1, #0                      @ null object?
1063    beq     common_errNullObject        @ yes, throw an NPE instead
1064    @ bypass dvmSetException, just store it
1065    str     r1, [rSELF, #offThread_exception]  @ thread->exception<- obj
1066    b       common_exceptionThrown
1067
1068/* ------------------------------ */
1069    .balign 64
1070.L_OP_GOTO: /* 0x28 */
1071/* File: armv5te/OP_GOTO.S */
1072    /*
1073     * Unconditional branch, 8-bit offset.
1074     *
1075     * The branch distance is a signed code-unit offset, which we need to
1076     * double to get a byte offset.
1077     */
1078    /* goto +AA */
1079    /* tuning: use sbfx for 6t2+ targets */
1080    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1081    movs    r1, r0, asr #24             @ r1<- ssssssAA (sign-extended)
1082    add     r2, r1, r1                  @ r2<- byte offset, set flags
1083       @ If backwards branch refresh rIBASE
1084    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1085    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1086#if defined(WITH_JIT)
1087    ldr     r0, [rSELF, #offThread_pJitProfTable]
1088    bmi     common_testUpdateProfile    @ (r0) check for trace hotness
1089#endif
1090    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1091    GOTO_OPCODE(ip)                     @ jump to next instruction
1092
1093/* ------------------------------ */
1094    .balign 64
1095.L_OP_GOTO_16: /* 0x29 */
1096/* File: armv5te/OP_GOTO_16.S */
1097    /*
1098     * Unconditional branch, 16-bit offset.
1099     *
1100     * The branch distance is a signed code-unit offset, which we need to
1101     * double to get a byte offset.
1102     */
1103    /* goto/16 +AAAA */
1104    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1105    adds    r1, r0, r0                  @ r1<- byte offset, flags set
1106    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1107    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1108#if defined(WITH_JIT)
1109    ldr     r0, [rSELF, #offThread_pJitProfTable]
1110    bmi     common_testUpdateProfile    @ (r0) hot trace head?
1111#endif
1112    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1113    GOTO_OPCODE(ip)                     @ jump to next instruction
1114
1115/* ------------------------------ */
1116    .balign 64
1117.L_OP_GOTO_32: /* 0x2a */
1118/* File: armv5te/OP_GOTO_32.S */
1119    /*
1120     * Unconditional branch, 32-bit offset.
1121     *
1122     * The branch distance is a signed code-unit offset, which we need to
1123     * double to get a byte offset.
1124     *
1125     * Unlike most opcodes, this one is allowed to branch to itself, so
1126     * our "backward branch" test must be "<=0" instead of "<0".  Because
1127     * we need the V bit set, we'll use an adds to convert from Dalvik
1128     * offset to byte offset.
1129     */
1130    /* goto/32 +AAAAAAAA */
1131    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1132    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1133    orr     r0, r0, r1, lsl #16         @ r0<- AAAAaaaa
1134    adds    r1, r0, r0                  @ r1<- byte offset
1135#if defined(WITH_JIT)
1136    ldr     r0, [rSELF, #offThread_pJitProfTable]
1137    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1138    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1139    ble     common_testUpdateProfile    @ (r0) hot trace head?
1140#else
1141    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1142    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1143#endif
1144    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1145    GOTO_OPCODE(ip)                     @ jump to next instruction
1146
1147/* ------------------------------ */
1148    .balign 64
1149.L_OP_PACKED_SWITCH: /* 0x2b */
1150/* File: armv5te/OP_PACKED_SWITCH.S */
1151    /*
1152     * Handle a packed-switch or sparse-switch instruction.  In both cases
1153     * we decode it and hand it off to a helper function.
1154     *
1155     * We don't really expect backward branches in a switch statement, but
1156     * they're perfectly legal, so we check for them here.
1157     *
1158     * When the JIT is present, all targets are considered treated as
1159     * a potential trace heads regardless of branch direction.
1160     *
1161     * for: packed-switch, sparse-switch
1162     */
1163    /* op vAA, +BBBB */
1164    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1165    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1166    mov     r3, rINST, lsr #8           @ r3<- AA
1167    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1168    GET_VREG(r1, r3)                    @ r1<- vAA
1169    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1170    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1171    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1172#if defined(WITH_JIT)
1173    ldr     r0, [rSELF, #offThread_pJitProfTable]
1174    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1175    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1176    cmp     r0, #0
1177    bne     common_updateProfile
1178#else
1179    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1180    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1181#endif
1182    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1183    GOTO_OPCODE(ip)                     @ jump to next instruction
1184
1185/* ------------------------------ */
1186    .balign 64
1187.L_OP_SPARSE_SWITCH: /* 0x2c */
1188/* File: armv5te/OP_SPARSE_SWITCH.S */
1189/* File: armv5te/OP_PACKED_SWITCH.S */
1190    /*
1191     * Handle a packed-switch or sparse-switch instruction.  In both cases
1192     * we decode it and hand it off to a helper function.
1193     *
1194     * We don't really expect backward branches in a switch statement, but
1195     * they're perfectly legal, so we check for them here.
1196     *
1197     * When the JIT is present, all targets are considered treated as
1198     * a potential trace heads regardless of branch direction.
1199     *
1200     * for: packed-switch, sparse-switch
1201     */
1202    /* op vAA, +BBBB */
1203    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1204    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1205    mov     r3, rINST, lsr #8           @ r3<- AA
1206    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1207    GET_VREG(r1, r3)                    @ r1<- vAA
1208    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1209    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1210    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1211#if defined(WITH_JIT)
1212    ldr     r0, [rSELF, #offThread_pJitProfTable]
1213    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1214    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1215    cmp     r0, #0
1216    bne     common_updateProfile
1217#else
1218    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1219    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1220#endif
1221    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1222    GOTO_OPCODE(ip)                     @ jump to next instruction
1223
1224
1225/* ------------------------------ */
1226    .balign 64
1227.L_OP_CMPL_FLOAT: /* 0x2d */
1228/* File: armv5te/OP_CMPL_FLOAT.S */
1229    /*
1230     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1231     * destination register based on the results of the comparison.
1232     *
1233     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1234     * on what value we'd like to return when one of the operands is NaN.
1235     *
1236     * The operation we're implementing is:
1237     *   if (x == y)
1238     *     return 0;
1239     *   else if (x < y)
1240     *     return -1;
1241     *   else if (x > y)
1242     *     return 1;
1243     *   else
1244     *     return {-1,1};  // one or both operands was NaN
1245     *
1246     * The straightforward implementation requires 3 calls to functions
1247     * that return a result in r0.  We can do it with two calls if our
1248     * EABI library supports __aeabi_cfcmple (only one if we want to check
1249     * for NaN directly):
1250     *   check x <= y
1251     *     if <, return -1
1252     *     if ==, return 0
1253     *   check y <= x
1254     *     if <, return 1
1255     *   return {-1,1}
1256     *
1257     * for: cmpl-float, cmpg-float
1258     */
1259    /* op vAA, vBB, vCC */
1260    FETCH(r0, 1)                        @ r0<- CCBB
1261    and     r2, r0, #255                @ r2<- BB
1262    mov     r3, r0, lsr #8              @ r3<- CC
1263    GET_VREG(r9, r2)                    @ r9<- vBB
1264    GET_VREG(r10, r3)                   @ r10<- vCC
1265    mov     r0, r9                      @ copy to arg registers
1266    mov     r1, r10
1267    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1268    bhi     .LOP_CMPL_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1269    mvncc   r1, #0                      @ (less than) r1<- -1
1270    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1271.LOP_CMPL_FLOAT_finish:
1272    mov     r3, rINST, lsr #8           @ r3<- AA
1273    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1274    SET_VREG(r1, r3)                    @ vAA<- r1
1275    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1276    GOTO_OPCODE(ip)                     @ jump to next instruction
1277
1278/* ------------------------------ */
1279    .balign 64
1280.L_OP_CMPG_FLOAT: /* 0x2e */
1281/* File: armv5te/OP_CMPG_FLOAT.S */
1282/* File: armv5te/OP_CMPL_FLOAT.S */
1283    /*
1284     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1285     * destination register based on the results of the comparison.
1286     *
1287     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1288     * on what value we'd like to return when one of the operands is NaN.
1289     *
1290     * The operation we're implementing is:
1291     *   if (x == y)
1292     *     return 0;
1293     *   else if (x < y)
1294     *     return -1;
1295     *   else if (x > y)
1296     *     return 1;
1297     *   else
1298     *     return {-1,1};  // one or both operands was NaN
1299     *
1300     * The straightforward implementation requires 3 calls to functions
1301     * that return a result in r0.  We can do it with two calls if our
1302     * EABI library supports __aeabi_cfcmple (only one if we want to check
1303     * for NaN directly):
1304     *   check x <= y
1305     *     if <, return -1
1306     *     if ==, return 0
1307     *   check y <= x
1308     *     if <, return 1
1309     *   return {-1,1}
1310     *
1311     * for: cmpl-float, cmpg-float
1312     */
1313    /* op vAA, vBB, vCC */
1314    FETCH(r0, 1)                        @ r0<- CCBB
1315    and     r2, r0, #255                @ r2<- BB
1316    mov     r3, r0, lsr #8              @ r3<- CC
1317    GET_VREG(r9, r2)                    @ r9<- vBB
1318    GET_VREG(r10, r3)                   @ r10<- vCC
1319    mov     r0, r9                      @ copy to arg registers
1320    mov     r1, r10
1321    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1322    bhi     .LOP_CMPG_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1323    mvncc   r1, #0                      @ (less than) r1<- -1
1324    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1325.LOP_CMPG_FLOAT_finish:
1326    mov     r3, rINST, lsr #8           @ r3<- AA
1327    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1328    SET_VREG(r1, r3)                    @ vAA<- r1
1329    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1330    GOTO_OPCODE(ip)                     @ jump to next instruction
1331
1332
1333/* ------------------------------ */
1334    .balign 64
1335.L_OP_CMPL_DOUBLE: /* 0x2f */
1336/* File: armv5te/OP_CMPL_DOUBLE.S */
1337    /*
1338     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1339     * destination register based on the results of the comparison.
1340     *
1341     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1342     * on what value we'd like to return when one of the operands is NaN.
1343     *
1344     * See OP_CMPL_FLOAT for an explanation.
1345     *
1346     * For: cmpl-double, cmpg-double
1347     */
1348    /* op vAA, vBB, vCC */
1349    FETCH(r0, 1)                        @ r0<- CCBB
1350    and     r9, r0, #255                @ r9<- BB
1351    mov     r10, r0, lsr #8             @ r10<- CC
1352    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1353    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1354    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1355    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1356    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1357    bhi     .LOP_CMPL_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1358    mvncc   r1, #0                      @ (less than) r1<- -1
1359    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1360.LOP_CMPL_DOUBLE_finish:
1361    mov     r3, rINST, lsr #8           @ r3<- AA
1362    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1363    SET_VREG(r1, r3)                    @ vAA<- r1
1364    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1365    GOTO_OPCODE(ip)                     @ jump to next instruction
1366
1367/* ------------------------------ */
1368    .balign 64
1369.L_OP_CMPG_DOUBLE: /* 0x30 */
1370/* File: armv5te/OP_CMPG_DOUBLE.S */
1371/* File: armv5te/OP_CMPL_DOUBLE.S */
1372    /*
1373     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1374     * destination register based on the results of the comparison.
1375     *
1376     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1377     * on what value we'd like to return when one of the operands is NaN.
1378     *
1379     * See OP_CMPL_FLOAT for an explanation.
1380     *
1381     * For: cmpl-double, cmpg-double
1382     */
1383    /* op vAA, vBB, vCC */
1384    FETCH(r0, 1)                        @ r0<- CCBB
1385    and     r9, r0, #255                @ r9<- BB
1386    mov     r10, r0, lsr #8             @ r10<- CC
1387    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1388    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1389    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1390    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1391    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1392    bhi     .LOP_CMPG_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1393    mvncc   r1, #0                      @ (less than) r1<- -1
1394    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1395.LOP_CMPG_DOUBLE_finish:
1396    mov     r3, rINST, lsr #8           @ r3<- AA
1397    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1398    SET_VREG(r1, r3)                    @ vAA<- r1
1399    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1400    GOTO_OPCODE(ip)                     @ jump to next instruction
1401
1402
1403/* ------------------------------ */
1404    .balign 64
1405.L_OP_CMP_LONG: /* 0x31 */
1406/* File: armv5te/OP_CMP_LONG.S */
1407    /*
1408     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1409     * register based on the results of the comparison.
1410     *
1411     * We load the full values with LDM, but in practice many values could
1412     * be resolved by only looking at the high word.  This could be made
1413     * faster or slower by splitting the LDM into a pair of LDRs.
1414     *
1415     * If we just wanted to set condition flags, we could do this:
1416     *  subs    ip, r0, r2
1417     *  sbcs    ip, r1, r3
1418     *  subeqs  ip, r0, r2
1419     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1420     * integer value, which we can do with 2 conditional mov/mvn instructions
1421     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1422     * us a constant 5-cycle path plus a branch at the end to the
1423     * instruction epilogue code.  The multi-compare approach below needs
1424     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1425     * in the worst case (the 64-bit values are equal).
1426     */
1427    /* cmp-long vAA, vBB, vCC */
1428    FETCH(r0, 1)                        @ r0<- CCBB
1429    mov     r9, rINST, lsr #8           @ r9<- AA
1430    and     r2, r0, #255                @ r2<- BB
1431    mov     r3, r0, lsr #8              @ r3<- CC
1432    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1433    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1434    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1435    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1436    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1437    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1438    bgt     .LOP_CMP_LONG_greater
1439    subs    r1, r0, r2                  @ r1<- r0 - r2
1440    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1441    bne     .LOP_CMP_LONG_less
1442    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1443
1444/* ------------------------------ */
1445    .balign 64
1446.L_OP_IF_EQ: /* 0x32 */
1447/* File: armv5te/OP_IF_EQ.S */
1448/* File: armv5te/bincmp.S */
1449    /*
1450     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1451     * fragment that specifies the *reverse* comparison to perform, e.g.
1452     * for "if-le" you would use "gt".
1453     *
1454     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1455     */
1456    /* if-cmp vA, vB, +CCCC */
1457    mov     r0, rINST, lsr #8           @ r0<- A+
1458    mov     r1, rINST, lsr #12          @ r1<- B
1459    and     r0, r0, #15
1460    GET_VREG(r3, r1)                    @ r3<- vB
1461    GET_VREG(r2, r0)                    @ r2<- vA
1462    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1463    cmp     r2, r3                      @ compare (vA, vB)
1464    movne r1, #2                 @ r1<- BYTE branch dist for not-taken
1465    adds    r2, r1, r1                  @ convert to bytes, check sign
1466    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1467#if defined(WITH_JIT)
1468    ldr     r0, [rSELF, #offThread_pJitProfTable]
1469    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1470    cmp     r0,#0
1471    bne     common_updateProfile
1472#else
1473    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1474#endif
1475    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1476    GOTO_OPCODE(ip)                     @ jump to next instruction
1477
1478
1479/* ------------------------------ */
1480    .balign 64
1481.L_OP_IF_NE: /* 0x33 */
1482/* File: armv5te/OP_IF_NE.S */
1483/* File: armv5te/bincmp.S */
1484    /*
1485     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1486     * fragment that specifies the *reverse* comparison to perform, e.g.
1487     * for "if-le" you would use "gt".
1488     *
1489     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1490     */
1491    /* if-cmp vA, vB, +CCCC */
1492    mov     r0, rINST, lsr #8           @ r0<- A+
1493    mov     r1, rINST, lsr #12          @ r1<- B
1494    and     r0, r0, #15
1495    GET_VREG(r3, r1)                    @ r3<- vB
1496    GET_VREG(r2, r0)                    @ r2<- vA
1497    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1498    cmp     r2, r3                      @ compare (vA, vB)
1499    moveq r1, #2                 @ r1<- BYTE branch dist for not-taken
1500    adds    r2, r1, r1                  @ convert to bytes, check sign
1501    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1502#if defined(WITH_JIT)
1503    ldr     r0, [rSELF, #offThread_pJitProfTable]
1504    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1505    cmp     r0,#0
1506    bne     common_updateProfile
1507#else
1508    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1509#endif
1510    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1511    GOTO_OPCODE(ip)                     @ jump to next instruction
1512
1513
1514/* ------------------------------ */
1515    .balign 64
1516.L_OP_IF_LT: /* 0x34 */
1517/* File: armv5te/OP_IF_LT.S */
1518/* File: armv5te/bincmp.S */
1519    /*
1520     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1521     * fragment that specifies the *reverse* comparison to perform, e.g.
1522     * for "if-le" you would use "gt".
1523     *
1524     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1525     */
1526    /* if-cmp vA, vB, +CCCC */
1527    mov     r0, rINST, lsr #8           @ r0<- A+
1528    mov     r1, rINST, lsr #12          @ r1<- B
1529    and     r0, r0, #15
1530    GET_VREG(r3, r1)                    @ r3<- vB
1531    GET_VREG(r2, r0)                    @ r2<- vA
1532    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1533    cmp     r2, r3                      @ compare (vA, vB)
1534    movge r1, #2                 @ r1<- BYTE branch dist for not-taken
1535    adds    r2, r1, r1                  @ convert to bytes, check sign
1536    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1537#if defined(WITH_JIT)
1538    ldr     r0, [rSELF, #offThread_pJitProfTable]
1539    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1540    cmp     r0,#0
1541    bne     common_updateProfile
1542#else
1543    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1544#endif
1545    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1546    GOTO_OPCODE(ip)                     @ jump to next instruction
1547
1548
1549/* ------------------------------ */
1550    .balign 64
1551.L_OP_IF_GE: /* 0x35 */
1552/* File: armv5te/OP_IF_GE.S */
1553/* File: armv5te/bincmp.S */
1554    /*
1555     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1556     * fragment that specifies the *reverse* comparison to perform, e.g.
1557     * for "if-le" you would use "gt".
1558     *
1559     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1560     */
1561    /* if-cmp vA, vB, +CCCC */
1562    mov     r0, rINST, lsr #8           @ r0<- A+
1563    mov     r1, rINST, lsr #12          @ r1<- B
1564    and     r0, r0, #15
1565    GET_VREG(r3, r1)                    @ r3<- vB
1566    GET_VREG(r2, r0)                    @ r2<- vA
1567    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1568    cmp     r2, r3                      @ compare (vA, vB)
1569    movlt r1, #2                 @ r1<- BYTE branch dist for not-taken
1570    adds    r2, r1, r1                  @ convert to bytes, check sign
1571    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1572#if defined(WITH_JIT)
1573    ldr     r0, [rSELF, #offThread_pJitProfTable]
1574    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1575    cmp     r0,#0
1576    bne     common_updateProfile
1577#else
1578    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1579#endif
1580    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1581    GOTO_OPCODE(ip)                     @ jump to next instruction
1582
1583
1584/* ------------------------------ */
1585    .balign 64
1586.L_OP_IF_GT: /* 0x36 */
1587/* File: armv5te/OP_IF_GT.S */
1588/* File: armv5te/bincmp.S */
1589    /*
1590     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1591     * fragment that specifies the *reverse* comparison to perform, e.g.
1592     * for "if-le" you would use "gt".
1593     *
1594     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1595     */
1596    /* if-cmp vA, vB, +CCCC */
1597    mov     r0, rINST, lsr #8           @ r0<- A+
1598    mov     r1, rINST, lsr #12          @ r1<- B
1599    and     r0, r0, #15
1600    GET_VREG(r3, r1)                    @ r3<- vB
1601    GET_VREG(r2, r0)                    @ r2<- vA
1602    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1603    cmp     r2, r3                      @ compare (vA, vB)
1604    movle r1, #2                 @ r1<- BYTE branch dist for not-taken
1605    adds    r2, r1, r1                  @ convert to bytes, check sign
1606    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1607#if defined(WITH_JIT)
1608    ldr     r0, [rSELF, #offThread_pJitProfTable]
1609    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1610    cmp     r0,#0
1611    bne     common_updateProfile
1612#else
1613    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1614#endif
1615    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1616    GOTO_OPCODE(ip)                     @ jump to next instruction
1617
1618
1619/* ------------------------------ */
1620    .balign 64
1621.L_OP_IF_LE: /* 0x37 */
1622/* File: armv5te/OP_IF_LE.S */
1623/* File: armv5te/bincmp.S */
1624    /*
1625     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1626     * fragment that specifies the *reverse* comparison to perform, e.g.
1627     * for "if-le" you would use "gt".
1628     *
1629     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1630     */
1631    /* if-cmp vA, vB, +CCCC */
1632    mov     r0, rINST, lsr #8           @ r0<- A+
1633    mov     r1, rINST, lsr #12          @ r1<- B
1634    and     r0, r0, #15
1635    GET_VREG(r3, r1)                    @ r3<- vB
1636    GET_VREG(r2, r0)                    @ r2<- vA
1637    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1638    cmp     r2, r3                      @ compare (vA, vB)
1639    movgt r1, #2                 @ r1<- BYTE branch dist for not-taken
1640    adds    r2, r1, r1                  @ convert to bytes, check sign
1641    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1642#if defined(WITH_JIT)
1643    ldr     r0, [rSELF, #offThread_pJitProfTable]
1644    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1645    cmp     r0,#0
1646    bne     common_updateProfile
1647#else
1648    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1649#endif
1650    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1651    GOTO_OPCODE(ip)                     @ jump to next instruction
1652
1653
1654/* ------------------------------ */
1655    .balign 64
1656.L_OP_IF_EQZ: /* 0x38 */
1657/* File: armv5te/OP_IF_EQZ.S */
1658/* File: armv5te/zcmp.S */
1659    /*
1660     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1661     * fragment that specifies the *reverse* comparison to perform, e.g.
1662     * for "if-le" you would use "gt".
1663     *
1664     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1665     */
1666    /* if-cmp vAA, +BBBB */
1667    mov     r0, rINST, lsr #8           @ r0<- AA
1668    GET_VREG(r2, r0)                    @ r2<- vAA
1669    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1670    cmp     r2, #0                      @ compare (vA, 0)
1671    movne r1, #2                 @ r1<- inst branch dist for not-taken
1672    adds    r1, r1, r1                  @ convert to bytes & set flags
1673    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1674#if defined(WITH_JIT)
1675    ldr     r0, [rSELF, #offThread_pJitProfTable]
1676    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1677    cmp     r0,#0
1678    bne     common_updateProfile        @ test for JIT off at target
1679#else
1680    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1681#endif
1682    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1683    GOTO_OPCODE(ip)                     @ jump to next instruction
1684
1685
1686/* ------------------------------ */
1687    .balign 64
1688.L_OP_IF_NEZ: /* 0x39 */
1689/* File: armv5te/OP_IF_NEZ.S */
1690/* File: armv5te/zcmp.S */
1691    /*
1692     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1693     * fragment that specifies the *reverse* comparison to perform, e.g.
1694     * for "if-le" you would use "gt".
1695     *
1696     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1697     */
1698    /* if-cmp vAA, +BBBB */
1699    mov     r0, rINST, lsr #8           @ r0<- AA
1700    GET_VREG(r2, r0)                    @ r2<- vAA
1701    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1702    cmp     r2, #0                      @ compare (vA, 0)
1703    moveq r1, #2                 @ r1<- inst branch dist for not-taken
1704    adds    r1, r1, r1                  @ convert to bytes & set flags
1705    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1706#if defined(WITH_JIT)
1707    ldr     r0, [rSELF, #offThread_pJitProfTable]
1708    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1709    cmp     r0,#0
1710    bne     common_updateProfile        @ test for JIT off at target
1711#else
1712    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1713#endif
1714    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1715    GOTO_OPCODE(ip)                     @ jump to next instruction
1716
1717
1718/* ------------------------------ */
1719    .balign 64
1720.L_OP_IF_LTZ: /* 0x3a */
1721/* File: armv5te/OP_IF_LTZ.S */
1722/* File: armv5te/zcmp.S */
1723    /*
1724     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1725     * fragment that specifies the *reverse* comparison to perform, e.g.
1726     * for "if-le" you would use "gt".
1727     *
1728     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1729     */
1730    /* if-cmp vAA, +BBBB */
1731    mov     r0, rINST, lsr #8           @ r0<- AA
1732    GET_VREG(r2, r0)                    @ r2<- vAA
1733    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1734    cmp     r2, #0                      @ compare (vA, 0)
1735    movge r1, #2                 @ r1<- inst branch dist for not-taken
1736    adds    r1, r1, r1                  @ convert to bytes & set flags
1737    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1738#if defined(WITH_JIT)
1739    ldr     r0, [rSELF, #offThread_pJitProfTable]
1740    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1741    cmp     r0,#0
1742    bne     common_updateProfile        @ test for JIT off at target
1743#else
1744    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1745#endif
1746    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1747    GOTO_OPCODE(ip)                     @ jump to next instruction
1748
1749
1750/* ------------------------------ */
1751    .balign 64
1752.L_OP_IF_GEZ: /* 0x3b */
1753/* File: armv5te/OP_IF_GEZ.S */
1754/* File: armv5te/zcmp.S */
1755    /*
1756     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1757     * fragment that specifies the *reverse* comparison to perform, e.g.
1758     * for "if-le" you would use "gt".
1759     *
1760     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1761     */
1762    /* if-cmp vAA, +BBBB */
1763    mov     r0, rINST, lsr #8           @ r0<- AA
1764    GET_VREG(r2, r0)                    @ r2<- vAA
1765    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1766    cmp     r2, #0                      @ compare (vA, 0)
1767    movlt r1, #2                 @ r1<- inst branch dist for not-taken
1768    adds    r1, r1, r1                  @ convert to bytes & set flags
1769    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1770#if defined(WITH_JIT)
1771    ldr     r0, [rSELF, #offThread_pJitProfTable]
1772    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1773    cmp     r0,#0
1774    bne     common_updateProfile        @ test for JIT off at target
1775#else
1776    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1777#endif
1778    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1779    GOTO_OPCODE(ip)                     @ jump to next instruction
1780
1781
1782/* ------------------------------ */
1783    .balign 64
1784.L_OP_IF_GTZ: /* 0x3c */
1785/* File: armv5te/OP_IF_GTZ.S */
1786/* File: armv5te/zcmp.S */
1787    /*
1788     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1789     * fragment that specifies the *reverse* comparison to perform, e.g.
1790     * for "if-le" you would use "gt".
1791     *
1792     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1793     */
1794    /* if-cmp vAA, +BBBB */
1795    mov     r0, rINST, lsr #8           @ r0<- AA
1796    GET_VREG(r2, r0)                    @ r2<- vAA
1797    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1798    cmp     r2, #0                      @ compare (vA, 0)
1799    movle r1, #2                 @ r1<- inst branch dist for not-taken
1800    adds    r1, r1, r1                  @ convert to bytes & set flags
1801    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1802#if defined(WITH_JIT)
1803    ldr     r0, [rSELF, #offThread_pJitProfTable]
1804    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1805    cmp     r0,#0
1806    bne     common_updateProfile        @ test for JIT off at target
1807#else
1808    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1809#endif
1810    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1811    GOTO_OPCODE(ip)                     @ jump to next instruction
1812
1813
1814/* ------------------------------ */
1815    .balign 64
1816.L_OP_IF_LEZ: /* 0x3d */
1817/* File: armv5te/OP_IF_LEZ.S */
1818/* File: armv5te/zcmp.S */
1819    /*
1820     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1821     * fragment that specifies the *reverse* comparison to perform, e.g.
1822     * for "if-le" you would use "gt".
1823     *
1824     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1825     */
1826    /* if-cmp vAA, +BBBB */
1827    mov     r0, rINST, lsr #8           @ r0<- AA
1828    GET_VREG(r2, r0)                    @ r2<- vAA
1829    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1830    cmp     r2, #0                      @ compare (vA, 0)
1831    movgt r1, #2                 @ r1<- inst branch dist for not-taken
1832    adds    r1, r1, r1                  @ convert to bytes & set flags
1833    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1834#if defined(WITH_JIT)
1835    ldr     r0, [rSELF, #offThread_pJitProfTable]
1836    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1837    cmp     r0,#0
1838    bne     common_updateProfile        @ test for JIT off at target
1839#else
1840    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1841#endif
1842    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1843    GOTO_OPCODE(ip)                     @ jump to next instruction
1844
1845
1846/* ------------------------------ */
1847    .balign 64
1848.L_OP_UNUSED_3E: /* 0x3e */
1849/* File: armv5te/OP_UNUSED_3E.S */
1850/* File: armv5te/unused.S */
1851    bl      common_abort
1852
1853
1854/* ------------------------------ */
1855    .balign 64
1856.L_OP_UNUSED_3F: /* 0x3f */
1857/* File: armv5te/OP_UNUSED_3F.S */
1858/* File: armv5te/unused.S */
1859    bl      common_abort
1860
1861
1862/* ------------------------------ */
1863    .balign 64
1864.L_OP_UNUSED_40: /* 0x40 */
1865/* File: armv5te/OP_UNUSED_40.S */
1866/* File: armv5te/unused.S */
1867    bl      common_abort
1868
1869
1870/* ------------------------------ */
1871    .balign 64
1872.L_OP_UNUSED_41: /* 0x41 */
1873/* File: armv5te/OP_UNUSED_41.S */
1874/* File: armv5te/unused.S */
1875    bl      common_abort
1876
1877
1878/* ------------------------------ */
1879    .balign 64
1880.L_OP_UNUSED_42: /* 0x42 */
1881/* File: armv5te/OP_UNUSED_42.S */
1882/* File: armv5te/unused.S */
1883    bl      common_abort
1884
1885
1886/* ------------------------------ */
1887    .balign 64
1888.L_OP_UNUSED_43: /* 0x43 */
1889/* File: armv5te/OP_UNUSED_43.S */
1890/* File: armv5te/unused.S */
1891    bl      common_abort
1892
1893
1894/* ------------------------------ */
1895    .balign 64
1896.L_OP_AGET: /* 0x44 */
1897/* File: armv5te/OP_AGET.S */
1898    /*
1899     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1900     *
1901     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1902     * instructions.  We use a pair of FETCH_Bs instead.
1903     *
1904     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1905     */
1906    /* op vAA, vBB, vCC */
1907    FETCH_B(r2, 1, 0)                   @ r2<- BB
1908    mov     r9, rINST, lsr #8           @ r9<- AA
1909    FETCH_B(r3, 1, 1)                   @ r3<- CC
1910    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1911    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1912    cmp     r0, #0                      @ null array object?
1913    beq     common_errNullObject        @ yes, bail
1914    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1915    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1916    cmp     r1, r3                      @ compare unsigned index, length
1917    bcs     common_errArrayIndex        @ index >= length, bail
1918    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1919    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1920    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1921    SET_VREG(r2, r9)                    @ vAA<- r2
1922    GOTO_OPCODE(ip)                     @ jump to next instruction
1923
1924/* ------------------------------ */
1925    .balign 64
1926.L_OP_AGET_WIDE: /* 0x45 */
1927/* File: armv5te/OP_AGET_WIDE.S */
1928    /*
1929     * Array get, 64 bits.  vAA <- vBB[vCC].
1930     *
1931     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
1932     */
1933    /* aget-wide vAA, vBB, vCC */
1934    FETCH(r0, 1)                        @ r0<- CCBB
1935    mov     r9, rINST, lsr #8           @ r9<- AA
1936    and     r2, r0, #255                @ r2<- BB
1937    mov     r3, r0, lsr #8              @ r3<- CC
1938    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1939    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1940    cmp     r0, #0                      @ null array object?
1941    beq     common_errNullObject        @ yes, bail
1942    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1943    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
1944    cmp     r1, r3                      @ compare unsigned index, length
1945    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
1946    b       common_errArrayIndex        @ index >= length, bail
1947    @ May want to swap the order of these two branches depending on how the
1948    @ branch prediction (if any) handles conditional forward branches vs.
1949    @ unconditional forward branches.
1950
1951/* ------------------------------ */
1952    .balign 64
1953.L_OP_AGET_OBJECT: /* 0x46 */
1954/* File: armv5te/OP_AGET_OBJECT.S */
1955/* File: armv5te/OP_AGET.S */
1956    /*
1957     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1958     *
1959     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1960     * instructions.  We use a pair of FETCH_Bs instead.
1961     *
1962     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1963     */
1964    /* op vAA, vBB, vCC */
1965    FETCH_B(r2, 1, 0)                   @ r2<- BB
1966    mov     r9, rINST, lsr #8           @ r9<- AA
1967    FETCH_B(r3, 1, 1)                   @ r3<- CC
1968    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1969    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1970    cmp     r0, #0                      @ null array object?
1971    beq     common_errNullObject        @ yes, bail
1972    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1973    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1974    cmp     r1, r3                      @ compare unsigned index, length
1975    bcs     common_errArrayIndex        @ index >= length, bail
1976    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1977    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1978    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1979    SET_VREG(r2, r9)                    @ vAA<- r2
1980    GOTO_OPCODE(ip)                     @ jump to next instruction
1981
1982
1983/* ------------------------------ */
1984    .balign 64
1985.L_OP_AGET_BOOLEAN: /* 0x47 */
1986/* File: armv5te/OP_AGET_BOOLEAN.S */
1987/* File: armv5te/OP_AGET.S */
1988    /*
1989     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1990     *
1991     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1992     * instructions.  We use a pair of FETCH_Bs instead.
1993     *
1994     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1995     */
1996    /* op vAA, vBB, vCC */
1997    FETCH_B(r2, 1, 0)                   @ r2<- BB
1998    mov     r9, rINST, lsr #8           @ r9<- AA
1999    FETCH_B(r3, 1, 1)                   @ r3<- CC
2000    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2001    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2002    cmp     r0, #0                      @ null array object?
2003    beq     common_errNullObject        @ yes, bail
2004    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2005    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2006    cmp     r1, r3                      @ compare unsigned index, length
2007    bcs     common_errArrayIndex        @ index >= length, bail
2008    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2009    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2010    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2011    SET_VREG(r2, r9)                    @ vAA<- r2
2012    GOTO_OPCODE(ip)                     @ jump to next instruction
2013
2014
2015/* ------------------------------ */
2016    .balign 64
2017.L_OP_AGET_BYTE: /* 0x48 */
2018/* File: armv5te/OP_AGET_BYTE.S */
2019/* File: armv5te/OP_AGET.S */
2020    /*
2021     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2022     *
2023     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2024     * instructions.  We use a pair of FETCH_Bs instead.
2025     *
2026     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2027     */
2028    /* op vAA, vBB, vCC */
2029    FETCH_B(r2, 1, 0)                   @ r2<- BB
2030    mov     r9, rINST, lsr #8           @ r9<- AA
2031    FETCH_B(r3, 1, 1)                   @ r3<- CC
2032    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2033    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2034    cmp     r0, #0                      @ null array object?
2035    beq     common_errNullObject        @ yes, bail
2036    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2037    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2038    cmp     r1, r3                      @ compare unsigned index, length
2039    bcs     common_errArrayIndex        @ index >= length, bail
2040    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2041    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2042    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2043    SET_VREG(r2, r9)                    @ vAA<- r2
2044    GOTO_OPCODE(ip)                     @ jump to next instruction
2045
2046
2047/* ------------------------------ */
2048    .balign 64
2049.L_OP_AGET_CHAR: /* 0x49 */
2050/* File: armv5te/OP_AGET_CHAR.S */
2051/* File: armv5te/OP_AGET.S */
2052    /*
2053     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2054     *
2055     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2056     * instructions.  We use a pair of FETCH_Bs instead.
2057     *
2058     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2059     */
2060    /* op vAA, vBB, vCC */
2061    FETCH_B(r2, 1, 0)                   @ r2<- BB
2062    mov     r9, rINST, lsr #8           @ r9<- AA
2063    FETCH_B(r3, 1, 1)                   @ r3<- CC
2064    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2065    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2066    cmp     r0, #0                      @ null array object?
2067    beq     common_errNullObject        @ yes, bail
2068    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2069    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2070    cmp     r1, r3                      @ compare unsigned index, length
2071    bcs     common_errArrayIndex        @ index >= length, bail
2072    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2073    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2074    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2075    SET_VREG(r2, r9)                    @ vAA<- r2
2076    GOTO_OPCODE(ip)                     @ jump to next instruction
2077
2078
2079/* ------------------------------ */
2080    .balign 64
2081.L_OP_AGET_SHORT: /* 0x4a */
2082/* File: armv5te/OP_AGET_SHORT.S */
2083/* File: armv5te/OP_AGET.S */
2084    /*
2085     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2086     *
2087     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2088     * instructions.  We use a pair of FETCH_Bs instead.
2089     *
2090     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2091     */
2092    /* op vAA, vBB, vCC */
2093    FETCH_B(r2, 1, 0)                   @ r2<- BB
2094    mov     r9, rINST, lsr #8           @ r9<- AA
2095    FETCH_B(r3, 1, 1)                   @ r3<- CC
2096    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2097    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2098    cmp     r0, #0                      @ null array object?
2099    beq     common_errNullObject        @ yes, bail
2100    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2101    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2102    cmp     r1, r3                      @ compare unsigned index, length
2103    bcs     common_errArrayIndex        @ index >= length, bail
2104    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2105    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2106    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2107    SET_VREG(r2, r9)                    @ vAA<- r2
2108    GOTO_OPCODE(ip)                     @ jump to next instruction
2109
2110
2111/* ------------------------------ */
2112    .balign 64
2113.L_OP_APUT: /* 0x4b */
2114/* File: armv5te/OP_APUT.S */
2115    /*
2116     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2117     *
2118     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2119     * instructions.  We use a pair of FETCH_Bs instead.
2120     *
2121     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2122     */
2123    /* op vAA, vBB, vCC */
2124    FETCH_B(r2, 1, 0)                   @ r2<- BB
2125    mov     r9, rINST, lsr #8           @ r9<- AA
2126    FETCH_B(r3, 1, 1)                   @ r3<- CC
2127    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2128    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2129    cmp     r0, #0                      @ null array object?
2130    beq     common_errNullObject        @ yes, bail
2131    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2132    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2133    cmp     r1, r3                      @ compare unsigned index, length
2134    bcs     common_errArrayIndex        @ index >= length, bail
2135    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2136    GET_VREG(r2, r9)                    @ r2<- vAA
2137    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2138    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2139    GOTO_OPCODE(ip)                     @ jump to next instruction
2140
2141/* ------------------------------ */
2142    .balign 64
2143.L_OP_APUT_WIDE: /* 0x4c */
2144/* File: armv5te/OP_APUT_WIDE.S */
2145    /*
2146     * Array put, 64 bits.  vBB[vCC] <- vAA.
2147     *
2148     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2149     */
2150    /* aput-wide vAA, vBB, vCC */
2151    FETCH(r0, 1)                        @ r0<- CCBB
2152    mov     r9, rINST, lsr #8           @ r9<- AA
2153    and     r2, r0, #255                @ r2<- BB
2154    mov     r3, r0, lsr #8              @ r3<- CC
2155    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2156    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2157    cmp     r0, #0                      @ null array object?
2158    beq     common_errNullObject        @ yes, bail
2159    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2160    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2161    cmp     r1, r3                      @ compare unsigned index, length
2162    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2163    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2164    b       common_errArrayIndex        @ index >= length, bail
2165    @ May want to swap the order of these two branches depending on how the
2166    @ branch prediction (if any) handles conditional forward branches vs.
2167    @ unconditional forward branches.
2168
2169/* ------------------------------ */
2170    .balign 64
2171.L_OP_APUT_OBJECT: /* 0x4d */
2172/* File: armv5te/OP_APUT_OBJECT.S */
2173    /*
2174     * Store an object into an array.  vBB[vCC] <- vAA.
2175     */
2176    /* op vAA, vBB, vCC */
2177    FETCH(r0, 1)                        @ r0<- CCBB
2178    mov     r9, rINST, lsr #8           @ r9<- AA
2179    and     r2, r0, #255                @ r2<- BB
2180    mov     r3, r0, lsr #8              @ r3<- CC
2181    GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
2182    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2183    cmp     rINST, #0                   @ null array object?
2184    GET_VREG(r9, r9)                    @ r9<- vAA
2185    beq     common_errNullObject        @ yes, bail
2186    ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
2187    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
2188    cmp     r1, r3                      @ compare unsigned index, length
2189    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2190    b       common_errArrayIndex        @ index >= length, bail
2191
2192
2193/* ------------------------------ */
2194    .balign 64
2195.L_OP_APUT_BOOLEAN: /* 0x4e */
2196/* File: armv5te/OP_APUT_BOOLEAN.S */
2197/* File: armv5te/OP_APUT.S */
2198    /*
2199     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2200     *
2201     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2202     * instructions.  We use a pair of FETCH_Bs instead.
2203     *
2204     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2205     */
2206    /* op vAA, vBB, vCC */
2207    FETCH_B(r2, 1, 0)                   @ r2<- BB
2208    mov     r9, rINST, lsr #8           @ r9<- AA
2209    FETCH_B(r3, 1, 1)                   @ r3<- CC
2210    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2211    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2212    cmp     r0, #0                      @ null array object?
2213    beq     common_errNullObject        @ yes, bail
2214    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2215    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2216    cmp     r1, r3                      @ compare unsigned index, length
2217    bcs     common_errArrayIndex        @ index >= length, bail
2218    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2219    GET_VREG(r2, r9)                    @ r2<- vAA
2220    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2221    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2222    GOTO_OPCODE(ip)                     @ jump to next instruction
2223
2224
2225/* ------------------------------ */
2226    .balign 64
2227.L_OP_APUT_BYTE: /* 0x4f */
2228/* File: armv5te/OP_APUT_BYTE.S */
2229/* File: armv5te/OP_APUT.S */
2230    /*
2231     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2232     *
2233     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2234     * instructions.  We use a pair of FETCH_Bs instead.
2235     *
2236     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2237     */
2238    /* op vAA, vBB, vCC */
2239    FETCH_B(r2, 1, 0)                   @ r2<- BB
2240    mov     r9, rINST, lsr #8           @ r9<- AA
2241    FETCH_B(r3, 1, 1)                   @ r3<- CC
2242    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2243    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2244    cmp     r0, #0                      @ null array object?
2245    beq     common_errNullObject        @ yes, bail
2246    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2247    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2248    cmp     r1, r3                      @ compare unsigned index, length
2249    bcs     common_errArrayIndex        @ index >= length, bail
2250    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2251    GET_VREG(r2, r9)                    @ r2<- vAA
2252    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2253    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2254    GOTO_OPCODE(ip)                     @ jump to next instruction
2255
2256
2257/* ------------------------------ */
2258    .balign 64
2259.L_OP_APUT_CHAR: /* 0x50 */
2260/* File: armv5te/OP_APUT_CHAR.S */
2261/* File: armv5te/OP_APUT.S */
2262    /*
2263     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2264     *
2265     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2266     * instructions.  We use a pair of FETCH_Bs instead.
2267     *
2268     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2269     */
2270    /* op vAA, vBB, vCC */
2271    FETCH_B(r2, 1, 0)                   @ r2<- BB
2272    mov     r9, rINST, lsr #8           @ r9<- AA
2273    FETCH_B(r3, 1, 1)                   @ r3<- CC
2274    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2275    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2276    cmp     r0, #0                      @ null array object?
2277    beq     common_errNullObject        @ yes, bail
2278    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2279    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2280    cmp     r1, r3                      @ compare unsigned index, length
2281    bcs     common_errArrayIndex        @ index >= length, bail
2282    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2283    GET_VREG(r2, r9)                    @ r2<- vAA
2284    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2285    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2286    GOTO_OPCODE(ip)                     @ jump to next instruction
2287
2288
2289/* ------------------------------ */
2290    .balign 64
2291.L_OP_APUT_SHORT: /* 0x51 */
2292/* File: armv5te/OP_APUT_SHORT.S */
2293/* File: armv5te/OP_APUT.S */
2294    /*
2295     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2296     *
2297     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2298     * instructions.  We use a pair of FETCH_Bs instead.
2299     *
2300     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2301     */
2302    /* op vAA, vBB, vCC */
2303    FETCH_B(r2, 1, 0)                   @ r2<- BB
2304    mov     r9, rINST, lsr #8           @ r9<- AA
2305    FETCH_B(r3, 1, 1)                   @ r3<- CC
2306    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2307    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2308    cmp     r0, #0                      @ null array object?
2309    beq     common_errNullObject        @ yes, bail
2310    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2311    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2312    cmp     r1, r3                      @ compare unsigned index, length
2313    bcs     common_errArrayIndex        @ index >= length, bail
2314    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2315    GET_VREG(r2, r9)                    @ r2<- vAA
2316    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2317    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2318    GOTO_OPCODE(ip)                     @ jump to next instruction
2319
2320
2321/* ------------------------------ */
2322    .balign 64
2323.L_OP_IGET: /* 0x52 */
2324/* File: armv5te/OP_IGET.S */
2325    /*
2326     * General 32-bit instance field get.
2327     *
2328     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2329     */
2330    /* op vA, vB, field@CCCC */
2331    mov     r0, rINST, lsr #12          @ r0<- B
2332    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2333    FETCH(r1, 1)                        @ r1<- field ref CCCC
2334    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2335    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2336    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2337    cmp     r0, #0                      @ is resolved entry null?
2338    bne     .LOP_IGET_finish          @ no, already resolved
23398:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2340    EXPORT_PC()                         @ resolve() could throw
2341    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2342    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2343    cmp     r0, #0
2344    bne     .LOP_IGET_finish
2345    b       common_exceptionThrown
2346
2347/* ------------------------------ */
2348    .balign 64
2349.L_OP_IGET_WIDE: /* 0x53 */
2350/* File: armv5te/OP_IGET_WIDE.S */
2351    /*
2352     * Wide 32-bit instance field get.
2353     */
2354    /* iget-wide vA, vB, field@CCCC */
2355    mov     r0, rINST, lsr #12          @ r0<- B
2356    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2357    FETCH(r1, 1)                        @ r1<- field ref CCCC
2358    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2359    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2360    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2361    cmp     r0, #0                      @ is resolved entry null?
2362    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
23638:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2364    EXPORT_PC()                         @ resolve() could throw
2365    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2366    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2367    cmp     r0, #0
2368    bne     .LOP_IGET_WIDE_finish
2369    b       common_exceptionThrown
2370
2371/* ------------------------------ */
2372    .balign 64
2373.L_OP_IGET_OBJECT: /* 0x54 */
2374/* File: armv5te/OP_IGET_OBJECT.S */
2375/* File: armv5te/OP_IGET.S */
2376    /*
2377     * General 32-bit instance field get.
2378     *
2379     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2380     */
2381    /* op vA, vB, field@CCCC */
2382    mov     r0, rINST, lsr #12          @ r0<- B
2383    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2384    FETCH(r1, 1)                        @ r1<- field ref CCCC
2385    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2386    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2387    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2388    cmp     r0, #0                      @ is resolved entry null?
2389    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
23908:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2391    EXPORT_PC()                         @ resolve() could throw
2392    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2393    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2394    cmp     r0, #0
2395    bne     .LOP_IGET_OBJECT_finish
2396    b       common_exceptionThrown
2397
2398
2399/* ------------------------------ */
2400    .balign 64
2401.L_OP_IGET_BOOLEAN: /* 0x55 */
2402/* File: armv5te/OP_IGET_BOOLEAN.S */
2403@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2404/* File: armv5te/OP_IGET.S */
2405    /*
2406     * General 32-bit instance field get.
2407     *
2408     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2409     */
2410    /* op vA, vB, field@CCCC */
2411    mov     r0, rINST, lsr #12          @ r0<- B
2412    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2413    FETCH(r1, 1)                        @ r1<- field ref CCCC
2414    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2415    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2416    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2417    cmp     r0, #0                      @ is resolved entry null?
2418    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
24198:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2420    EXPORT_PC()                         @ resolve() could throw
2421    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2422    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2423    cmp     r0, #0
2424    bne     .LOP_IGET_BOOLEAN_finish
2425    b       common_exceptionThrown
2426
2427
2428/* ------------------------------ */
2429    .balign 64
2430.L_OP_IGET_BYTE: /* 0x56 */
2431/* File: armv5te/OP_IGET_BYTE.S */
2432@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2433/* File: armv5te/OP_IGET.S */
2434    /*
2435     * General 32-bit instance field get.
2436     *
2437     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2438     */
2439    /* op vA, vB, field@CCCC */
2440    mov     r0, rINST, lsr #12          @ r0<- B
2441    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2442    FETCH(r1, 1)                        @ r1<- field ref CCCC
2443    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2444    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2445    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2446    cmp     r0, #0                      @ is resolved entry null?
2447    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
24488:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2449    EXPORT_PC()                         @ resolve() could throw
2450    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2451    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2452    cmp     r0, #0
2453    bne     .LOP_IGET_BYTE_finish
2454    b       common_exceptionThrown
2455
2456
2457/* ------------------------------ */
2458    .balign 64
2459.L_OP_IGET_CHAR: /* 0x57 */
2460/* File: armv5te/OP_IGET_CHAR.S */
2461@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2462/* File: armv5te/OP_IGET.S */
2463    /*
2464     * General 32-bit instance field get.
2465     *
2466     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2467     */
2468    /* op vA, vB, field@CCCC */
2469    mov     r0, rINST, lsr #12          @ r0<- B
2470    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2471    FETCH(r1, 1)                        @ r1<- field ref CCCC
2472    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2473    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2474    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2475    cmp     r0, #0                      @ is resolved entry null?
2476    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
24778:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2478    EXPORT_PC()                         @ resolve() could throw
2479    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2480    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2481    cmp     r0, #0
2482    bne     .LOP_IGET_CHAR_finish
2483    b       common_exceptionThrown
2484
2485
2486/* ------------------------------ */
2487    .balign 64
2488.L_OP_IGET_SHORT: /* 0x58 */
2489/* File: armv5te/OP_IGET_SHORT.S */
2490@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2491/* File: armv5te/OP_IGET.S */
2492    /*
2493     * General 32-bit instance field get.
2494     *
2495     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2496     */
2497    /* op vA, vB, field@CCCC */
2498    mov     r0, rINST, lsr #12          @ r0<- B
2499    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2500    FETCH(r1, 1)                        @ r1<- field ref CCCC
2501    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2502    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2503    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2504    cmp     r0, #0                      @ is resolved entry null?
2505    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
25068:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2507    EXPORT_PC()                         @ resolve() could throw
2508    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2509    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2510    cmp     r0, #0
2511    bne     .LOP_IGET_SHORT_finish
2512    b       common_exceptionThrown
2513
2514
2515/* ------------------------------ */
2516    .balign 64
2517.L_OP_IPUT: /* 0x59 */
2518/* File: armv5te/OP_IPUT.S */
2519    /*
2520     * General 32-bit instance field put.
2521     *
2522     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2523     */
2524    /* op vA, vB, field@CCCC */
2525    mov     r0, rINST, lsr #12          @ r0<- B
2526    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2527    FETCH(r1, 1)                        @ r1<- field ref CCCC
2528    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2529    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2530    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2531    cmp     r0, #0                      @ is resolved entry null?
2532    bne     .LOP_IPUT_finish          @ no, already resolved
25338:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2534    EXPORT_PC()                         @ resolve() could throw
2535    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2536    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2537    cmp     r0, #0                      @ success?
2538    bne     .LOP_IPUT_finish          @ yes, finish up
2539    b       common_exceptionThrown
2540
2541/* ------------------------------ */
2542    .balign 64
2543.L_OP_IPUT_WIDE: /* 0x5a */
2544/* File: armv5te/OP_IPUT_WIDE.S */
2545    /* iput-wide vA, vB, field@CCCC */
2546    mov     r0, rINST, lsr #12          @ r0<- B
2547    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2548    FETCH(r1, 1)                        @ r1<- field ref CCCC
2549    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2550    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2551    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2552    cmp     r0, #0                      @ is resolved entry null?
2553    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
25548:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2555    EXPORT_PC()                         @ resolve() could throw
2556    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2557    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2558    cmp     r0, #0                      @ success?
2559    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2560    b       common_exceptionThrown
2561
2562/* ------------------------------ */
2563    .balign 64
2564.L_OP_IPUT_OBJECT: /* 0x5b */
2565/* File: armv5te/OP_IPUT_OBJECT.S */
2566    /*
2567     * 32-bit instance field put.
2568     *
2569     * for: iput-object, iput-object-volatile
2570     */
2571    /* op vA, vB, field@CCCC */
2572    mov     r0, rINST, lsr #12          @ r0<- B
2573    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2574    FETCH(r1, 1)                        @ r1<- field ref CCCC
2575    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2576    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2577    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2578    cmp     r0, #0                      @ is resolved entry null?
2579    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
25808:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2581    EXPORT_PC()                         @ resolve() could throw
2582    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2583    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2584    cmp     r0, #0                      @ success?
2585    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2586    b       common_exceptionThrown
2587
2588/* ------------------------------ */
2589    .balign 64
2590.L_OP_IPUT_BOOLEAN: /* 0x5c */
2591/* File: armv5te/OP_IPUT_BOOLEAN.S */
2592@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2593/* File: armv5te/OP_IPUT.S */
2594    /*
2595     * General 32-bit instance field put.
2596     *
2597     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2598     */
2599    /* op vA, vB, field@CCCC */
2600    mov     r0, rINST, lsr #12          @ r0<- B
2601    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2602    FETCH(r1, 1)                        @ r1<- field ref CCCC
2603    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2604    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2605    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2606    cmp     r0, #0                      @ is resolved entry null?
2607    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
26088:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2609    EXPORT_PC()                         @ resolve() could throw
2610    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2611    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2612    cmp     r0, #0                      @ success?
2613    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2614    b       common_exceptionThrown
2615
2616
2617/* ------------------------------ */
2618    .balign 64
2619.L_OP_IPUT_BYTE: /* 0x5d */
2620/* File: armv5te/OP_IPUT_BYTE.S */
2621@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2622/* File: armv5te/OP_IPUT.S */
2623    /*
2624     * General 32-bit instance field put.
2625     *
2626     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2627     */
2628    /* op vA, vB, field@CCCC */
2629    mov     r0, rINST, lsr #12          @ r0<- B
2630    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2631    FETCH(r1, 1)                        @ r1<- field ref CCCC
2632    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2633    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2634    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2635    cmp     r0, #0                      @ is resolved entry null?
2636    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
26378:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2638    EXPORT_PC()                         @ resolve() could throw
2639    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2640    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2641    cmp     r0, #0                      @ success?
2642    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2643    b       common_exceptionThrown
2644
2645
2646/* ------------------------------ */
2647    .balign 64
2648.L_OP_IPUT_CHAR: /* 0x5e */
2649/* File: armv5te/OP_IPUT_CHAR.S */
2650@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2651/* File: armv5te/OP_IPUT.S */
2652    /*
2653     * General 32-bit instance field put.
2654     *
2655     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2656     */
2657    /* op vA, vB, field@CCCC */
2658    mov     r0, rINST, lsr #12          @ r0<- B
2659    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2660    FETCH(r1, 1)                        @ r1<- field ref CCCC
2661    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2662    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2663    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2664    cmp     r0, #0                      @ is resolved entry null?
2665    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
26668:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2667    EXPORT_PC()                         @ resolve() could throw
2668    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2669    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2670    cmp     r0, #0                      @ success?
2671    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2672    b       common_exceptionThrown
2673
2674
2675/* ------------------------------ */
2676    .balign 64
2677.L_OP_IPUT_SHORT: /* 0x5f */
2678/* File: armv5te/OP_IPUT_SHORT.S */
2679@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2680/* File: armv5te/OP_IPUT.S */
2681    /*
2682     * General 32-bit instance field put.
2683     *
2684     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2685     */
2686    /* op vA, vB, field@CCCC */
2687    mov     r0, rINST, lsr #12          @ r0<- B
2688    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2689    FETCH(r1, 1)                        @ r1<- field ref CCCC
2690    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2691    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2692    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2693    cmp     r0, #0                      @ is resolved entry null?
2694    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
26958:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2696    EXPORT_PC()                         @ resolve() could throw
2697    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2698    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2699    cmp     r0, #0                      @ success?
2700    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2701    b       common_exceptionThrown
2702
2703
2704/* ------------------------------ */
2705    .balign 64
2706.L_OP_SGET: /* 0x60 */
2707/* File: armv5te/OP_SGET.S */
2708    /*
2709     * General 32-bit SGET handler.
2710     *
2711     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2712     */
2713    /* op vAA, field@BBBB */
2714    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2715    FETCH(r1, 1)                        @ r1<- field ref BBBB
2716    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2717    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2718    cmp     r0, #0                      @ is resolved entry null?
2719    beq     .LOP_SGET_resolve         @ yes, do resolve
2720.LOP_SGET_finish: @ field ptr in r0
2721    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2722    @ no-op                             @ acquiring load
2723    mov     r2, rINST, lsr #8           @ r2<- AA
2724    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2725    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2726    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2727    GOTO_OPCODE(ip)                     @ jump to next instruction
2728
2729/* ------------------------------ */
2730    .balign 64
2731.L_OP_SGET_WIDE: /* 0x61 */
2732/* File: armv5te/OP_SGET_WIDE.S */
2733    /*
2734     * 64-bit SGET handler.
2735     */
2736    /* sget-wide vAA, field@BBBB */
2737    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2738    FETCH(r1, 1)                        @ r1<- field ref BBBB
2739    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2740    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2741    cmp     r0, #0                      @ is resolved entry null?
2742    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2743.LOP_SGET_WIDE_finish:
2744    mov     r9, rINST, lsr #8           @ r9<- AA
2745    .if 0
2746    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2747    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
2748    .else
2749    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2750    .endif
2751    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2752    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2753    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2754    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2755    GOTO_OPCODE(ip)                     @ jump to next instruction
2756
2757/* ------------------------------ */
2758    .balign 64
2759.L_OP_SGET_OBJECT: /* 0x62 */
2760/* File: armv5te/OP_SGET_OBJECT.S */
2761/* File: armv5te/OP_SGET.S */
2762    /*
2763     * General 32-bit SGET handler.
2764     *
2765     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2766     */
2767    /* op vAA, field@BBBB */
2768    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2769    FETCH(r1, 1)                        @ r1<- field ref BBBB
2770    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2771    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2772    cmp     r0, #0                      @ is resolved entry null?
2773    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2774.LOP_SGET_OBJECT_finish: @ field ptr in r0
2775    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2776    @ no-op                             @ acquiring load
2777    mov     r2, rINST, lsr #8           @ r2<- AA
2778    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2779    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2780    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2781    GOTO_OPCODE(ip)                     @ jump to next instruction
2782
2783
2784/* ------------------------------ */
2785    .balign 64
2786.L_OP_SGET_BOOLEAN: /* 0x63 */
2787/* File: armv5te/OP_SGET_BOOLEAN.S */
2788/* File: armv5te/OP_SGET.S */
2789    /*
2790     * General 32-bit SGET handler.
2791     *
2792     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2793     */
2794    /* op vAA, field@BBBB */
2795    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2796    FETCH(r1, 1)                        @ r1<- field ref BBBB
2797    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2798    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2799    cmp     r0, #0                      @ is resolved entry null?
2800    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2801.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2802    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2803    @ no-op                             @ acquiring load
2804    mov     r2, rINST, lsr #8           @ r2<- AA
2805    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2806    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2807    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2808    GOTO_OPCODE(ip)                     @ jump to next instruction
2809
2810
2811/* ------------------------------ */
2812    .balign 64
2813.L_OP_SGET_BYTE: /* 0x64 */
2814/* File: armv5te/OP_SGET_BYTE.S */
2815/* File: armv5te/OP_SGET.S */
2816    /*
2817     * General 32-bit SGET handler.
2818     *
2819     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2820     */
2821    /* op vAA, field@BBBB */
2822    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2823    FETCH(r1, 1)                        @ r1<- field ref BBBB
2824    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2825    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2826    cmp     r0, #0                      @ is resolved entry null?
2827    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2828.LOP_SGET_BYTE_finish: @ field ptr in r0
2829    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2830    @ no-op                             @ acquiring load
2831    mov     r2, rINST, lsr #8           @ r2<- AA
2832    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2833    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2834    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2835    GOTO_OPCODE(ip)                     @ jump to next instruction
2836
2837
2838/* ------------------------------ */
2839    .balign 64
2840.L_OP_SGET_CHAR: /* 0x65 */
2841/* File: armv5te/OP_SGET_CHAR.S */
2842/* File: armv5te/OP_SGET.S */
2843    /*
2844     * General 32-bit SGET handler.
2845     *
2846     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2847     */
2848    /* op vAA, field@BBBB */
2849    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2850    FETCH(r1, 1)                        @ r1<- field ref BBBB
2851    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2852    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2853    cmp     r0, #0                      @ is resolved entry null?
2854    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2855.LOP_SGET_CHAR_finish: @ field ptr in r0
2856    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2857    @ no-op                             @ acquiring load
2858    mov     r2, rINST, lsr #8           @ r2<- AA
2859    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2860    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2861    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2862    GOTO_OPCODE(ip)                     @ jump to next instruction
2863
2864
2865/* ------------------------------ */
2866    .balign 64
2867.L_OP_SGET_SHORT: /* 0x66 */
2868/* File: armv5te/OP_SGET_SHORT.S */
2869/* File: armv5te/OP_SGET.S */
2870    /*
2871     * General 32-bit SGET handler.
2872     *
2873     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2874     */
2875    /* op vAA, field@BBBB */
2876    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2877    FETCH(r1, 1)                        @ r1<- field ref BBBB
2878    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2879    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2880    cmp     r0, #0                      @ is resolved entry null?
2881    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
2882.LOP_SGET_SHORT_finish: @ field ptr in r0
2883    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2884    @ no-op                             @ acquiring load
2885    mov     r2, rINST, lsr #8           @ r2<- AA
2886    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2887    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2888    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2889    GOTO_OPCODE(ip)                     @ jump to next instruction
2890
2891
2892/* ------------------------------ */
2893    .balign 64
2894.L_OP_SPUT: /* 0x67 */
2895/* File: armv5te/OP_SPUT.S */
2896    /*
2897     * General 32-bit SPUT handler.
2898     *
2899     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2900     */
2901    /* op vAA, field@BBBB */
2902    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2903    FETCH(r1, 1)                        @ r1<- field ref BBBB
2904    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2905    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2906    cmp     r0, #0                      @ is resolved entry null?
2907    beq     .LOP_SPUT_resolve         @ yes, do resolve
2908.LOP_SPUT_finish:   @ field ptr in r0
2909    mov     r2, rINST, lsr #8           @ r2<- AA
2910    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2911    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2912    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2913    @ no-op                        @ releasing store
2914    str     r1, [r0, #offStaticField_value] @ field<- vAA
2915    @ no-op
2916    GOTO_OPCODE(ip)                     @ jump to next instruction
2917
2918/* ------------------------------ */
2919    .balign 64
2920.L_OP_SPUT_WIDE: /* 0x68 */
2921/* File: armv5te/OP_SPUT_WIDE.S */
2922    /*
2923     * 64-bit SPUT handler.
2924     */
2925    /* sput-wide vAA, field@BBBB */
2926    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
2927    FETCH(r1, 1)                        @ r1<- field ref BBBB
2928    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2929    mov     r9, rINST, lsr #8           @ r9<- AA
2930    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
2931    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2932    cmp     r2, #0                      @ is resolved entry null?
2933    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
2934.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
2935    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2936    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
2937    GET_INST_OPCODE(r10)                @ extract opcode from rINST
2938    .if 0
2939    add     r2, r2, #offStaticField_value @ r2<- pointer to data
2940    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
2941    .else
2942    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
2943    .endif
2944    GOTO_OPCODE(r10)                    @ jump to next instruction
2945
2946/* ------------------------------ */
2947    .balign 64
2948.L_OP_SPUT_OBJECT: /* 0x69 */
2949/* File: armv5te/OP_SPUT_OBJECT.S */
2950    /*
2951     * 32-bit SPUT handler for objects
2952     *
2953     * for: sput-object, sput-object-volatile
2954     */
2955    /* op vAA, field@BBBB */
2956    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2957    FETCH(r1, 1)                        @ r1<- field ref BBBB
2958    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2959    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2960    cmp     r0, #0                      @ is resolved entry null?
2961    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
2962.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
2963    mov     r2, rINST, lsr #8           @ r2<- AA
2964    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2965    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2966    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
2967    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
2968    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2969    @ no-op                         @ releasing store
2970    b       .LOP_SPUT_OBJECT_end
2971
2972/* ------------------------------ */
2973    .balign 64
2974.L_OP_SPUT_BOOLEAN: /* 0x6a */
2975/* File: armv5te/OP_SPUT_BOOLEAN.S */
2976/* File: armv5te/OP_SPUT.S */
2977    /*
2978     * General 32-bit SPUT handler.
2979     *
2980     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2981     */
2982    /* op vAA, field@BBBB */
2983    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2984    FETCH(r1, 1)                        @ r1<- field ref BBBB
2985    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2986    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2987    cmp     r0, #0                      @ is resolved entry null?
2988    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
2989.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
2990    mov     r2, rINST, lsr #8           @ r2<- AA
2991    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2992    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2993    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2994    @ no-op                        @ releasing store
2995    str     r1, [r0, #offStaticField_value] @ field<- vAA
2996    @ no-op
2997    GOTO_OPCODE(ip)                     @ jump to next instruction
2998
2999
3000/* ------------------------------ */
3001    .balign 64
3002.L_OP_SPUT_BYTE: /* 0x6b */
3003/* File: armv5te/OP_SPUT_BYTE.S */
3004/* File: armv5te/OP_SPUT.S */
3005    /*
3006     * General 32-bit SPUT handler.
3007     *
3008     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3009     */
3010    /* op vAA, field@BBBB */
3011    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3012    FETCH(r1, 1)                        @ r1<- field ref BBBB
3013    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3014    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3015    cmp     r0, #0                      @ is resolved entry null?
3016    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
3017.LOP_SPUT_BYTE_finish:   @ field ptr in r0
3018    mov     r2, rINST, lsr #8           @ r2<- AA
3019    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3020    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3021    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3022    @ no-op                        @ releasing store
3023    str     r1, [r0, #offStaticField_value] @ field<- vAA
3024    @ no-op
3025    GOTO_OPCODE(ip)                     @ jump to next instruction
3026
3027
3028/* ------------------------------ */
3029    .balign 64
3030.L_OP_SPUT_CHAR: /* 0x6c */
3031/* File: armv5te/OP_SPUT_CHAR.S */
3032/* File: armv5te/OP_SPUT.S */
3033    /*
3034     * General 32-bit SPUT handler.
3035     *
3036     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3037     */
3038    /* op vAA, field@BBBB */
3039    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3040    FETCH(r1, 1)                        @ r1<- field ref BBBB
3041    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3042    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3043    cmp     r0, #0                      @ is resolved entry null?
3044    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3045.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3046    mov     r2, rINST, lsr #8           @ r2<- AA
3047    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3048    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3049    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3050    @ no-op                        @ releasing store
3051    str     r1, [r0, #offStaticField_value] @ field<- vAA
3052    @ no-op
3053    GOTO_OPCODE(ip)                     @ jump to next instruction
3054
3055
3056/* ------------------------------ */
3057    .balign 64
3058.L_OP_SPUT_SHORT: /* 0x6d */
3059/* File: armv5te/OP_SPUT_SHORT.S */
3060/* File: armv5te/OP_SPUT.S */
3061    /*
3062     * General 32-bit SPUT handler.
3063     *
3064     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3065     */
3066    /* op vAA, field@BBBB */
3067    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3068    FETCH(r1, 1)                        @ r1<- field ref BBBB
3069    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3070    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3071    cmp     r0, #0                      @ is resolved entry null?
3072    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3073.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3074    mov     r2, rINST, lsr #8           @ r2<- AA
3075    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3076    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3077    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3078    @ no-op                        @ releasing store
3079    str     r1, [r0, #offStaticField_value] @ field<- vAA
3080    @ no-op
3081    GOTO_OPCODE(ip)                     @ jump to next instruction
3082
3083
3084/* ------------------------------ */
3085    .balign 64
3086.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3087/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3088    /*
3089     * Handle a virtual method call.
3090     *
3091     * for: invoke-virtual, invoke-virtual/range
3092     */
3093    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3094    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3095    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3096    FETCH(r1, 1)                        @ r1<- BBBB
3097    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3098    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3099    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3100    .if     (!0)
3101    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3102    .endif
3103    cmp     r0, #0                      @ already resolved?
3104    EXPORT_PC()                         @ must export for invoke
3105    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3106    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3107    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3108    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3109    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3110    cmp     r0, #0                      @ got null?
3111    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3112    b       common_exceptionThrown      @ yes, handle exception
3113
3114/* ------------------------------ */
3115    .balign 64
3116.L_OP_INVOKE_SUPER: /* 0x6f */
3117/* File: armv5te/OP_INVOKE_SUPER.S */
3118    /*
3119     * Handle a "super" method call.
3120     *
3121     * for: invoke-super, invoke-super/range
3122     */
3123    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3124    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3125    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3126    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3127    .if     (!0)
3128    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3129    .endif
3130    FETCH(r1, 1)                        @ r1<- BBBB
3131    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3132    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3133    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3134    cmp     r9, #0                      @ null "this"?
3135    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3136    beq     common_errNullObject        @ null "this", throw exception
3137    cmp     r0, #0                      @ already resolved?
3138    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3139    EXPORT_PC()                         @ must export for invoke
3140    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3141    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3142
3143/* ------------------------------ */
3144    .balign 64
3145.L_OP_INVOKE_DIRECT: /* 0x70 */
3146/* File: armv5te/OP_INVOKE_DIRECT.S */
3147    /*
3148     * Handle a direct method call.
3149     *
3150     * (We could defer the "is 'this' pointer null" test to the common
3151     * method invocation code, and use a flag to indicate that static
3152     * calls don't count.  If we do this as part of copying the arguments
3153     * out we could avoiding loading the first arg twice.)
3154     *
3155     * for: invoke-direct, invoke-direct/range
3156     */
3157    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3158    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3159    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3160    FETCH(r1, 1)                        @ r1<- BBBB
3161    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3162    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3163    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3164    .if     (!0)
3165    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3166    .endif
3167    cmp     r0, #0                      @ already resolved?
3168    EXPORT_PC()                         @ must export for invoke
3169    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3170    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3171.LOP_INVOKE_DIRECT_finish:
3172    cmp     r9, #0                      @ null "this" ref?
3173    bne     common_invokeMethodNoRange   @ r0=method, r9="this"
3174    b       common_errNullObject        @ yes, throw exception
3175
3176/* ------------------------------ */
3177    .balign 64
3178.L_OP_INVOKE_STATIC: /* 0x71 */
3179/* File: armv5te/OP_INVOKE_STATIC.S */
3180    /*
3181     * Handle a static method call.
3182     *
3183     * for: invoke-static, invoke-static/range
3184     */
3185    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3186    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3187    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3188    FETCH(r1, 1)                        @ r1<- BBBB
3189    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3190    mov     r9, #0                      @ null "this" in delay slot
3191    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3192#if defined(WITH_JIT)
3193    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3194#endif
3195    cmp     r0, #0                      @ already resolved?
3196    EXPORT_PC()                         @ must export for invoke
3197    bne     common_invokeMethodNoRange @ yes, continue on
3198    b       .LOP_INVOKE_STATIC_resolve
3199
3200/* ------------------------------ */
3201    .balign 64
3202.L_OP_INVOKE_INTERFACE: /* 0x72 */
3203/* File: armv5te/OP_INVOKE_INTERFACE.S */
3204    /*
3205     * Handle an interface method call.
3206     *
3207     * for: invoke-interface, invoke-interface/range
3208     */
3209    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3210    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3211    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3212    FETCH(r1, 1)                        @ r1<- BBBB
3213    .if     (!0)
3214    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3215    .endif
3216    EXPORT_PC()                         @ must export for invoke
3217    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3218    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3219    cmp     r9, #0                      @ null obj?
3220    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3221    beq     common_errNullObject        @ yes, fail
3222    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3223    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3224    cmp     r0, #0                      @ failed?
3225    beq     common_exceptionThrown      @ yes, handle exception
3226    b       common_invokeMethodNoRange @ (r0=method, r9="this")
3227
3228/* ------------------------------ */
3229    .balign 64
3230.L_OP_UNUSED_73: /* 0x73 */
3231/* File: armv5te/OP_UNUSED_73.S */
3232/* File: armv5te/unused.S */
3233    bl      common_abort
3234
3235
3236/* ------------------------------ */
3237    .balign 64
3238.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3239/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3240/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3241    /*
3242     * Handle a virtual method call.
3243     *
3244     * for: invoke-virtual, invoke-virtual/range
3245     */
3246    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3247    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3248    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3249    FETCH(r1, 1)                        @ r1<- BBBB
3250    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3251    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3252    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3253    .if     (!1)
3254    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3255    .endif
3256    cmp     r0, #0                      @ already resolved?
3257    EXPORT_PC()                         @ must export for invoke
3258    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3259    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3260    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3261    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3262    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3263    cmp     r0, #0                      @ got null?
3264    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3265    b       common_exceptionThrown      @ yes, handle exception
3266
3267
3268/* ------------------------------ */
3269    .balign 64
3270.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3271/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3272/* File: armv5te/OP_INVOKE_SUPER.S */
3273    /*
3274     * Handle a "super" method call.
3275     *
3276     * for: invoke-super, invoke-super/range
3277     */
3278    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3279    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3280    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3281    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3282    .if     (!1)
3283    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3284    .endif
3285    FETCH(r1, 1)                        @ r1<- BBBB
3286    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3287    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3288    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3289    cmp     r9, #0                      @ null "this"?
3290    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3291    beq     common_errNullObject        @ null "this", throw exception
3292    cmp     r0, #0                      @ already resolved?
3293    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3294    EXPORT_PC()                         @ must export for invoke
3295    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3296    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3297
3298
3299/* ------------------------------ */
3300    .balign 64
3301.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3302/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3303/* File: armv5te/OP_INVOKE_DIRECT.S */
3304    /*
3305     * Handle a direct method call.
3306     *
3307     * (We could defer the "is 'this' pointer null" test to the common
3308     * method invocation code, and use a flag to indicate that static
3309     * calls don't count.  If we do this as part of copying the arguments
3310     * out we could avoiding loading the first arg twice.)
3311     *
3312     * for: invoke-direct, invoke-direct/range
3313     */
3314    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3315    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3316    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3317    FETCH(r1, 1)                        @ r1<- BBBB
3318    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3319    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3320    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3321    .if     (!1)
3322    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3323    .endif
3324    cmp     r0, #0                      @ already resolved?
3325    EXPORT_PC()                         @ must export for invoke
3326    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3327    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3328.LOP_INVOKE_DIRECT_RANGE_finish:
3329    cmp     r9, #0                      @ null "this" ref?
3330    bne     common_invokeMethodRange   @ r0=method, r9="this"
3331    b       common_errNullObject        @ yes, throw exception
3332
3333
3334/* ------------------------------ */
3335    .balign 64
3336.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3337/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3338/* File: armv5te/OP_INVOKE_STATIC.S */
3339    /*
3340     * Handle a static method call.
3341     *
3342     * for: invoke-static, invoke-static/range
3343     */
3344    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3345    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3346    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3347    FETCH(r1, 1)                        @ r1<- BBBB
3348    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3349    mov     r9, #0                      @ null "this" in delay slot
3350    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3351#if defined(WITH_JIT)
3352    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3353#endif
3354    cmp     r0, #0                      @ already resolved?
3355    EXPORT_PC()                         @ must export for invoke
3356    bne     common_invokeMethodRange @ yes, continue on
3357    b       .LOP_INVOKE_STATIC_RANGE_resolve
3358
3359
3360/* ------------------------------ */
3361    .balign 64
3362.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3363/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3364/* File: armv5te/OP_INVOKE_INTERFACE.S */
3365    /*
3366     * Handle an interface method call.
3367     *
3368     * for: invoke-interface, invoke-interface/range
3369     */
3370    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3371    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3372    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3373    FETCH(r1, 1)                        @ r1<- BBBB
3374    .if     (!1)
3375    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3376    .endif
3377    EXPORT_PC()                         @ must export for invoke
3378    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3379    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3380    cmp     r9, #0                      @ null obj?
3381    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3382    beq     common_errNullObject        @ yes, fail
3383    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3384    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3385    cmp     r0, #0                      @ failed?
3386    beq     common_exceptionThrown      @ yes, handle exception
3387    b       common_invokeMethodRange @ (r0=method, r9="this")
3388
3389
3390/* ------------------------------ */
3391    .balign 64
3392.L_OP_UNUSED_79: /* 0x79 */
3393/* File: armv5te/OP_UNUSED_79.S */
3394/* File: armv5te/unused.S */
3395    bl      common_abort
3396
3397
3398/* ------------------------------ */
3399    .balign 64
3400.L_OP_UNUSED_7A: /* 0x7a */
3401/* File: armv5te/OP_UNUSED_7A.S */
3402/* File: armv5te/unused.S */
3403    bl      common_abort
3404
3405
3406/* ------------------------------ */
3407    .balign 64
3408.L_OP_NEG_INT: /* 0x7b */
3409/* File: armv5te/OP_NEG_INT.S */
3410/* File: armv5te/unop.S */
3411    /*
3412     * Generic 32-bit unary operation.  Provide an "instr" line that
3413     * specifies an instruction that performs "result = op r0".
3414     * This could be an ARM instruction or a function call.
3415     *
3416     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3417     *      int-to-byte, int-to-char, int-to-short
3418     */
3419    /* unop vA, vB */
3420    mov     r3, rINST, lsr #12          @ r3<- B
3421    mov     r9, rINST, lsr #8           @ r9<- A+
3422    GET_VREG(r0, r3)                    @ r0<- vB
3423    and     r9, r9, #15
3424                               @ optional op; may set condition codes
3425    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3426    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3427    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3428    SET_VREG(r0, r9)                    @ vAA<- r0
3429    GOTO_OPCODE(ip)                     @ jump to next instruction
3430    /* 9-10 instructions */
3431
3432
3433/* ------------------------------ */
3434    .balign 64
3435.L_OP_NOT_INT: /* 0x7c */
3436/* File: armv5te/OP_NOT_INT.S */
3437/* File: armv5te/unop.S */
3438    /*
3439     * Generic 32-bit unary operation.  Provide an "instr" line that
3440     * specifies an instruction that performs "result = op r0".
3441     * This could be an ARM instruction or a function call.
3442     *
3443     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3444     *      int-to-byte, int-to-char, int-to-short
3445     */
3446    /* unop vA, vB */
3447    mov     r3, rINST, lsr #12          @ r3<- B
3448    mov     r9, rINST, lsr #8           @ r9<- A+
3449    GET_VREG(r0, r3)                    @ r0<- vB
3450    and     r9, r9, #15
3451                               @ optional op; may set condition codes
3452    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3453    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3454    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3455    SET_VREG(r0, r9)                    @ vAA<- r0
3456    GOTO_OPCODE(ip)                     @ jump to next instruction
3457    /* 9-10 instructions */
3458
3459
3460/* ------------------------------ */
3461    .balign 64
3462.L_OP_NEG_LONG: /* 0x7d */
3463/* File: armv5te/OP_NEG_LONG.S */
3464/* File: armv5te/unopWide.S */
3465    /*
3466     * Generic 64-bit unary operation.  Provide an "instr" line that
3467     * specifies an instruction that performs "result = op r0/r1".
3468     * This could be an ARM instruction or a function call.
3469     *
3470     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3471     */
3472    /* unop vA, vB */
3473    mov     r9, rINST, lsr #8           @ r9<- A+
3474    mov     r3, rINST, lsr #12          @ r3<- B
3475    and     r9, r9, #15
3476    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3477    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3478    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3479    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3480    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3481    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3482    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3483    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3484    GOTO_OPCODE(ip)                     @ jump to next instruction
3485    /* 12-13 instructions */
3486
3487
3488/* ------------------------------ */
3489    .balign 64
3490.L_OP_NOT_LONG: /* 0x7e */
3491/* File: armv5te/OP_NOT_LONG.S */
3492/* File: armv5te/unopWide.S */
3493    /*
3494     * Generic 64-bit unary operation.  Provide an "instr" line that
3495     * specifies an instruction that performs "result = op r0/r1".
3496     * This could be an ARM instruction or a function call.
3497     *
3498     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3499     */
3500    /* unop vA, vB */
3501    mov     r9, rINST, lsr #8           @ r9<- A+
3502    mov     r3, rINST, lsr #12          @ r3<- B
3503    and     r9, r9, #15
3504    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3505    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3506    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3507    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3508    mvn     r0, r0                           @ optional op; may set condition codes
3509    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3510    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3511    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3512    GOTO_OPCODE(ip)                     @ jump to next instruction
3513    /* 12-13 instructions */
3514
3515
3516/* ------------------------------ */
3517    .balign 64
3518.L_OP_NEG_FLOAT: /* 0x7f */
3519/* File: armv5te/OP_NEG_FLOAT.S */
3520/* File: armv5te/unop.S */
3521    /*
3522     * Generic 32-bit unary operation.  Provide an "instr" line that
3523     * specifies an instruction that performs "result = op r0".
3524     * This could be an ARM instruction or a function call.
3525     *
3526     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3527     *      int-to-byte, int-to-char, int-to-short
3528     */
3529    /* unop vA, vB */
3530    mov     r3, rINST, lsr #12          @ r3<- B
3531    mov     r9, rINST, lsr #8           @ r9<- A+
3532    GET_VREG(r0, r3)                    @ r0<- vB
3533    and     r9, r9, #15
3534                               @ optional op; may set condition codes
3535    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3536    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3537    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3538    SET_VREG(r0, r9)                    @ vAA<- r0
3539    GOTO_OPCODE(ip)                     @ jump to next instruction
3540    /* 9-10 instructions */
3541
3542
3543/* ------------------------------ */
3544    .balign 64
3545.L_OP_NEG_DOUBLE: /* 0x80 */
3546/* File: armv5te/OP_NEG_DOUBLE.S */
3547/* File: armv5te/unopWide.S */
3548    /*
3549     * Generic 64-bit unary operation.  Provide an "instr" line that
3550     * specifies an instruction that performs "result = op r0/r1".
3551     * This could be an ARM instruction or a function call.
3552     *
3553     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3554     */
3555    /* unop vA, vB */
3556    mov     r9, rINST, lsr #8           @ r9<- A+
3557    mov     r3, rINST, lsr #12          @ r3<- B
3558    and     r9, r9, #15
3559    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3560    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3561    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3562    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3563                               @ optional op; may set condition codes
3564    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3565    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3566    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3567    GOTO_OPCODE(ip)                     @ jump to next instruction
3568    /* 12-13 instructions */
3569
3570
3571/* ------------------------------ */
3572    .balign 64
3573.L_OP_INT_TO_LONG: /* 0x81 */
3574/* File: armv5te/OP_INT_TO_LONG.S */
3575/* File: armv5te/unopWider.S */
3576    /*
3577     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3578     * that specifies an instruction that performs "result = op r0", where
3579     * "result" is a 64-bit quantity in r0/r1.
3580     *
3581     * For: int-to-long, int-to-double, float-to-long, float-to-double
3582     */
3583    /* unop vA, vB */
3584    mov     r9, rINST, lsr #8           @ r9<- A+
3585    mov     r3, rINST, lsr #12          @ r3<- B
3586    and     r9, r9, #15
3587    GET_VREG(r0, r3)                    @ r0<- vB
3588    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3589                               @ optional op; may set condition codes
3590    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3591    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3592    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3593    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3594    GOTO_OPCODE(ip)                     @ jump to next instruction
3595    /* 10-11 instructions */
3596
3597
3598/* ------------------------------ */
3599    .balign 64
3600.L_OP_INT_TO_FLOAT: /* 0x82 */
3601/* File: armv5te/OP_INT_TO_FLOAT.S */
3602/* File: armv5te/unop.S */
3603    /*
3604     * Generic 32-bit unary operation.  Provide an "instr" line that
3605     * specifies an instruction that performs "result = op r0".
3606     * This could be an ARM instruction or a function call.
3607     *
3608     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3609     *      int-to-byte, int-to-char, int-to-short
3610     */
3611    /* unop vA, vB */
3612    mov     r3, rINST, lsr #12          @ r3<- B
3613    mov     r9, rINST, lsr #8           @ r9<- A+
3614    GET_VREG(r0, r3)                    @ r0<- vB
3615    and     r9, r9, #15
3616                               @ optional op; may set condition codes
3617    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3618    bl      __aeabi_i2f                              @ r0<- op, r0-r3 changed
3619    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3620    SET_VREG(r0, r9)                    @ vAA<- r0
3621    GOTO_OPCODE(ip)                     @ jump to next instruction
3622    /* 9-10 instructions */
3623
3624
3625/* ------------------------------ */
3626    .balign 64
3627.L_OP_INT_TO_DOUBLE: /* 0x83 */
3628/* File: armv5te/OP_INT_TO_DOUBLE.S */
3629/* File: armv5te/unopWider.S */
3630    /*
3631     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3632     * that specifies an instruction that performs "result = op r0", where
3633     * "result" is a 64-bit quantity in r0/r1.
3634     *
3635     * For: int-to-long, int-to-double, float-to-long, float-to-double
3636     */
3637    /* unop vA, vB */
3638    mov     r9, rINST, lsr #8           @ r9<- A+
3639    mov     r3, rINST, lsr #12          @ r3<- B
3640    and     r9, r9, #15
3641    GET_VREG(r0, r3)                    @ r0<- vB
3642    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3643                               @ optional op; may set condition codes
3644    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3645    bl      __aeabi_i2d                              @ r0<- op, r0-r3 changed
3646    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3647    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3648    GOTO_OPCODE(ip)                     @ jump to next instruction
3649    /* 10-11 instructions */
3650
3651
3652/* ------------------------------ */
3653    .balign 64
3654.L_OP_LONG_TO_INT: /* 0x84 */
3655/* File: armv5te/OP_LONG_TO_INT.S */
3656/* we ignore the high word, making this equivalent to a 32-bit reg move */
3657/* File: armv5te/OP_MOVE.S */
3658    /* for move, move-object, long-to-int */
3659    /* op vA, vB */
3660    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3661    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3662    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3663    GET_VREG(r2, r1)                    @ r2<- fp[B]
3664    and     r0, r0, #15
3665    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3666    SET_VREG(r2, r0)                    @ fp[A]<- r2
3667    GOTO_OPCODE(ip)                     @ execute next instruction
3668
3669
3670/* ------------------------------ */
3671    .balign 64
3672.L_OP_LONG_TO_FLOAT: /* 0x85 */
3673/* File: armv5te/OP_LONG_TO_FLOAT.S */
3674/* File: armv5te/unopNarrower.S */
3675    /*
3676     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3677     * that specifies an instruction that performs "result = op r0/r1", where
3678     * "result" is a 32-bit quantity in r0.
3679     *
3680     * For: long-to-float, double-to-int, double-to-float
3681     *
3682     * (This would work for long-to-int, but that instruction is actually
3683     * an exact match for OP_MOVE.)
3684     */
3685    /* unop vA, vB */
3686    mov     r3, rINST, lsr #12          @ r3<- B
3687    mov     r9, rINST, lsr #8           @ r9<- A+
3688    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3689    and     r9, r9, #15
3690    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3691    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3692                               @ optional op; may set condition codes
3693    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3694    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3695    SET_VREG(r0, r9)                    @ vA<- r0
3696    GOTO_OPCODE(ip)                     @ jump to next instruction
3697    /* 10-11 instructions */
3698
3699
3700/* ------------------------------ */
3701    .balign 64
3702.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3703/* File: armv5te/OP_LONG_TO_DOUBLE.S */
3704/* File: armv5te/unopWide.S */
3705    /*
3706     * Generic 64-bit unary operation.  Provide an "instr" line that
3707     * specifies an instruction that performs "result = op r0/r1".
3708     * This could be an ARM instruction or a function call.
3709     *
3710     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3711     */
3712    /* unop vA, vB */
3713    mov     r9, rINST, lsr #8           @ r9<- A+
3714    mov     r3, rINST, lsr #12          @ r3<- B
3715    and     r9, r9, #15
3716    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3717    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3718    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3719    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3720                               @ optional op; may set condition codes
3721    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3722    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3723    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3724    GOTO_OPCODE(ip)                     @ jump to next instruction
3725    /* 12-13 instructions */
3726
3727
3728/* ------------------------------ */
3729    .balign 64
3730.L_OP_FLOAT_TO_INT: /* 0x87 */
3731/* File: armv5te/OP_FLOAT_TO_INT.S */
3732/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3733/* File: armv5te/unop.S */
3734    /*
3735     * Generic 32-bit unary operation.  Provide an "instr" line that
3736     * specifies an instruction that performs "result = op r0".
3737     * This could be an ARM instruction or a function call.
3738     *
3739     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3740     *      int-to-byte, int-to-char, int-to-short
3741     */
3742    /* unop vA, vB */
3743    mov     r3, rINST, lsr #12          @ r3<- B
3744    mov     r9, rINST, lsr #8           @ r9<- A+
3745    GET_VREG(r0, r3)                    @ r0<- vB
3746    and     r9, r9, #15
3747                               @ optional op; may set condition codes
3748    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3749    bl      __aeabi_f2iz                              @ r0<- op, r0-r3 changed
3750    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3751    SET_VREG(r0, r9)                    @ vAA<- r0
3752    GOTO_OPCODE(ip)                     @ jump to next instruction
3753    /* 9-10 instructions */
3754
3755
3756#if 0
3757@include "armv5te/unop.S" {"instr":"bl      f2i_doconv"}
3758@break
3759/*
3760 * Convert the float in r0 to an int in r0.
3761 *
3762 * We have to clip values to int min/max per the specification.  The
3763 * expected common case is a "reasonable" value that converts directly
3764 * to modest integer.  The EABI convert function isn't doing this for us.
3765 */
3766f2i_doconv:
3767    stmfd   sp!, {r4, lr}
3768    mov     r1, #0x4f000000             @ (float)maxint
3769    mov     r4, r0
3770    bl      __aeabi_fcmpge              @ is arg >= maxint?
3771    cmp     r0, #0                      @ nonzero == yes
3772    mvnne   r0, #0x80000000             @ return maxint (7fffffff)
3773    ldmnefd sp!, {r4, pc}
3774
3775    mov     r0, r4                      @ recover arg
3776    mov     r1, #0xcf000000             @ (float)minint
3777    bl      __aeabi_fcmple              @ is arg <= minint?
3778    cmp     r0, #0                      @ nonzero == yes
3779    movne   r0, #0x80000000             @ return minint (80000000)
3780    ldmnefd sp!, {r4, pc}
3781
3782    mov     r0, r4                      @ recover arg
3783    mov     r1, r4
3784    bl      __aeabi_fcmpeq              @ is arg == self?
3785    cmp     r0, #0                      @ zero == no
3786    ldmeqfd sp!, {r4, pc}               @ return zero for NaN
3787
3788    mov     r0, r4                      @ recover arg
3789    bl      __aeabi_f2iz                @ convert float to int
3790    ldmfd   sp!, {r4, pc}
3791#endif
3792
3793/* ------------------------------ */
3794    .balign 64
3795.L_OP_FLOAT_TO_LONG: /* 0x88 */
3796/* File: armv5te/OP_FLOAT_TO_LONG.S */
3797@include "armv5te/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3798/* File: armv5te/unopWider.S */
3799    /*
3800     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3801     * that specifies an instruction that performs "result = op r0", where
3802     * "result" is a 64-bit quantity in r0/r1.
3803     *
3804     * For: int-to-long, int-to-double, float-to-long, float-to-double
3805     */
3806    /* unop vA, vB */
3807    mov     r9, rINST, lsr #8           @ r9<- A+
3808    mov     r3, rINST, lsr #12          @ r3<- B
3809    and     r9, r9, #15
3810    GET_VREG(r0, r3)                    @ r0<- vB
3811    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3812                               @ optional op; may set condition codes
3813    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3814    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3815    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3816    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3817    GOTO_OPCODE(ip)                     @ jump to next instruction
3818    /* 10-11 instructions */
3819
3820
3821
3822/* ------------------------------ */
3823    .balign 64
3824.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3825/* File: armv5te/OP_FLOAT_TO_DOUBLE.S */
3826/* File: armv5te/unopWider.S */
3827    /*
3828     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3829     * that specifies an instruction that performs "result = op r0", where
3830     * "result" is a 64-bit quantity in r0/r1.
3831     *
3832     * For: int-to-long, int-to-double, float-to-long, float-to-double
3833     */
3834    /* unop vA, vB */
3835    mov     r9, rINST, lsr #8           @ r9<- A+
3836    mov     r3, rINST, lsr #12          @ r3<- B
3837    and     r9, r9, #15
3838    GET_VREG(r0, r3)                    @ r0<- vB
3839    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3840                               @ optional op; may set condition codes
3841    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3842    bl      __aeabi_f2d                              @ r0<- op, r0-r3 changed
3843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3844    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3845    GOTO_OPCODE(ip)                     @ jump to next instruction
3846    /* 10-11 instructions */
3847
3848
3849/* ------------------------------ */
3850    .balign 64
3851.L_OP_DOUBLE_TO_INT: /* 0x8a */
3852/* File: armv5te/OP_DOUBLE_TO_INT.S */
3853/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3854/* File: armv5te/unopNarrower.S */
3855    /*
3856     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3857     * that specifies an instruction that performs "result = op r0/r1", where
3858     * "result" is a 32-bit quantity in r0.
3859     *
3860     * For: long-to-float, double-to-int, double-to-float
3861     *
3862     * (This would work for long-to-int, but that instruction is actually
3863     * an exact match for OP_MOVE.)
3864     */
3865    /* unop vA, vB */
3866    mov     r3, rINST, lsr #12          @ r3<- B
3867    mov     r9, rINST, lsr #8           @ r9<- A+
3868    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3869    and     r9, r9, #15
3870    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3871    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3872                               @ optional op; may set condition codes
3873    bl      __aeabi_d2iz                              @ r0<- op, r0-r3 changed
3874    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3875    SET_VREG(r0, r9)                    @ vA<- r0
3876    GOTO_OPCODE(ip)                     @ jump to next instruction
3877    /* 10-11 instructions */
3878
3879
3880#if 0
3881@include "armv5te/unopNarrower.S" {"instr":"bl      d2i_doconv"}
3882@break
3883/*
3884 * Convert the double in r0/r1 to an int in r0.
3885 *
3886 * We have to clip values to int min/max per the specification.  The
3887 * expected common case is a "reasonable" value that converts directly
3888 * to modest integer.  The EABI convert function isn't doing this for us.
3889 */
3890d2i_doconv:
3891    stmfd   sp!, {r4, r5, lr}           @ save regs
3892    mov     r2, #0x80000000             @ maxint, as a double (low word)
3893    mov     r2, r2, asr #9              @  0xffc00000
3894    sub     sp, sp, #4                  @ align for EABI
3895    mvn     r3, #0xbe000000             @ maxint, as a double (high word)
3896    sub     r3, r3, #0x00200000         @  0x41dfffff
3897    mov     r4, r0                      @ save a copy of r0
3898    mov     r5, r1                      @  and r1
3899    bl      __aeabi_dcmpge              @ is arg >= maxint?
3900    cmp     r0, #0                      @ nonzero == yes
3901    mvnne   r0, #0x80000000             @ return maxint (0x7fffffff)
3902    bne     1f
3903
3904    mov     r0, r4                      @ recover arg
3905    mov     r1, r5
3906    mov     r3, #0xc1000000             @ minint, as a double (high word)
3907    add     r3, r3, #0x00e00000         @  0xc1e00000
3908    mov     r2, #0                      @ minint, as a double (low word)
3909    bl      __aeabi_dcmple              @ is arg <= minint?
3910    cmp     r0, #0                      @ nonzero == yes
3911    movne   r0, #0x80000000             @ return minint (80000000)
3912    bne     1f
3913
3914    mov     r0, r4                      @ recover arg
3915    mov     r1, r5
3916    mov     r2, r4                      @ compare against self
3917    mov     r3, r5
3918    bl      __aeabi_dcmpeq              @ is arg == self?
3919    cmp     r0, #0                      @ zero == no
3920    beq     1f                          @ return zero for NaN
3921
3922    mov     r0, r4                      @ recover arg
3923    mov     r1, r5
3924    bl      __aeabi_d2iz                @ convert double to int
3925
39261:
3927    add     sp, sp, #4
3928    ldmfd   sp!, {r4, r5, pc}
3929#endif
3930
3931/* ------------------------------ */
3932    .balign 64
3933.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3934/* File: armv5te/OP_DOUBLE_TO_LONG.S */
3935@include "armv5te/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
3936/* File: armv5te/unopWide.S */
3937    /*
3938     * Generic 64-bit unary operation.  Provide an "instr" line that
3939     * specifies an instruction that performs "result = op r0/r1".
3940     * This could be an ARM instruction or a function call.
3941     *
3942     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3943     */
3944    /* unop vA, vB */
3945    mov     r9, rINST, lsr #8           @ r9<- A+
3946    mov     r3, rINST, lsr #12          @ r3<- B
3947    and     r9, r9, #15
3948    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3949    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3950    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3951    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3952                               @ optional op; may set condition codes
3953    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
3954    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3955    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3956    GOTO_OPCODE(ip)                     @ jump to next instruction
3957    /* 12-13 instructions */
3958
3959
3960
3961/* ------------------------------ */
3962    .balign 64
3963.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3964/* File: armv5te/OP_DOUBLE_TO_FLOAT.S */
3965/* File: armv5te/unopNarrower.S */
3966    /*
3967     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3968     * that specifies an instruction that performs "result = op r0/r1", where
3969     * "result" is a 32-bit quantity in r0.
3970     *
3971     * For: long-to-float, double-to-int, double-to-float
3972     *
3973     * (This would work for long-to-int, but that instruction is actually
3974     * an exact match for OP_MOVE.)
3975     */
3976    /* unop vA, vB */
3977    mov     r3, rINST, lsr #12          @ r3<- B
3978    mov     r9, rINST, lsr #8           @ r9<- A+
3979    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3980    and     r9, r9, #15
3981    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3982    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3983                               @ optional op; may set condition codes
3984    bl      __aeabi_d2f                              @ r0<- op, r0-r3 changed
3985    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3986    SET_VREG(r0, r9)                    @ vA<- r0
3987    GOTO_OPCODE(ip)                     @ jump to next instruction
3988    /* 10-11 instructions */
3989
3990
3991/* ------------------------------ */
3992    .balign 64
3993.L_OP_INT_TO_BYTE: /* 0x8d */
3994/* File: armv5te/OP_INT_TO_BYTE.S */
3995/* File: armv5te/unop.S */
3996    /*
3997     * Generic 32-bit unary operation.  Provide an "instr" line that
3998     * specifies an instruction that performs "result = op r0".
3999     * This could be an ARM instruction or a function call.
4000     *
4001     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4002     *      int-to-byte, int-to-char, int-to-short
4003     */
4004    /* unop vA, vB */
4005    mov     r3, rINST, lsr #12          @ r3<- B
4006    mov     r9, rINST, lsr #8           @ r9<- A+
4007    GET_VREG(r0, r3)                    @ r0<- vB
4008    and     r9, r9, #15
4009    mov     r0, r0, asl #24                           @ optional op; may set condition codes
4010    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4011    mov     r0, r0, asr #24                              @ r0<- op, r0-r3 changed
4012    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4013    SET_VREG(r0, r9)                    @ vAA<- r0
4014    GOTO_OPCODE(ip)                     @ jump to next instruction
4015    /* 9-10 instructions */
4016
4017
4018/* ------------------------------ */
4019    .balign 64
4020.L_OP_INT_TO_CHAR: /* 0x8e */
4021/* File: armv5te/OP_INT_TO_CHAR.S */
4022/* File: armv5te/unop.S */
4023    /*
4024     * Generic 32-bit unary operation.  Provide an "instr" line that
4025     * specifies an instruction that performs "result = op r0".
4026     * This could be an ARM instruction or a function call.
4027     *
4028     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4029     *      int-to-byte, int-to-char, int-to-short
4030     */
4031    /* unop vA, vB */
4032    mov     r3, rINST, lsr #12          @ r3<- B
4033    mov     r9, rINST, lsr #8           @ r9<- A+
4034    GET_VREG(r0, r3)                    @ r0<- vB
4035    and     r9, r9, #15
4036    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4037    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4038    mov     r0, r0, lsr #16                              @ r0<- op, r0-r3 changed
4039    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4040    SET_VREG(r0, r9)                    @ vAA<- r0
4041    GOTO_OPCODE(ip)                     @ jump to next instruction
4042    /* 9-10 instructions */
4043
4044
4045/* ------------------------------ */
4046    .balign 64
4047.L_OP_INT_TO_SHORT: /* 0x8f */
4048/* File: armv5te/OP_INT_TO_SHORT.S */
4049/* File: armv5te/unop.S */
4050    /*
4051     * Generic 32-bit unary operation.  Provide an "instr" line that
4052     * specifies an instruction that performs "result = op r0".
4053     * This could be an ARM instruction or a function call.
4054     *
4055     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4056     *      int-to-byte, int-to-char, int-to-short
4057     */
4058    /* unop vA, vB */
4059    mov     r3, rINST, lsr #12          @ r3<- B
4060    mov     r9, rINST, lsr #8           @ r9<- A+
4061    GET_VREG(r0, r3)                    @ r0<- vB
4062    and     r9, r9, #15
4063    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4064    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4065    mov     r0, r0, asr #16                              @ r0<- op, r0-r3 changed
4066    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4067    SET_VREG(r0, r9)                    @ vAA<- r0
4068    GOTO_OPCODE(ip)                     @ jump to next instruction
4069    /* 9-10 instructions */
4070
4071
4072/* ------------------------------ */
4073    .balign 64
4074.L_OP_ADD_INT: /* 0x90 */
4075/* File: armv5te/OP_ADD_INT.S */
4076/* File: armv5te/binop.S */
4077    /*
4078     * Generic 32-bit binary operation.  Provide an "instr" line that
4079     * specifies an instruction that performs "result = r0 op r1".
4080     * This could be an ARM instruction or a function call.  (If the result
4081     * comes back in a register other than r0, you can override "result".)
4082     *
4083     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4084     * vCC (r1).  Useful for integer division and modulus.  Note that we
4085     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4086     * handles it correctly.
4087     *
4088     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4089     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4090     *      mul-float, div-float, rem-float
4091     */
4092    /* binop vAA, vBB, vCC */
4093    FETCH(r0, 1)                        @ r0<- CCBB
4094    mov     r9, rINST, lsr #8           @ r9<- AA
4095    mov     r3, r0, lsr #8              @ r3<- CC
4096    and     r2, r0, #255                @ r2<- BB
4097    GET_VREG(r1, r3)                    @ r1<- vCC
4098    GET_VREG(r0, r2)                    @ r0<- vBB
4099    .if 0
4100    cmp     r1, #0                      @ is second operand zero?
4101    beq     common_errDivideByZero
4102    .endif
4103
4104    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4105                               @ optional op; may set condition codes
4106    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
4107    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4108    SET_VREG(r0, r9)               @ vAA<- r0
4109    GOTO_OPCODE(ip)                     @ jump to next instruction
4110    /* 11-14 instructions */
4111
4112
4113/* ------------------------------ */
4114    .balign 64
4115.L_OP_SUB_INT: /* 0x91 */
4116/* File: armv5te/OP_SUB_INT.S */
4117/* File: armv5te/binop.S */
4118    /*
4119     * Generic 32-bit binary operation.  Provide an "instr" line that
4120     * specifies an instruction that performs "result = r0 op r1".
4121     * This could be an ARM instruction or a function call.  (If the result
4122     * comes back in a register other than r0, you can override "result".)
4123     *
4124     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4125     * vCC (r1).  Useful for integer division and modulus.  Note that we
4126     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4127     * handles it correctly.
4128     *
4129     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4130     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4131     *      mul-float, div-float, rem-float
4132     */
4133    /* binop vAA, vBB, vCC */
4134    FETCH(r0, 1)                        @ r0<- CCBB
4135    mov     r9, rINST, lsr #8           @ r9<- AA
4136    mov     r3, r0, lsr #8              @ r3<- CC
4137    and     r2, r0, #255                @ r2<- BB
4138    GET_VREG(r1, r3)                    @ r1<- vCC
4139    GET_VREG(r0, r2)                    @ r0<- vBB
4140    .if 0
4141    cmp     r1, #0                      @ is second operand zero?
4142    beq     common_errDivideByZero
4143    .endif
4144
4145    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4146                               @ optional op; may set condition codes
4147    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4148    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4149    SET_VREG(r0, r9)               @ vAA<- r0
4150    GOTO_OPCODE(ip)                     @ jump to next instruction
4151    /* 11-14 instructions */
4152
4153
4154/* ------------------------------ */
4155    .balign 64
4156.L_OP_MUL_INT: /* 0x92 */
4157/* File: armv5te/OP_MUL_INT.S */
4158/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4159/* File: armv5te/binop.S */
4160    /*
4161     * Generic 32-bit binary operation.  Provide an "instr" line that
4162     * specifies an instruction that performs "result = r0 op r1".
4163     * This could be an ARM instruction or a function call.  (If the result
4164     * comes back in a register other than r0, you can override "result".)
4165     *
4166     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4167     * vCC (r1).  Useful for integer division and modulus.  Note that we
4168     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4169     * handles it correctly.
4170     *
4171     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4172     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4173     *      mul-float, div-float, rem-float
4174     */
4175    /* binop vAA, vBB, vCC */
4176    FETCH(r0, 1)                        @ r0<- CCBB
4177    mov     r9, rINST, lsr #8           @ r9<- AA
4178    mov     r3, r0, lsr #8              @ r3<- CC
4179    and     r2, r0, #255                @ r2<- BB
4180    GET_VREG(r1, r3)                    @ r1<- vCC
4181    GET_VREG(r0, r2)                    @ r0<- vBB
4182    .if 0
4183    cmp     r1, #0                      @ is second operand zero?
4184    beq     common_errDivideByZero
4185    .endif
4186
4187    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4188                               @ optional op; may set condition codes
4189    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4190    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4191    SET_VREG(r0, r9)               @ vAA<- r0
4192    GOTO_OPCODE(ip)                     @ jump to next instruction
4193    /* 11-14 instructions */
4194
4195
4196/* ------------------------------ */
4197    .balign 64
4198.L_OP_DIV_INT: /* 0x93 */
4199/* File: armv5te/OP_DIV_INT.S */
4200/* File: armv5te/binop.S */
4201    /*
4202     * Generic 32-bit binary operation.  Provide an "instr" line that
4203     * specifies an instruction that performs "result = r0 op r1".
4204     * This could be an ARM instruction or a function call.  (If the result
4205     * comes back in a register other than r0, you can override "result".)
4206     *
4207     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4208     * vCC (r1).  Useful for integer division and modulus.  Note that we
4209     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4210     * handles it correctly.
4211     *
4212     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4213     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4214     *      mul-float, div-float, rem-float
4215     */
4216    /* binop vAA, vBB, vCC */
4217    FETCH(r0, 1)                        @ r0<- CCBB
4218    mov     r9, rINST, lsr #8           @ r9<- AA
4219    mov     r3, r0, lsr #8              @ r3<- CC
4220    and     r2, r0, #255                @ r2<- BB
4221    GET_VREG(r1, r3)                    @ r1<- vCC
4222    GET_VREG(r0, r2)                    @ r0<- vBB
4223    .if 1
4224    cmp     r1, #0                      @ is second operand zero?
4225    beq     common_errDivideByZero
4226    .endif
4227
4228    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4229                               @ optional op; may set condition codes
4230    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4231    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4232    SET_VREG(r0, r9)               @ vAA<- r0
4233    GOTO_OPCODE(ip)                     @ jump to next instruction
4234    /* 11-14 instructions */
4235
4236
4237/* ------------------------------ */
4238    .balign 64
4239.L_OP_REM_INT: /* 0x94 */
4240/* File: armv5te/OP_REM_INT.S */
4241/* idivmod returns quotient in r0 and remainder in r1 */
4242/* File: armv5te/binop.S */
4243    /*
4244     * Generic 32-bit binary operation.  Provide an "instr" line that
4245     * specifies an instruction that performs "result = r0 op r1".
4246     * This could be an ARM instruction or a function call.  (If the result
4247     * comes back in a register other than r0, you can override "result".)
4248     *
4249     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4250     * vCC (r1).  Useful for integer division and modulus.  Note that we
4251     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4252     * handles it correctly.
4253     *
4254     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4255     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4256     *      mul-float, div-float, rem-float
4257     */
4258    /* binop vAA, vBB, vCC */
4259    FETCH(r0, 1)                        @ r0<- CCBB
4260    mov     r9, rINST, lsr #8           @ r9<- AA
4261    mov     r3, r0, lsr #8              @ r3<- CC
4262    and     r2, r0, #255                @ r2<- BB
4263    GET_VREG(r1, r3)                    @ r1<- vCC
4264    GET_VREG(r0, r2)                    @ r0<- vBB
4265    .if 1
4266    cmp     r1, #0                      @ is second operand zero?
4267    beq     common_errDivideByZero
4268    .endif
4269
4270    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4271                               @ optional op; may set condition codes
4272    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4273    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4274    SET_VREG(r1, r9)               @ vAA<- r1
4275    GOTO_OPCODE(ip)                     @ jump to next instruction
4276    /* 11-14 instructions */
4277
4278
4279/* ------------------------------ */
4280    .balign 64
4281.L_OP_AND_INT: /* 0x95 */
4282/* File: armv5te/OP_AND_INT.S */
4283/* File: armv5te/binop.S */
4284    /*
4285     * Generic 32-bit binary operation.  Provide an "instr" line that
4286     * specifies an instruction that performs "result = r0 op r1".
4287     * This could be an ARM instruction or a function call.  (If the result
4288     * comes back in a register other than r0, you can override "result".)
4289     *
4290     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4291     * vCC (r1).  Useful for integer division and modulus.  Note that we
4292     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4293     * handles it correctly.
4294     *
4295     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4296     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4297     *      mul-float, div-float, rem-float
4298     */
4299    /* binop vAA, vBB, vCC */
4300    FETCH(r0, 1)                        @ r0<- CCBB
4301    mov     r9, rINST, lsr #8           @ r9<- AA
4302    mov     r3, r0, lsr #8              @ r3<- CC
4303    and     r2, r0, #255                @ r2<- BB
4304    GET_VREG(r1, r3)                    @ r1<- vCC
4305    GET_VREG(r0, r2)                    @ r0<- vBB
4306    .if 0
4307    cmp     r1, #0                      @ is second operand zero?
4308    beq     common_errDivideByZero
4309    .endif
4310
4311    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4312                               @ optional op; may set condition codes
4313    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4314    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4315    SET_VREG(r0, r9)               @ vAA<- r0
4316    GOTO_OPCODE(ip)                     @ jump to next instruction
4317    /* 11-14 instructions */
4318
4319
4320/* ------------------------------ */
4321    .balign 64
4322.L_OP_OR_INT: /* 0x96 */
4323/* File: armv5te/OP_OR_INT.S */
4324/* File: armv5te/binop.S */
4325    /*
4326     * Generic 32-bit binary operation.  Provide an "instr" line that
4327     * specifies an instruction that performs "result = r0 op r1".
4328     * This could be an ARM instruction or a function call.  (If the result
4329     * comes back in a register other than r0, you can override "result".)
4330     *
4331     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4332     * vCC (r1).  Useful for integer division and modulus.  Note that we
4333     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4334     * handles it correctly.
4335     *
4336     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4337     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4338     *      mul-float, div-float, rem-float
4339     */
4340    /* binop vAA, vBB, vCC */
4341    FETCH(r0, 1)                        @ r0<- CCBB
4342    mov     r9, rINST, lsr #8           @ r9<- AA
4343    mov     r3, r0, lsr #8              @ r3<- CC
4344    and     r2, r0, #255                @ r2<- BB
4345    GET_VREG(r1, r3)                    @ r1<- vCC
4346    GET_VREG(r0, r2)                    @ r0<- vBB
4347    .if 0
4348    cmp     r1, #0                      @ is second operand zero?
4349    beq     common_errDivideByZero
4350    .endif
4351
4352    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4353                               @ optional op; may set condition codes
4354    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4355    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4356    SET_VREG(r0, r9)               @ vAA<- r0
4357    GOTO_OPCODE(ip)                     @ jump to next instruction
4358    /* 11-14 instructions */
4359
4360
4361/* ------------------------------ */
4362    .balign 64
4363.L_OP_XOR_INT: /* 0x97 */
4364/* File: armv5te/OP_XOR_INT.S */
4365/* File: armv5te/binop.S */
4366    /*
4367     * Generic 32-bit binary operation.  Provide an "instr" line that
4368     * specifies an instruction that performs "result = r0 op r1".
4369     * This could be an ARM instruction or a function call.  (If the result
4370     * comes back in a register other than r0, you can override "result".)
4371     *
4372     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4373     * vCC (r1).  Useful for integer division and modulus.  Note that we
4374     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4375     * handles it correctly.
4376     *
4377     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4378     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4379     *      mul-float, div-float, rem-float
4380     */
4381    /* binop vAA, vBB, vCC */
4382    FETCH(r0, 1)                        @ r0<- CCBB
4383    mov     r9, rINST, lsr #8           @ r9<- AA
4384    mov     r3, r0, lsr #8              @ r3<- CC
4385    and     r2, r0, #255                @ r2<- BB
4386    GET_VREG(r1, r3)                    @ r1<- vCC
4387    GET_VREG(r0, r2)                    @ r0<- vBB
4388    .if 0
4389    cmp     r1, #0                      @ is second operand zero?
4390    beq     common_errDivideByZero
4391    .endif
4392
4393    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4394                               @ optional op; may set condition codes
4395    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4396    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4397    SET_VREG(r0, r9)               @ vAA<- r0
4398    GOTO_OPCODE(ip)                     @ jump to next instruction
4399    /* 11-14 instructions */
4400
4401
4402/* ------------------------------ */
4403    .balign 64
4404.L_OP_SHL_INT: /* 0x98 */
4405/* File: armv5te/OP_SHL_INT.S */
4406/* File: armv5te/binop.S */
4407    /*
4408     * Generic 32-bit binary operation.  Provide an "instr" line that
4409     * specifies an instruction that performs "result = r0 op r1".
4410     * This could be an ARM instruction or a function call.  (If the result
4411     * comes back in a register other than r0, you can override "result".)
4412     *
4413     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4414     * vCC (r1).  Useful for integer division and modulus.  Note that we
4415     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4416     * handles it correctly.
4417     *
4418     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4419     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4420     *      mul-float, div-float, rem-float
4421     */
4422    /* binop vAA, vBB, vCC */
4423    FETCH(r0, 1)                        @ r0<- CCBB
4424    mov     r9, rINST, lsr #8           @ r9<- AA
4425    mov     r3, r0, lsr #8              @ r3<- CC
4426    and     r2, r0, #255                @ r2<- BB
4427    GET_VREG(r1, r3)                    @ r1<- vCC
4428    GET_VREG(r0, r2)                    @ r0<- vBB
4429    .if 0
4430    cmp     r1, #0                      @ is second operand zero?
4431    beq     common_errDivideByZero
4432    .endif
4433
4434    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4435    and     r1, r1, #31                           @ optional op; may set condition codes
4436    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4437    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4438    SET_VREG(r0, r9)               @ vAA<- r0
4439    GOTO_OPCODE(ip)                     @ jump to next instruction
4440    /* 11-14 instructions */
4441
4442
4443/* ------------------------------ */
4444    .balign 64
4445.L_OP_SHR_INT: /* 0x99 */
4446/* File: armv5te/OP_SHR_INT.S */
4447/* File: armv5te/binop.S */
4448    /*
4449     * Generic 32-bit binary operation.  Provide an "instr" line that
4450     * specifies an instruction that performs "result = r0 op r1".
4451     * This could be an ARM instruction or a function call.  (If the result
4452     * comes back in a register other than r0, you can override "result".)
4453     *
4454     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4455     * vCC (r1).  Useful for integer division and modulus.  Note that we
4456     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4457     * handles it correctly.
4458     *
4459     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4460     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4461     *      mul-float, div-float, rem-float
4462     */
4463    /* binop vAA, vBB, vCC */
4464    FETCH(r0, 1)                        @ r0<- CCBB
4465    mov     r9, rINST, lsr #8           @ r9<- AA
4466    mov     r3, r0, lsr #8              @ r3<- CC
4467    and     r2, r0, #255                @ r2<- BB
4468    GET_VREG(r1, r3)                    @ r1<- vCC
4469    GET_VREG(r0, r2)                    @ r0<- vBB
4470    .if 0
4471    cmp     r1, #0                      @ is second operand zero?
4472    beq     common_errDivideByZero
4473    .endif
4474
4475    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4476    and     r1, r1, #31                           @ optional op; may set condition codes
4477    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4478    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4479    SET_VREG(r0, r9)               @ vAA<- r0
4480    GOTO_OPCODE(ip)                     @ jump to next instruction
4481    /* 11-14 instructions */
4482
4483
4484/* ------------------------------ */
4485    .balign 64
4486.L_OP_USHR_INT: /* 0x9a */
4487/* File: armv5te/OP_USHR_INT.S */
4488/* File: armv5te/binop.S */
4489    /*
4490     * Generic 32-bit binary operation.  Provide an "instr" line that
4491     * specifies an instruction that performs "result = r0 op r1".
4492     * This could be an ARM instruction or a function call.  (If the result
4493     * comes back in a register other than r0, you can override "result".)
4494     *
4495     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4496     * vCC (r1).  Useful for integer division and modulus.  Note that we
4497     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4498     * handles it correctly.
4499     *
4500     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4501     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4502     *      mul-float, div-float, rem-float
4503     */
4504    /* binop vAA, vBB, vCC */
4505    FETCH(r0, 1)                        @ r0<- CCBB
4506    mov     r9, rINST, lsr #8           @ r9<- AA
4507    mov     r3, r0, lsr #8              @ r3<- CC
4508    and     r2, r0, #255                @ r2<- BB
4509    GET_VREG(r1, r3)                    @ r1<- vCC
4510    GET_VREG(r0, r2)                    @ r0<- vBB
4511    .if 0
4512    cmp     r1, #0                      @ is second operand zero?
4513    beq     common_errDivideByZero
4514    .endif
4515
4516    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4517    and     r1, r1, #31                           @ optional op; may set condition codes
4518    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4519    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4520    SET_VREG(r0, r9)               @ vAA<- r0
4521    GOTO_OPCODE(ip)                     @ jump to next instruction
4522    /* 11-14 instructions */
4523
4524
4525/* ------------------------------ */
4526    .balign 64
4527.L_OP_ADD_LONG: /* 0x9b */
4528/* File: armv5te/OP_ADD_LONG.S */
4529/* File: armv5te/binopWide.S */
4530    /*
4531     * Generic 64-bit binary operation.  Provide an "instr" line that
4532     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4533     * This could be an ARM instruction or a function call.  (If the result
4534     * comes back in a register other than r0, you can override "result".)
4535     *
4536     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4537     * vCC (r1).  Useful for integer division and modulus.
4538     *
4539     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4540     *      xor-long, add-double, sub-double, mul-double, div-double,
4541     *      rem-double
4542     *
4543     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4544     */
4545    /* binop vAA, vBB, vCC */
4546    FETCH(r0, 1)                        @ r0<- CCBB
4547    mov     r9, rINST, lsr #8           @ r9<- AA
4548    and     r2, r0, #255                @ r2<- BB
4549    mov     r3, r0, lsr #8              @ r3<- CC
4550    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4551    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4552    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4553    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4554    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4555    .if 0
4556    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4557    beq     common_errDivideByZero
4558    .endif
4559    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4560
4561    adds    r0, r0, r2                           @ optional op; may set condition codes
4562    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4563    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4564    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4565    GOTO_OPCODE(ip)                     @ jump to next instruction
4566    /* 14-17 instructions */
4567
4568
4569/* ------------------------------ */
4570    .balign 64
4571.L_OP_SUB_LONG: /* 0x9c */
4572/* File: armv5te/OP_SUB_LONG.S */
4573/* File: armv5te/binopWide.S */
4574    /*
4575     * Generic 64-bit binary operation.  Provide an "instr" line that
4576     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4577     * This could be an ARM instruction or a function call.  (If the result
4578     * comes back in a register other than r0, you can override "result".)
4579     *
4580     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4581     * vCC (r1).  Useful for integer division and modulus.
4582     *
4583     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4584     *      xor-long, add-double, sub-double, mul-double, div-double,
4585     *      rem-double
4586     *
4587     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4588     */
4589    /* binop vAA, vBB, vCC */
4590    FETCH(r0, 1)                        @ r0<- CCBB
4591    mov     r9, rINST, lsr #8           @ r9<- AA
4592    and     r2, r0, #255                @ r2<- BB
4593    mov     r3, r0, lsr #8              @ r3<- CC
4594    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4595    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4596    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4597    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4598    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4599    .if 0
4600    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4601    beq     common_errDivideByZero
4602    .endif
4603    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4604
4605    subs    r0, r0, r2                           @ optional op; may set condition codes
4606    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4607    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4608    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4609    GOTO_OPCODE(ip)                     @ jump to next instruction
4610    /* 14-17 instructions */
4611
4612
4613/* ------------------------------ */
4614    .balign 64
4615.L_OP_MUL_LONG: /* 0x9d */
4616/* File: armv5te/OP_MUL_LONG.S */
4617    /*
4618     * Signed 64-bit integer multiply.
4619     *
4620     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4621     *        WX
4622     *      x YZ
4623     *  --------
4624     *     ZW ZX
4625     *  YW YX
4626     *
4627     * The low word of the result holds ZX, the high word holds
4628     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4629     * it doesn't fit in the low 64 bits.
4630     *
4631     * Unlike most ARM math operations, multiply instructions have
4632     * restrictions on using the same register more than once (Rd and Rm
4633     * cannot be the same).
4634     */
4635    /* mul-long vAA, vBB, vCC */
4636    FETCH(r0, 1)                        @ r0<- CCBB
4637    and     r2, r0, #255                @ r2<- BB
4638    mov     r3, r0, lsr #8              @ r3<- CC
4639    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4640    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4641    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4642    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4643    mul     ip, r2, r1                  @  ip<- ZxW
4644    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4645    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4646    mov     r0, rINST, lsr #8           @ r0<- AA
4647    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4648    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4649    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4650    b       .LOP_MUL_LONG_finish
4651
4652/* ------------------------------ */
4653    .balign 64
4654.L_OP_DIV_LONG: /* 0x9e */
4655/* File: armv5te/OP_DIV_LONG.S */
4656/* File: armv5te/binopWide.S */
4657    /*
4658     * Generic 64-bit binary operation.  Provide an "instr" line that
4659     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4660     * This could be an ARM instruction or a function call.  (If the result
4661     * comes back in a register other than r0, you can override "result".)
4662     *
4663     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4664     * vCC (r1).  Useful for integer division and modulus.
4665     *
4666     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4667     *      xor-long, add-double, sub-double, mul-double, div-double,
4668     *      rem-double
4669     *
4670     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4671     */
4672    /* binop vAA, vBB, vCC */
4673    FETCH(r0, 1)                        @ r0<- CCBB
4674    mov     r9, rINST, lsr #8           @ r9<- AA
4675    and     r2, r0, #255                @ r2<- BB
4676    mov     r3, r0, lsr #8              @ r3<- CC
4677    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4678    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4679    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4680    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4681    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4682    .if 1
4683    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4684    beq     common_errDivideByZero
4685    .endif
4686    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4687
4688                               @ optional op; may set condition codes
4689    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4690    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4691    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4692    GOTO_OPCODE(ip)                     @ jump to next instruction
4693    /* 14-17 instructions */
4694
4695
4696/* ------------------------------ */
4697    .balign 64
4698.L_OP_REM_LONG: /* 0x9f */
4699/* File: armv5te/OP_REM_LONG.S */
4700/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4701/* File: armv5te/binopWide.S */
4702    /*
4703     * Generic 64-bit binary operation.  Provide an "instr" line that
4704     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4705     * This could be an ARM instruction or a function call.  (If the result
4706     * comes back in a register other than r0, you can override "result".)
4707     *
4708     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4709     * vCC (r1).  Useful for integer division and modulus.
4710     *
4711     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4712     *      xor-long, add-double, sub-double, mul-double, div-double,
4713     *      rem-double
4714     *
4715     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4716     */
4717    /* binop vAA, vBB, vCC */
4718    FETCH(r0, 1)                        @ r0<- CCBB
4719    mov     r9, rINST, lsr #8           @ r9<- AA
4720    and     r2, r0, #255                @ r2<- BB
4721    mov     r3, r0, lsr #8              @ r3<- CC
4722    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4723    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4724    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4725    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4726    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4727    .if 1
4728    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4729    beq     common_errDivideByZero
4730    .endif
4731    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4732
4733                               @ optional op; may set condition codes
4734    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4735    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4736    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4737    GOTO_OPCODE(ip)                     @ jump to next instruction
4738    /* 14-17 instructions */
4739
4740
4741/* ------------------------------ */
4742    .balign 64
4743.L_OP_AND_LONG: /* 0xa0 */
4744/* File: armv5te/OP_AND_LONG.S */
4745/* File: armv5te/binopWide.S */
4746    /*
4747     * Generic 64-bit binary operation.  Provide an "instr" line that
4748     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4749     * This could be an ARM instruction or a function call.  (If the result
4750     * comes back in a register other than r0, you can override "result".)
4751     *
4752     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4753     * vCC (r1).  Useful for integer division and modulus.
4754     *
4755     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4756     *      xor-long, add-double, sub-double, mul-double, div-double,
4757     *      rem-double
4758     *
4759     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4760     */
4761    /* binop vAA, vBB, vCC */
4762    FETCH(r0, 1)                        @ r0<- CCBB
4763    mov     r9, rINST, lsr #8           @ r9<- AA
4764    and     r2, r0, #255                @ r2<- BB
4765    mov     r3, r0, lsr #8              @ r3<- CC
4766    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4767    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4768    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4769    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4770    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4771    .if 0
4772    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4773    beq     common_errDivideByZero
4774    .endif
4775    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4776
4777    and     r0, r0, r2                           @ optional op; may set condition codes
4778    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4779    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4780    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4781    GOTO_OPCODE(ip)                     @ jump to next instruction
4782    /* 14-17 instructions */
4783
4784
4785/* ------------------------------ */
4786    .balign 64
4787.L_OP_OR_LONG: /* 0xa1 */
4788/* File: armv5te/OP_OR_LONG.S */
4789/* File: armv5te/binopWide.S */
4790    /*
4791     * Generic 64-bit binary operation.  Provide an "instr" line that
4792     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4793     * This could be an ARM instruction or a function call.  (If the result
4794     * comes back in a register other than r0, you can override "result".)
4795     *
4796     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4797     * vCC (r1).  Useful for integer division and modulus.
4798     *
4799     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4800     *      xor-long, add-double, sub-double, mul-double, div-double,
4801     *      rem-double
4802     *
4803     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4804     */
4805    /* binop vAA, vBB, vCC */
4806    FETCH(r0, 1)                        @ r0<- CCBB
4807    mov     r9, rINST, lsr #8           @ r9<- AA
4808    and     r2, r0, #255                @ r2<- BB
4809    mov     r3, r0, lsr #8              @ r3<- CC
4810    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4811    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4812    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4813    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4814    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4815    .if 0
4816    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4817    beq     common_errDivideByZero
4818    .endif
4819    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4820
4821    orr     r0, r0, r2                           @ optional op; may set condition codes
4822    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4823    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4824    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4825    GOTO_OPCODE(ip)                     @ jump to next instruction
4826    /* 14-17 instructions */
4827
4828
4829/* ------------------------------ */
4830    .balign 64
4831.L_OP_XOR_LONG: /* 0xa2 */
4832/* File: armv5te/OP_XOR_LONG.S */
4833/* File: armv5te/binopWide.S */
4834    /*
4835     * Generic 64-bit binary operation.  Provide an "instr" line that
4836     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4837     * This could be an ARM instruction or a function call.  (If the result
4838     * comes back in a register other than r0, you can override "result".)
4839     *
4840     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4841     * vCC (r1).  Useful for integer division and modulus.
4842     *
4843     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4844     *      xor-long, add-double, sub-double, mul-double, div-double,
4845     *      rem-double
4846     *
4847     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4848     */
4849    /* binop vAA, vBB, vCC */
4850    FETCH(r0, 1)                        @ r0<- CCBB
4851    mov     r9, rINST, lsr #8           @ r9<- AA
4852    and     r2, r0, #255                @ r2<- BB
4853    mov     r3, r0, lsr #8              @ r3<- CC
4854    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4855    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4856    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4857    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4858    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4859    .if 0
4860    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4861    beq     common_errDivideByZero
4862    .endif
4863    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4864
4865    eor     r0, r0, r2                           @ optional op; may set condition codes
4866    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4867    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4868    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4869    GOTO_OPCODE(ip)                     @ jump to next instruction
4870    /* 14-17 instructions */
4871
4872
4873/* ------------------------------ */
4874    .balign 64
4875.L_OP_SHL_LONG: /* 0xa3 */
4876/* File: armv5te/OP_SHL_LONG.S */
4877    /*
4878     * Long integer shift.  This is different from the generic 32/64-bit
4879     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4880     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4881     * 6 bits of the shift distance.
4882     */
4883    /* shl-long vAA, vBB, vCC */
4884    FETCH(r0, 1)                        @ r0<- CCBB
4885    mov     r9, rINST, lsr #8           @ r9<- AA
4886    and     r3, r0, #255                @ r3<- BB
4887    mov     r0, r0, lsr #8              @ r0<- CC
4888    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4889    GET_VREG(r2, r0)                    @ r2<- vCC
4890    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4891    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4892    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4893
4894    mov     r1, r1, asl r2              @  r1<- r1 << r2
4895    rsb     r3, r2, #32                 @  r3<- 32 - r2
4896    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
4897    subs    ip, r2, #32                 @  ip<- r2 - 32
4898    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
4899    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4900    b       .LOP_SHL_LONG_finish
4901
4902/* ------------------------------ */
4903    .balign 64
4904.L_OP_SHR_LONG: /* 0xa4 */
4905/* File: armv5te/OP_SHR_LONG.S */
4906    /*
4907     * Long integer shift.  This is different from the generic 32/64-bit
4908     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4909     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4910     * 6 bits of the shift distance.
4911     */
4912    /* shr-long vAA, vBB, vCC */
4913    FETCH(r0, 1)                        @ r0<- CCBB
4914    mov     r9, rINST, lsr #8           @ r9<- AA
4915    and     r3, r0, #255                @ r3<- BB
4916    mov     r0, r0, lsr #8              @ r0<- CC
4917    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4918    GET_VREG(r2, r0)                    @ r2<- vCC
4919    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4920    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4921    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4922
4923    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4924    rsb     r3, r2, #32                 @  r3<- 32 - r2
4925    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4926    subs    ip, r2, #32                 @  ip<- r2 - 32
4927    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
4928    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4929    b       .LOP_SHR_LONG_finish
4930
4931/* ------------------------------ */
4932    .balign 64
4933.L_OP_USHR_LONG: /* 0xa5 */
4934/* File: armv5te/OP_USHR_LONG.S */
4935    /*
4936     * Long integer shift.  This is different from the generic 32/64-bit
4937     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4938     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4939     * 6 bits of the shift distance.
4940     */
4941    /* ushr-long vAA, vBB, vCC */
4942    FETCH(r0, 1)                        @ r0<- CCBB
4943    mov     r9, rINST, lsr #8           @ r9<- AA
4944    and     r3, r0, #255                @ r3<- BB
4945    mov     r0, r0, lsr #8              @ r0<- CC
4946    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4947    GET_VREG(r2, r0)                    @ r2<- vCC
4948    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4949    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4950    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4951
4952    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4953    rsb     r3, r2, #32                 @  r3<- 32 - r2
4954    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4955    subs    ip, r2, #32                 @  ip<- r2 - 32
4956    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
4957    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4958    b       .LOP_USHR_LONG_finish
4959
4960/* ------------------------------ */
4961    .balign 64
4962.L_OP_ADD_FLOAT: /* 0xa6 */
4963/* File: armv5te/OP_ADD_FLOAT.S */
4964/* File: armv5te/binop.S */
4965    /*
4966     * Generic 32-bit binary operation.  Provide an "instr" line that
4967     * specifies an instruction that performs "result = r0 op r1".
4968     * This could be an ARM instruction or a function call.  (If the result
4969     * comes back in a register other than r0, you can override "result".)
4970     *
4971     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4972     * vCC (r1).  Useful for integer division and modulus.  Note that we
4973     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4974     * handles it correctly.
4975     *
4976     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4977     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4978     *      mul-float, div-float, rem-float
4979     */
4980    /* binop vAA, vBB, vCC */
4981    FETCH(r0, 1)                        @ r0<- CCBB
4982    mov     r9, rINST, lsr #8           @ r9<- AA
4983    mov     r3, r0, lsr #8              @ r3<- CC
4984    and     r2, r0, #255                @ r2<- BB
4985    GET_VREG(r1, r3)                    @ r1<- vCC
4986    GET_VREG(r0, r2)                    @ r0<- vBB
4987    .if 0
4988    cmp     r1, #0                      @ is second operand zero?
4989    beq     common_errDivideByZero
4990    .endif
4991
4992    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4993                               @ optional op; may set condition codes
4994    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
4995    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4996    SET_VREG(r0, r9)               @ vAA<- r0
4997    GOTO_OPCODE(ip)                     @ jump to next instruction
4998    /* 11-14 instructions */
4999
5000
5001/* ------------------------------ */
5002    .balign 64
5003.L_OP_SUB_FLOAT: /* 0xa7 */
5004/* File: armv5te/OP_SUB_FLOAT.S */
5005/* File: armv5te/binop.S */
5006    /*
5007     * Generic 32-bit binary operation.  Provide an "instr" line that
5008     * specifies an instruction that performs "result = r0 op r1".
5009     * This could be an ARM instruction or a function call.  (If the result
5010     * comes back in a register other than r0, you can override "result".)
5011     *
5012     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5013     * vCC (r1).  Useful for integer division and modulus.  Note that we
5014     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5015     * handles it correctly.
5016     *
5017     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5018     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5019     *      mul-float, div-float, rem-float
5020     */
5021    /* binop vAA, vBB, vCC */
5022    FETCH(r0, 1)                        @ r0<- CCBB
5023    mov     r9, rINST, lsr #8           @ r9<- AA
5024    mov     r3, r0, lsr #8              @ r3<- CC
5025    and     r2, r0, #255                @ r2<- BB
5026    GET_VREG(r1, r3)                    @ r1<- vCC
5027    GET_VREG(r0, r2)                    @ r0<- vBB
5028    .if 0
5029    cmp     r1, #0                      @ is second operand zero?
5030    beq     common_errDivideByZero
5031    .endif
5032
5033    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5034                               @ optional op; may set condition codes
5035    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
5036    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5037    SET_VREG(r0, r9)               @ vAA<- r0
5038    GOTO_OPCODE(ip)                     @ jump to next instruction
5039    /* 11-14 instructions */
5040
5041
5042/* ------------------------------ */
5043    .balign 64
5044.L_OP_MUL_FLOAT: /* 0xa8 */
5045/* File: armv5te/OP_MUL_FLOAT.S */
5046/* File: armv5te/binop.S */
5047    /*
5048     * Generic 32-bit binary operation.  Provide an "instr" line that
5049     * specifies an instruction that performs "result = r0 op r1".
5050     * This could be an ARM instruction or a function call.  (If the result
5051     * comes back in a register other than r0, you can override "result".)
5052     *
5053     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5054     * vCC (r1).  Useful for integer division and modulus.  Note that we
5055     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5056     * handles it correctly.
5057     *
5058     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5059     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5060     *      mul-float, div-float, rem-float
5061     */
5062    /* binop vAA, vBB, vCC */
5063    FETCH(r0, 1)                        @ r0<- CCBB
5064    mov     r9, rINST, lsr #8           @ r9<- AA
5065    mov     r3, r0, lsr #8              @ r3<- CC
5066    and     r2, r0, #255                @ r2<- BB
5067    GET_VREG(r1, r3)                    @ r1<- vCC
5068    GET_VREG(r0, r2)                    @ r0<- vBB
5069    .if 0
5070    cmp     r1, #0                      @ is second operand zero?
5071    beq     common_errDivideByZero
5072    .endif
5073
5074    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5075                               @ optional op; may set condition codes
5076    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
5077    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5078    SET_VREG(r0, r9)               @ vAA<- r0
5079    GOTO_OPCODE(ip)                     @ jump to next instruction
5080    /* 11-14 instructions */
5081
5082
5083/* ------------------------------ */
5084    .balign 64
5085.L_OP_DIV_FLOAT: /* 0xa9 */
5086/* File: armv5te/OP_DIV_FLOAT.S */
5087/* File: armv5te/binop.S */
5088    /*
5089     * Generic 32-bit binary operation.  Provide an "instr" line that
5090     * specifies an instruction that performs "result = r0 op r1".
5091     * This could be an ARM instruction or a function call.  (If the result
5092     * comes back in a register other than r0, you can override "result".)
5093     *
5094     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5095     * vCC (r1).  Useful for integer division and modulus.  Note that we
5096     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5097     * handles it correctly.
5098     *
5099     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5100     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5101     *      mul-float, div-float, rem-float
5102     */
5103    /* binop vAA, vBB, vCC */
5104    FETCH(r0, 1)                        @ r0<- CCBB
5105    mov     r9, rINST, lsr #8           @ r9<- AA
5106    mov     r3, r0, lsr #8              @ r3<- CC
5107    and     r2, r0, #255                @ r2<- BB
5108    GET_VREG(r1, r3)                    @ r1<- vCC
5109    GET_VREG(r0, r2)                    @ r0<- vBB
5110    .if 0
5111    cmp     r1, #0                      @ is second operand zero?
5112    beq     common_errDivideByZero
5113    .endif
5114
5115    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5116                               @ optional op; may set condition codes
5117    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
5118    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5119    SET_VREG(r0, r9)               @ vAA<- r0
5120    GOTO_OPCODE(ip)                     @ jump to next instruction
5121    /* 11-14 instructions */
5122
5123
5124/* ------------------------------ */
5125    .balign 64
5126.L_OP_REM_FLOAT: /* 0xaa */
5127/* File: armv5te/OP_REM_FLOAT.S */
5128/* EABI doesn't define a float remainder function, but libm does */
5129/* File: armv5te/binop.S */
5130    /*
5131     * Generic 32-bit binary operation.  Provide an "instr" line that
5132     * specifies an instruction that performs "result = r0 op r1".
5133     * This could be an ARM instruction or a function call.  (If the result
5134     * comes back in a register other than r0, you can override "result".)
5135     *
5136     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5137     * vCC (r1).  Useful for integer division and modulus.  Note that we
5138     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5139     * handles it correctly.
5140     *
5141     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5142     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5143     *      mul-float, div-float, rem-float
5144     */
5145    /* binop vAA, vBB, vCC */
5146    FETCH(r0, 1)                        @ r0<- CCBB
5147    mov     r9, rINST, lsr #8           @ r9<- AA
5148    mov     r3, r0, lsr #8              @ r3<- CC
5149    and     r2, r0, #255                @ r2<- BB
5150    GET_VREG(r1, r3)                    @ r1<- vCC
5151    GET_VREG(r0, r2)                    @ r0<- vBB
5152    .if 0
5153    cmp     r1, #0                      @ is second operand zero?
5154    beq     common_errDivideByZero
5155    .endif
5156
5157    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5158                               @ optional op; may set condition codes
5159    bl      fmodf                              @ r0<- op, r0-r3 changed
5160    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5161    SET_VREG(r0, r9)               @ vAA<- r0
5162    GOTO_OPCODE(ip)                     @ jump to next instruction
5163    /* 11-14 instructions */
5164
5165
5166/* ------------------------------ */
5167    .balign 64
5168.L_OP_ADD_DOUBLE: /* 0xab */
5169/* File: armv5te/OP_ADD_DOUBLE.S */
5170/* File: armv5te/binopWide.S */
5171    /*
5172     * Generic 64-bit binary operation.  Provide an "instr" line that
5173     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5174     * This could be an ARM instruction or a function call.  (If the result
5175     * comes back in a register other than r0, you can override "result".)
5176     *
5177     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5178     * vCC (r1).  Useful for integer division and modulus.
5179     *
5180     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5181     *      xor-long, add-double, sub-double, mul-double, div-double,
5182     *      rem-double
5183     *
5184     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5185     */
5186    /* binop vAA, vBB, vCC */
5187    FETCH(r0, 1)                        @ r0<- CCBB
5188    mov     r9, rINST, lsr #8           @ r9<- AA
5189    and     r2, r0, #255                @ r2<- BB
5190    mov     r3, r0, lsr #8              @ r3<- CC
5191    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5192    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5193    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5194    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5195    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5196    .if 0
5197    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5198    beq     common_errDivideByZero
5199    .endif
5200    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5201
5202                               @ optional op; may set condition codes
5203    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
5204    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5205    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5206    GOTO_OPCODE(ip)                     @ jump to next instruction
5207    /* 14-17 instructions */
5208
5209
5210/* ------------------------------ */
5211    .balign 64
5212.L_OP_SUB_DOUBLE: /* 0xac */
5213/* File: armv5te/OP_SUB_DOUBLE.S */
5214/* File: armv5te/binopWide.S */
5215    /*
5216     * Generic 64-bit binary operation.  Provide an "instr" line that
5217     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5218     * This could be an ARM instruction or a function call.  (If the result
5219     * comes back in a register other than r0, you can override "result".)
5220     *
5221     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5222     * vCC (r1).  Useful for integer division and modulus.
5223     *
5224     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5225     *      xor-long, add-double, sub-double, mul-double, div-double,
5226     *      rem-double
5227     *
5228     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5229     */
5230    /* binop vAA, vBB, vCC */
5231    FETCH(r0, 1)                        @ r0<- CCBB
5232    mov     r9, rINST, lsr #8           @ r9<- AA
5233    and     r2, r0, #255                @ r2<- BB
5234    mov     r3, r0, lsr #8              @ r3<- CC
5235    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5236    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5237    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5238    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5239    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5240    .if 0
5241    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5242    beq     common_errDivideByZero
5243    .endif
5244    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5245
5246                               @ optional op; may set condition codes
5247    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
5248    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5249    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5250    GOTO_OPCODE(ip)                     @ jump to next instruction
5251    /* 14-17 instructions */
5252
5253
5254/* ------------------------------ */
5255    .balign 64
5256.L_OP_MUL_DOUBLE: /* 0xad */
5257/* File: armv5te/OP_MUL_DOUBLE.S */
5258/* File: armv5te/binopWide.S */
5259    /*
5260     * Generic 64-bit binary operation.  Provide an "instr" line that
5261     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5262     * This could be an ARM instruction or a function call.  (If the result
5263     * comes back in a register other than r0, you can override "result".)
5264     *
5265     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5266     * vCC (r1).  Useful for integer division and modulus.
5267     *
5268     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5269     *      xor-long, add-double, sub-double, mul-double, div-double,
5270     *      rem-double
5271     *
5272     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5273     */
5274    /* binop vAA, vBB, vCC */
5275    FETCH(r0, 1)                        @ r0<- CCBB
5276    mov     r9, rINST, lsr #8           @ r9<- AA
5277    and     r2, r0, #255                @ r2<- BB
5278    mov     r3, r0, lsr #8              @ r3<- CC
5279    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5280    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5281    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5282    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5283    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5284    .if 0
5285    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5286    beq     common_errDivideByZero
5287    .endif
5288    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5289
5290                               @ optional op; may set condition codes
5291    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
5292    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5293    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5294    GOTO_OPCODE(ip)                     @ jump to next instruction
5295    /* 14-17 instructions */
5296
5297
5298/* ------------------------------ */
5299    .balign 64
5300.L_OP_DIV_DOUBLE: /* 0xae */
5301/* File: armv5te/OP_DIV_DOUBLE.S */
5302/* File: armv5te/binopWide.S */
5303    /*
5304     * Generic 64-bit binary operation.  Provide an "instr" line that
5305     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5306     * This could be an ARM instruction or a function call.  (If the result
5307     * comes back in a register other than r0, you can override "result".)
5308     *
5309     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5310     * vCC (r1).  Useful for integer division and modulus.
5311     *
5312     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5313     *      xor-long, add-double, sub-double, mul-double, div-double,
5314     *      rem-double
5315     *
5316     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5317     */
5318    /* binop vAA, vBB, vCC */
5319    FETCH(r0, 1)                        @ r0<- CCBB
5320    mov     r9, rINST, lsr #8           @ r9<- AA
5321    and     r2, r0, #255                @ r2<- BB
5322    mov     r3, r0, lsr #8              @ r3<- CC
5323    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5324    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5325    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5326    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5327    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5328    .if 0
5329    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5330    beq     common_errDivideByZero
5331    .endif
5332    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5333
5334                               @ optional op; may set condition codes
5335    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
5336    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5337    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5338    GOTO_OPCODE(ip)                     @ jump to next instruction
5339    /* 14-17 instructions */
5340
5341
5342/* ------------------------------ */
5343    .balign 64
5344.L_OP_REM_DOUBLE: /* 0xaf */
5345/* File: armv5te/OP_REM_DOUBLE.S */
5346/* EABI doesn't define a double remainder function, but libm does */
5347/* File: armv5te/binopWide.S */
5348    /*
5349     * Generic 64-bit binary operation.  Provide an "instr" line that
5350     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5351     * This could be an ARM instruction or a function call.  (If the result
5352     * comes back in a register other than r0, you can override "result".)
5353     *
5354     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5355     * vCC (r1).  Useful for integer division and modulus.
5356     *
5357     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5358     *      xor-long, add-double, sub-double, mul-double, div-double,
5359     *      rem-double
5360     *
5361     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5362     */
5363    /* binop vAA, vBB, vCC */
5364    FETCH(r0, 1)                        @ r0<- CCBB
5365    mov     r9, rINST, lsr #8           @ r9<- AA
5366    and     r2, r0, #255                @ r2<- BB
5367    mov     r3, r0, lsr #8              @ r3<- CC
5368    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5369    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5370    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5371    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5372    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5373    .if 0
5374    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5375    beq     common_errDivideByZero
5376    .endif
5377    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5378
5379                               @ optional op; may set condition codes
5380    bl      fmod                              @ result<- op, r0-r3 changed
5381    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5382    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5383    GOTO_OPCODE(ip)                     @ jump to next instruction
5384    /* 14-17 instructions */
5385
5386
5387/* ------------------------------ */
5388    .balign 64
5389.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5390/* File: armv5te/OP_ADD_INT_2ADDR.S */
5391/* File: armv5te/binop2addr.S */
5392    /*
5393     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5394     * that specifies an instruction that performs "result = r0 op r1".
5395     * This could be an ARM instruction or a function call.  (If the result
5396     * comes back in a register other than r0, you can override "result".)
5397     *
5398     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5399     * vCC (r1).  Useful for integer division and modulus.
5400     *
5401     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5402     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5403     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5404     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5405     */
5406    /* binop/2addr vA, vB */
5407    mov     r9, rINST, lsr #8           @ r9<- A+
5408    mov     r3, rINST, lsr #12          @ r3<- B
5409    and     r9, r9, #15
5410    GET_VREG(r1, r3)                    @ r1<- vB
5411    GET_VREG(r0, r9)                    @ r0<- vA
5412    .if 0
5413    cmp     r1, #0                      @ is second operand zero?
5414    beq     common_errDivideByZero
5415    .endif
5416    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5417
5418                               @ optional op; may set condition codes
5419    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5420    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5421    SET_VREG(r0, r9)               @ vAA<- r0
5422    GOTO_OPCODE(ip)                     @ jump to next instruction
5423    /* 10-13 instructions */
5424
5425
5426/* ------------------------------ */
5427    .balign 64
5428.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5429/* File: armv5te/OP_SUB_INT_2ADDR.S */
5430/* File: armv5te/binop2addr.S */
5431    /*
5432     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5433     * that specifies an instruction that performs "result = r0 op r1".
5434     * This could be an ARM instruction or a function call.  (If the result
5435     * comes back in a register other than r0, you can override "result".)
5436     *
5437     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5438     * vCC (r1).  Useful for integer division and modulus.
5439     *
5440     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5441     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5442     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5443     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5444     */
5445    /* binop/2addr vA, vB */
5446    mov     r9, rINST, lsr #8           @ r9<- A+
5447    mov     r3, rINST, lsr #12          @ r3<- B
5448    and     r9, r9, #15
5449    GET_VREG(r1, r3)                    @ r1<- vB
5450    GET_VREG(r0, r9)                    @ r0<- vA
5451    .if 0
5452    cmp     r1, #0                      @ is second operand zero?
5453    beq     common_errDivideByZero
5454    .endif
5455    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5456
5457                               @ optional op; may set condition codes
5458    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5459    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5460    SET_VREG(r0, r9)               @ vAA<- r0
5461    GOTO_OPCODE(ip)                     @ jump to next instruction
5462    /* 10-13 instructions */
5463
5464
5465/* ------------------------------ */
5466    .balign 64
5467.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5468/* File: armv5te/OP_MUL_INT_2ADDR.S */
5469/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5470/* File: armv5te/binop2addr.S */
5471    /*
5472     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5473     * that specifies an instruction that performs "result = r0 op r1".
5474     * This could be an ARM instruction or a function call.  (If the result
5475     * comes back in a register other than r0, you can override "result".)
5476     *
5477     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5478     * vCC (r1).  Useful for integer division and modulus.
5479     *
5480     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5481     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5482     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5483     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5484     */
5485    /* binop/2addr vA, vB */
5486    mov     r9, rINST, lsr #8           @ r9<- A+
5487    mov     r3, rINST, lsr #12          @ r3<- B
5488    and     r9, r9, #15
5489    GET_VREG(r1, r3)                    @ r1<- vB
5490    GET_VREG(r0, r9)                    @ r0<- vA
5491    .if 0
5492    cmp     r1, #0                      @ is second operand zero?
5493    beq     common_errDivideByZero
5494    .endif
5495    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5496
5497                               @ optional op; may set condition codes
5498    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5499    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5500    SET_VREG(r0, r9)               @ vAA<- r0
5501    GOTO_OPCODE(ip)                     @ jump to next instruction
5502    /* 10-13 instructions */
5503
5504
5505/* ------------------------------ */
5506    .balign 64
5507.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5508/* File: armv5te/OP_DIV_INT_2ADDR.S */
5509/* File: armv5te/binop2addr.S */
5510    /*
5511     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5512     * that specifies an instruction that performs "result = r0 op r1".
5513     * This could be an ARM instruction or a function call.  (If the result
5514     * comes back in a register other than r0, you can override "result".)
5515     *
5516     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5517     * vCC (r1).  Useful for integer division and modulus.
5518     *
5519     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5520     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5521     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5522     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5523     */
5524    /* binop/2addr vA, vB */
5525    mov     r9, rINST, lsr #8           @ r9<- A+
5526    mov     r3, rINST, lsr #12          @ r3<- B
5527    and     r9, r9, #15
5528    GET_VREG(r1, r3)                    @ r1<- vB
5529    GET_VREG(r0, r9)                    @ r0<- vA
5530    .if 1
5531    cmp     r1, #0                      @ is second operand zero?
5532    beq     common_errDivideByZero
5533    .endif
5534    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5535
5536                               @ optional op; may set condition codes
5537    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5538    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5539    SET_VREG(r0, r9)               @ vAA<- r0
5540    GOTO_OPCODE(ip)                     @ jump to next instruction
5541    /* 10-13 instructions */
5542
5543
5544/* ------------------------------ */
5545    .balign 64
5546.L_OP_REM_INT_2ADDR: /* 0xb4 */
5547/* File: armv5te/OP_REM_INT_2ADDR.S */
5548/* idivmod returns quotient in r0 and remainder in r1 */
5549/* File: armv5te/binop2addr.S */
5550    /*
5551     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5552     * that specifies an instruction that performs "result = r0 op r1".
5553     * This could be an ARM instruction or a function call.  (If the result
5554     * comes back in a register other than r0, you can override "result".)
5555     *
5556     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5557     * vCC (r1).  Useful for integer division and modulus.
5558     *
5559     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5560     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5561     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5562     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5563     */
5564    /* binop/2addr vA, vB */
5565    mov     r9, rINST, lsr #8           @ r9<- A+
5566    mov     r3, rINST, lsr #12          @ r3<- B
5567    and     r9, r9, #15
5568    GET_VREG(r1, r3)                    @ r1<- vB
5569    GET_VREG(r0, r9)                    @ r0<- vA
5570    .if 1
5571    cmp     r1, #0                      @ is second operand zero?
5572    beq     common_errDivideByZero
5573    .endif
5574    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5575
5576                               @ optional op; may set condition codes
5577    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5578    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5579    SET_VREG(r1, r9)               @ vAA<- r1
5580    GOTO_OPCODE(ip)                     @ jump to next instruction
5581    /* 10-13 instructions */
5582
5583
5584/* ------------------------------ */
5585    .balign 64
5586.L_OP_AND_INT_2ADDR: /* 0xb5 */
5587/* File: armv5te/OP_AND_INT_2ADDR.S */
5588/* File: armv5te/binop2addr.S */
5589    /*
5590     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5591     * that specifies an instruction that performs "result = r0 op r1".
5592     * This could be an ARM instruction or a function call.  (If the result
5593     * comes back in a register other than r0, you can override "result".)
5594     *
5595     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5596     * vCC (r1).  Useful for integer division and modulus.
5597     *
5598     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5599     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5600     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5601     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5602     */
5603    /* binop/2addr vA, vB */
5604    mov     r9, rINST, lsr #8           @ r9<- A+
5605    mov     r3, rINST, lsr #12          @ r3<- B
5606    and     r9, r9, #15
5607    GET_VREG(r1, r3)                    @ r1<- vB
5608    GET_VREG(r0, r9)                    @ r0<- vA
5609    .if 0
5610    cmp     r1, #0                      @ is second operand zero?
5611    beq     common_errDivideByZero
5612    .endif
5613    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5614
5615                               @ optional op; may set condition codes
5616    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5617    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5618    SET_VREG(r0, r9)               @ vAA<- r0
5619    GOTO_OPCODE(ip)                     @ jump to next instruction
5620    /* 10-13 instructions */
5621
5622
5623/* ------------------------------ */
5624    .balign 64
5625.L_OP_OR_INT_2ADDR: /* 0xb6 */
5626/* File: armv5te/OP_OR_INT_2ADDR.S */
5627/* File: armv5te/binop2addr.S */
5628    /*
5629     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5630     * that specifies an instruction that performs "result = r0 op r1".
5631     * This could be an ARM instruction or a function call.  (If the result
5632     * comes back in a register other than r0, you can override "result".)
5633     *
5634     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5635     * vCC (r1).  Useful for integer division and modulus.
5636     *
5637     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5638     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5639     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5640     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5641     */
5642    /* binop/2addr vA, vB */
5643    mov     r9, rINST, lsr #8           @ r9<- A+
5644    mov     r3, rINST, lsr #12          @ r3<- B
5645    and     r9, r9, #15
5646    GET_VREG(r1, r3)                    @ r1<- vB
5647    GET_VREG(r0, r9)                    @ r0<- vA
5648    .if 0
5649    cmp     r1, #0                      @ is second operand zero?
5650    beq     common_errDivideByZero
5651    .endif
5652    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5653
5654                               @ optional op; may set condition codes
5655    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5656    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5657    SET_VREG(r0, r9)               @ vAA<- r0
5658    GOTO_OPCODE(ip)                     @ jump to next instruction
5659    /* 10-13 instructions */
5660
5661
5662/* ------------------------------ */
5663    .balign 64
5664.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5665/* File: armv5te/OP_XOR_INT_2ADDR.S */
5666/* File: armv5te/binop2addr.S */
5667    /*
5668     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5669     * that specifies an instruction that performs "result = r0 op r1".
5670     * This could be an ARM instruction or a function call.  (If the result
5671     * comes back in a register other than r0, you can override "result".)
5672     *
5673     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5674     * vCC (r1).  Useful for integer division and modulus.
5675     *
5676     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5677     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5678     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5679     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5680     */
5681    /* binop/2addr vA, vB */
5682    mov     r9, rINST, lsr #8           @ r9<- A+
5683    mov     r3, rINST, lsr #12          @ r3<- B
5684    and     r9, r9, #15
5685    GET_VREG(r1, r3)                    @ r1<- vB
5686    GET_VREG(r0, r9)                    @ r0<- vA
5687    .if 0
5688    cmp     r1, #0                      @ is second operand zero?
5689    beq     common_errDivideByZero
5690    .endif
5691    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5692
5693                               @ optional op; may set condition codes
5694    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5695    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5696    SET_VREG(r0, r9)               @ vAA<- r0
5697    GOTO_OPCODE(ip)                     @ jump to next instruction
5698    /* 10-13 instructions */
5699
5700
5701/* ------------------------------ */
5702    .balign 64
5703.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5704/* File: armv5te/OP_SHL_INT_2ADDR.S */
5705/* File: armv5te/binop2addr.S */
5706    /*
5707     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5708     * that specifies an instruction that performs "result = r0 op r1".
5709     * This could be an ARM instruction or a function call.  (If the result
5710     * comes back in a register other than r0, you can override "result".)
5711     *
5712     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5713     * vCC (r1).  Useful for integer division and modulus.
5714     *
5715     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5716     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5717     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5718     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5719     */
5720    /* binop/2addr vA, vB */
5721    mov     r9, rINST, lsr #8           @ r9<- A+
5722    mov     r3, rINST, lsr #12          @ r3<- B
5723    and     r9, r9, #15
5724    GET_VREG(r1, r3)                    @ r1<- vB
5725    GET_VREG(r0, r9)                    @ r0<- vA
5726    .if 0
5727    cmp     r1, #0                      @ is second operand zero?
5728    beq     common_errDivideByZero
5729    .endif
5730    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5731
5732    and     r1, r1, #31                           @ optional op; may set condition codes
5733    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5734    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5735    SET_VREG(r0, r9)               @ vAA<- r0
5736    GOTO_OPCODE(ip)                     @ jump to next instruction
5737    /* 10-13 instructions */
5738
5739
5740/* ------------------------------ */
5741    .balign 64
5742.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5743/* File: armv5te/OP_SHR_INT_2ADDR.S */
5744/* File: armv5te/binop2addr.S */
5745    /*
5746     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5747     * that specifies an instruction that performs "result = r0 op r1".
5748     * This could be an ARM instruction or a function call.  (If the result
5749     * comes back in a register other than r0, you can override "result".)
5750     *
5751     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5752     * vCC (r1).  Useful for integer division and modulus.
5753     *
5754     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5755     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5756     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5757     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5758     */
5759    /* binop/2addr vA, vB */
5760    mov     r9, rINST, lsr #8           @ r9<- A+
5761    mov     r3, rINST, lsr #12          @ r3<- B
5762    and     r9, r9, #15
5763    GET_VREG(r1, r3)                    @ r1<- vB
5764    GET_VREG(r0, r9)                    @ r0<- vA
5765    .if 0
5766    cmp     r1, #0                      @ is second operand zero?
5767    beq     common_errDivideByZero
5768    .endif
5769    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5770
5771    and     r1, r1, #31                           @ optional op; may set condition codes
5772    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5773    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5774    SET_VREG(r0, r9)               @ vAA<- r0
5775    GOTO_OPCODE(ip)                     @ jump to next instruction
5776    /* 10-13 instructions */
5777
5778
5779/* ------------------------------ */
5780    .balign 64
5781.L_OP_USHR_INT_2ADDR: /* 0xba */
5782/* File: armv5te/OP_USHR_INT_2ADDR.S */
5783/* File: armv5te/binop2addr.S */
5784    /*
5785     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5786     * that specifies an instruction that performs "result = r0 op r1".
5787     * This could be an ARM instruction or a function call.  (If the result
5788     * comes back in a register other than r0, you can override "result".)
5789     *
5790     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5791     * vCC (r1).  Useful for integer division and modulus.
5792     *
5793     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5794     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5795     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5796     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5797     */
5798    /* binop/2addr vA, vB */
5799    mov     r9, rINST, lsr #8           @ r9<- A+
5800    mov     r3, rINST, lsr #12          @ r3<- B
5801    and     r9, r9, #15
5802    GET_VREG(r1, r3)                    @ r1<- vB
5803    GET_VREG(r0, r9)                    @ r0<- vA
5804    .if 0
5805    cmp     r1, #0                      @ is second operand zero?
5806    beq     common_errDivideByZero
5807    .endif
5808    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5809
5810    and     r1, r1, #31                           @ optional op; may set condition codes
5811    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5812    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5813    SET_VREG(r0, r9)               @ vAA<- r0
5814    GOTO_OPCODE(ip)                     @ jump to next instruction
5815    /* 10-13 instructions */
5816
5817
5818/* ------------------------------ */
5819    .balign 64
5820.L_OP_ADD_LONG_2ADDR: /* 0xbb */
5821/* File: armv5te/OP_ADD_LONG_2ADDR.S */
5822/* File: armv5te/binopWide2addr.S */
5823    /*
5824     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5825     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5826     * This could be an ARM instruction or a function call.  (If the result
5827     * comes back in a register other than r0, you can override "result".)
5828     *
5829     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5830     * vCC (r1).  Useful for integer division and modulus.
5831     *
5832     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5833     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5834     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5835     *      rem-double/2addr
5836     */
5837    /* binop/2addr vA, vB */
5838    mov     r9, rINST, lsr #8           @ r9<- A+
5839    mov     r1, rINST, lsr #12          @ r1<- B
5840    and     r9, r9, #15
5841    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5842    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5843    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5844    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5845    .if 0
5846    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5847    beq     common_errDivideByZero
5848    .endif
5849    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5850
5851    adds    r0, r0, r2                           @ optional op; may set condition codes
5852    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5853    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5854    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5855    GOTO_OPCODE(ip)                     @ jump to next instruction
5856    /* 12-15 instructions */
5857
5858
5859/* ------------------------------ */
5860    .balign 64
5861.L_OP_SUB_LONG_2ADDR: /* 0xbc */
5862/* File: armv5te/OP_SUB_LONG_2ADDR.S */
5863/* File: armv5te/binopWide2addr.S */
5864    /*
5865     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5866     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5867     * This could be an ARM instruction or a function call.  (If the result
5868     * comes back in a register other than r0, you can override "result".)
5869     *
5870     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5871     * vCC (r1).  Useful for integer division and modulus.
5872     *
5873     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5874     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5875     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5876     *      rem-double/2addr
5877     */
5878    /* binop/2addr vA, vB */
5879    mov     r9, rINST, lsr #8           @ r9<- A+
5880    mov     r1, rINST, lsr #12          @ r1<- B
5881    and     r9, r9, #15
5882    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5883    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5884    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5885    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5886    .if 0
5887    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5888    beq     common_errDivideByZero
5889    .endif
5890    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5891
5892    subs    r0, r0, r2                           @ optional op; may set condition codes
5893    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5894    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5895    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5896    GOTO_OPCODE(ip)                     @ jump to next instruction
5897    /* 12-15 instructions */
5898
5899
5900/* ------------------------------ */
5901    .balign 64
5902.L_OP_MUL_LONG_2ADDR: /* 0xbd */
5903/* File: armv5te/OP_MUL_LONG_2ADDR.S */
5904    /*
5905     * Signed 64-bit integer multiply, "/2addr" version.
5906     *
5907     * See OP_MUL_LONG for an explanation.
5908     *
5909     * We get a little tight on registers, so to avoid looking up &fp[A]
5910     * again we stuff it into rINST.
5911     */
5912    /* mul-long/2addr vA, vB */
5913    mov     r9, rINST, lsr #8           @ r9<- A+
5914    mov     r1, rINST, lsr #12          @ r1<- B
5915    and     r9, r9, #15
5916    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5917    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
5918    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5919    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
5920    mul     ip, r2, r1                  @  ip<- ZxW
5921    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
5922    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
5923    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
5924    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5925    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
5926    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5927    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
5928    GOTO_OPCODE(ip)                     @ jump to next instruction
5929
5930/* ------------------------------ */
5931    .balign 64
5932.L_OP_DIV_LONG_2ADDR: /* 0xbe */
5933/* File: armv5te/OP_DIV_LONG_2ADDR.S */
5934/* File: armv5te/binopWide2addr.S */
5935    /*
5936     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5937     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5938     * This could be an ARM instruction or a function call.  (If the result
5939     * comes back in a register other than r0, you can override "result".)
5940     *
5941     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5942     * vCC (r1).  Useful for integer division and modulus.
5943     *
5944     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5945     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5946     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5947     *      rem-double/2addr
5948     */
5949    /* binop/2addr vA, vB */
5950    mov     r9, rINST, lsr #8           @ r9<- A+
5951    mov     r1, rINST, lsr #12          @ r1<- B
5952    and     r9, r9, #15
5953    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5954    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5955    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5956    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5957    .if 1
5958    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5959    beq     common_errDivideByZero
5960    .endif
5961    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5962
5963                               @ optional op; may set condition codes
5964    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5965    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5966    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5967    GOTO_OPCODE(ip)                     @ jump to next instruction
5968    /* 12-15 instructions */
5969
5970
5971/* ------------------------------ */
5972    .balign 64
5973.L_OP_REM_LONG_2ADDR: /* 0xbf */
5974/* File: armv5te/OP_REM_LONG_2ADDR.S */
5975/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5976/* File: armv5te/binopWide2addr.S */
5977    /*
5978     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5979     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5980     * This could be an ARM instruction or a function call.  (If the result
5981     * comes back in a register other than r0, you can override "result".)
5982     *
5983     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5984     * vCC (r1).  Useful for integer division and modulus.
5985     *
5986     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5987     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5988     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5989     *      rem-double/2addr
5990     */
5991    /* binop/2addr vA, vB */
5992    mov     r9, rINST, lsr #8           @ r9<- A+
5993    mov     r1, rINST, lsr #12          @ r1<- B
5994    and     r9, r9, #15
5995    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5996    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5997    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5998    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5999    .if 1
6000    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6001    beq     common_errDivideByZero
6002    .endif
6003    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6004
6005                               @ optional op; may set condition codes
6006    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
6007    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6008    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
6009    GOTO_OPCODE(ip)                     @ jump to next instruction
6010    /* 12-15 instructions */
6011
6012
6013/* ------------------------------ */
6014    .balign 64
6015.L_OP_AND_LONG_2ADDR: /* 0xc0 */
6016/* File: armv5te/OP_AND_LONG_2ADDR.S */
6017/* File: armv5te/binopWide2addr.S */
6018    /*
6019     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6020     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6021     * This could be an ARM instruction or a function call.  (If the result
6022     * comes back in a register other than r0, you can override "result".)
6023     *
6024     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6025     * vCC (r1).  Useful for integer division and modulus.
6026     *
6027     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6028     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6029     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6030     *      rem-double/2addr
6031     */
6032    /* binop/2addr vA, vB */
6033    mov     r9, rINST, lsr #8           @ r9<- A+
6034    mov     r1, rINST, lsr #12          @ r1<- B
6035    and     r9, r9, #15
6036    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6037    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6038    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6039    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6040    .if 0
6041    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6042    beq     common_errDivideByZero
6043    .endif
6044    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6045
6046    and     r0, r0, r2                           @ optional op; may set condition codes
6047    and     r1, r1, r3                              @ result<- op, r0-r3 changed
6048    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6049    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6050    GOTO_OPCODE(ip)                     @ jump to next instruction
6051    /* 12-15 instructions */
6052
6053
6054/* ------------------------------ */
6055    .balign 64
6056.L_OP_OR_LONG_2ADDR: /* 0xc1 */
6057/* File: armv5te/OP_OR_LONG_2ADDR.S */
6058/* File: armv5te/binopWide2addr.S */
6059    /*
6060     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6061     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6062     * This could be an ARM instruction or a function call.  (If the result
6063     * comes back in a register other than r0, you can override "result".)
6064     *
6065     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6066     * vCC (r1).  Useful for integer division and modulus.
6067     *
6068     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6069     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6070     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6071     *      rem-double/2addr
6072     */
6073    /* binop/2addr vA, vB */
6074    mov     r9, rINST, lsr #8           @ r9<- A+
6075    mov     r1, rINST, lsr #12          @ r1<- B
6076    and     r9, r9, #15
6077    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6078    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6079    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6080    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6081    .if 0
6082    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6083    beq     common_errDivideByZero
6084    .endif
6085    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6086
6087    orr     r0, r0, r2                           @ optional op; may set condition codes
6088    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
6089    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6090    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6091    GOTO_OPCODE(ip)                     @ jump to next instruction
6092    /* 12-15 instructions */
6093
6094
6095/* ------------------------------ */
6096    .balign 64
6097.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
6098/* File: armv5te/OP_XOR_LONG_2ADDR.S */
6099/* File: armv5te/binopWide2addr.S */
6100    /*
6101     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6102     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6103     * This could be an ARM instruction or a function call.  (If the result
6104     * comes back in a register other than r0, you can override "result".)
6105     *
6106     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6107     * vCC (r1).  Useful for integer division and modulus.
6108     *
6109     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6110     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6111     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6112     *      rem-double/2addr
6113     */
6114    /* binop/2addr vA, vB */
6115    mov     r9, rINST, lsr #8           @ r9<- A+
6116    mov     r1, rINST, lsr #12          @ r1<- B
6117    and     r9, r9, #15
6118    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6119    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6120    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6121    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6122    .if 0
6123    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6124    beq     common_errDivideByZero
6125    .endif
6126    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6127
6128    eor     r0, r0, r2                           @ optional op; may set condition codes
6129    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
6130    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6131    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6132    GOTO_OPCODE(ip)                     @ jump to next instruction
6133    /* 12-15 instructions */
6134
6135
6136/* ------------------------------ */
6137    .balign 64
6138.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
6139/* File: armv5te/OP_SHL_LONG_2ADDR.S */
6140    /*
6141     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6142     * 32-bit shift distance.
6143     */
6144    /* shl-long/2addr vA, vB */
6145    mov     r9, rINST, lsr #8           @ r9<- A+
6146    mov     r3, rINST, lsr #12          @ r3<- B
6147    and     r9, r9, #15
6148    GET_VREG(r2, r3)                    @ r2<- vB
6149    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6150    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6151    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6152
6153    mov     r1, r1, asl r2              @  r1<- r1 << r2
6154    rsb     r3, r2, #32                 @  r3<- 32 - r2
6155    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
6156    subs    ip, r2, #32                 @  ip<- r2 - 32
6157    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6158    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
6159    mov     r0, r0, asl r2              @  r0<- r0 << r2
6160    b       .LOP_SHL_LONG_2ADDR_finish
6161
6162/* ------------------------------ */
6163    .balign 64
6164.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
6165/* File: armv5te/OP_SHR_LONG_2ADDR.S */
6166    /*
6167     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6168     * 32-bit shift distance.
6169     */
6170    /* shr-long/2addr vA, vB */
6171    mov     r9, rINST, lsr #8           @ r9<- A+
6172    mov     r3, rINST, lsr #12          @ r3<- B
6173    and     r9, r9, #15
6174    GET_VREG(r2, r3)                    @ r2<- vB
6175    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6176    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6177    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6178
6179    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6180    rsb     r3, r2, #32                 @  r3<- 32 - r2
6181    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6182    subs    ip, r2, #32                 @  ip<- r2 - 32
6183    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6184    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
6185    mov     r1, r1, asr r2              @  r1<- r1 >> r2
6186    b       .LOP_SHR_LONG_2ADDR_finish
6187
6188/* ------------------------------ */
6189    .balign 64
6190.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
6191/* File: armv5te/OP_USHR_LONG_2ADDR.S */
6192    /*
6193     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6194     * 32-bit shift distance.
6195     */
6196    /* ushr-long/2addr vA, vB */
6197    mov     r9, rINST, lsr #8           @ r9<- A+
6198    mov     r3, rINST, lsr #12          @ r3<- B
6199    and     r9, r9, #15
6200    GET_VREG(r2, r3)                    @ r2<- vB
6201    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6202    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6203    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6204
6205    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6206    rsb     r3, r2, #32                 @  r3<- 32 - r2
6207    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6208    subs    ip, r2, #32                 @  ip<- r2 - 32
6209    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6210    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
6211    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
6212    b       .LOP_USHR_LONG_2ADDR_finish
6213
6214/* ------------------------------ */
6215    .balign 64
6216.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
6217/* File: armv5te/OP_ADD_FLOAT_2ADDR.S */
6218/* File: armv5te/binop2addr.S */
6219    /*
6220     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6221     * that specifies an instruction that performs "result = r0 op r1".
6222     * This could be an ARM instruction or a function call.  (If the result
6223     * comes back in a register other than r0, you can override "result".)
6224     *
6225     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6226     * vCC (r1).  Useful for integer division and modulus.
6227     *
6228     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6229     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6230     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6231     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6232     */
6233    /* binop/2addr vA, vB */
6234    mov     r9, rINST, lsr #8           @ r9<- A+
6235    mov     r3, rINST, lsr #12          @ r3<- B
6236    and     r9, r9, #15
6237    GET_VREG(r1, r3)                    @ r1<- vB
6238    GET_VREG(r0, r9)                    @ r0<- vA
6239    .if 0
6240    cmp     r1, #0                      @ is second operand zero?
6241    beq     common_errDivideByZero
6242    .endif
6243    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6244
6245                               @ optional op; may set condition codes
6246    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
6247    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6248    SET_VREG(r0, r9)               @ vAA<- r0
6249    GOTO_OPCODE(ip)                     @ jump to next instruction
6250    /* 10-13 instructions */
6251
6252
6253/* ------------------------------ */
6254    .balign 64
6255.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6256/* File: armv5te/OP_SUB_FLOAT_2ADDR.S */
6257/* File: armv5te/binop2addr.S */
6258    /*
6259     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6260     * that specifies an instruction that performs "result = r0 op r1".
6261     * This could be an ARM instruction or a function call.  (If the result
6262     * comes back in a register other than r0, you can override "result".)
6263     *
6264     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6265     * vCC (r1).  Useful for integer division and modulus.
6266     *
6267     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6268     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6269     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6270     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6271     */
6272    /* binop/2addr vA, vB */
6273    mov     r9, rINST, lsr #8           @ r9<- A+
6274    mov     r3, rINST, lsr #12          @ r3<- B
6275    and     r9, r9, #15
6276    GET_VREG(r1, r3)                    @ r1<- vB
6277    GET_VREG(r0, r9)                    @ r0<- vA
6278    .if 0
6279    cmp     r1, #0                      @ is second operand zero?
6280    beq     common_errDivideByZero
6281    .endif
6282    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6283
6284                               @ optional op; may set condition codes
6285    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
6286    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6287    SET_VREG(r0, r9)               @ vAA<- r0
6288    GOTO_OPCODE(ip)                     @ jump to next instruction
6289    /* 10-13 instructions */
6290
6291
6292/* ------------------------------ */
6293    .balign 64
6294.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6295/* File: armv5te/OP_MUL_FLOAT_2ADDR.S */
6296/* File: armv5te/binop2addr.S */
6297    /*
6298     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6299     * that specifies an instruction that performs "result = r0 op r1".
6300     * This could be an ARM instruction or a function call.  (If the result
6301     * comes back in a register other than r0, you can override "result".)
6302     *
6303     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6304     * vCC (r1).  Useful for integer division and modulus.
6305     *
6306     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6307     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6308     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6309     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6310     */
6311    /* binop/2addr vA, vB */
6312    mov     r9, rINST, lsr #8           @ r9<- A+
6313    mov     r3, rINST, lsr #12          @ r3<- B
6314    and     r9, r9, #15
6315    GET_VREG(r1, r3)                    @ r1<- vB
6316    GET_VREG(r0, r9)                    @ r0<- vA
6317    .if 0
6318    cmp     r1, #0                      @ is second operand zero?
6319    beq     common_errDivideByZero
6320    .endif
6321    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6322
6323                               @ optional op; may set condition codes
6324    bl      __aeabi_fmul                              @ 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_DIV_FLOAT_2ADDR: /* 0xc9 */
6334/* File: armv5te/OP_DIV_FLOAT_2ADDR.S */
6335/* File: armv5te/binop2addr.S */
6336    /*
6337     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6338     * that specifies an instruction that performs "result = r0 op r1".
6339     * This could be an ARM instruction or a function call.  (If the result
6340     * comes back in a register other than r0, you can override "result".)
6341     *
6342     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6343     * vCC (r1).  Useful for integer division and modulus.
6344     *
6345     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6346     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6347     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6348     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6349     */
6350    /* binop/2addr vA, vB */
6351    mov     r9, rINST, lsr #8           @ r9<- A+
6352    mov     r3, rINST, lsr #12          @ r3<- B
6353    and     r9, r9, #15
6354    GET_VREG(r1, r3)                    @ r1<- vB
6355    GET_VREG(r0, r9)                    @ r0<- vA
6356    .if 0
6357    cmp     r1, #0                      @ is second operand zero?
6358    beq     common_errDivideByZero
6359    .endif
6360    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6361
6362                               @ optional op; may set condition codes
6363    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
6364    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6365    SET_VREG(r0, r9)               @ vAA<- r0
6366    GOTO_OPCODE(ip)                     @ jump to next instruction
6367    /* 10-13 instructions */
6368
6369
6370/* ------------------------------ */
6371    .balign 64
6372.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6373/* File: armv5te/OP_REM_FLOAT_2ADDR.S */
6374/* EABI doesn't define a float remainder function, but libm does */
6375/* File: armv5te/binop2addr.S */
6376    /*
6377     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6378     * that specifies an instruction that performs "result = r0 op r1".
6379     * This could be an ARM instruction or a function call.  (If the result
6380     * comes back in a register other than r0, you can override "result".)
6381     *
6382     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6383     * vCC (r1).  Useful for integer division and modulus.
6384     *
6385     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6386     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6387     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6388     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6389     */
6390    /* binop/2addr vA, vB */
6391    mov     r9, rINST, lsr #8           @ r9<- A+
6392    mov     r3, rINST, lsr #12          @ r3<- B
6393    and     r9, r9, #15
6394    GET_VREG(r1, r3)                    @ r1<- vB
6395    GET_VREG(r0, r9)                    @ r0<- vA
6396    .if 0
6397    cmp     r1, #0                      @ is second operand zero?
6398    beq     common_errDivideByZero
6399    .endif
6400    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6401
6402                               @ optional op; may set condition codes
6403    bl      fmodf                              @ r0<- op, r0-r3 changed
6404    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6405    SET_VREG(r0, r9)               @ vAA<- r0
6406    GOTO_OPCODE(ip)                     @ jump to next instruction
6407    /* 10-13 instructions */
6408
6409
6410/* ------------------------------ */
6411    .balign 64
6412.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6413/* File: armv5te/OP_ADD_DOUBLE_2ADDR.S */
6414/* File: armv5te/binopWide2addr.S */
6415    /*
6416     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6417     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6418     * This could be an ARM instruction or a function call.  (If the result
6419     * comes back in a register other than r0, you can override "result".)
6420     *
6421     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6422     * vCC (r1).  Useful for integer division and modulus.
6423     *
6424     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6425     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6426     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6427     *      rem-double/2addr
6428     */
6429    /* binop/2addr vA, vB */
6430    mov     r9, rINST, lsr #8           @ r9<- A+
6431    mov     r1, rINST, lsr #12          @ r1<- B
6432    and     r9, r9, #15
6433    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6434    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6435    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6436    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6437    .if 0
6438    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6439    beq     common_errDivideByZero
6440    .endif
6441    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6442
6443                               @ optional op; may set condition codes
6444    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
6445    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6446    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6447    GOTO_OPCODE(ip)                     @ jump to next instruction
6448    /* 12-15 instructions */
6449
6450
6451/* ------------------------------ */
6452    .balign 64
6453.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6454/* File: armv5te/OP_SUB_DOUBLE_2ADDR.S */
6455/* File: armv5te/binopWide2addr.S */
6456    /*
6457     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6458     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6459     * This could be an ARM instruction or a function call.  (If the result
6460     * comes back in a register other than r0, you can override "result".)
6461     *
6462     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6463     * vCC (r1).  Useful for integer division and modulus.
6464     *
6465     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6466     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6467     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6468     *      rem-double/2addr
6469     */
6470    /* binop/2addr vA, vB */
6471    mov     r9, rINST, lsr #8           @ r9<- A+
6472    mov     r1, rINST, lsr #12          @ r1<- B
6473    and     r9, r9, #15
6474    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6475    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6476    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6477    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6478    .if 0
6479    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6480    beq     common_errDivideByZero
6481    .endif
6482    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6483
6484                               @ optional op; may set condition codes
6485    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
6486    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6487    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6488    GOTO_OPCODE(ip)                     @ jump to next instruction
6489    /* 12-15 instructions */
6490
6491
6492/* ------------------------------ */
6493    .balign 64
6494.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6495/* File: armv5te/OP_MUL_DOUBLE_2ADDR.S */
6496/* File: armv5te/binopWide2addr.S */
6497    /*
6498     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6499     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6500     * This could be an ARM instruction or a function call.  (If the result
6501     * comes back in a register other than r0, you can override "result".)
6502     *
6503     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6504     * vCC (r1).  Useful for integer division and modulus.
6505     *
6506     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6507     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6508     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6509     *      rem-double/2addr
6510     */
6511    /* binop/2addr vA, vB */
6512    mov     r9, rINST, lsr #8           @ r9<- A+
6513    mov     r1, rINST, lsr #12          @ r1<- B
6514    and     r9, r9, #15
6515    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6516    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6517    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6518    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6519    .if 0
6520    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6521    beq     common_errDivideByZero
6522    .endif
6523    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6524
6525                               @ optional op; may set condition codes
6526    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
6527    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6528    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6529    GOTO_OPCODE(ip)                     @ jump to next instruction
6530    /* 12-15 instructions */
6531
6532
6533/* ------------------------------ */
6534    .balign 64
6535.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6536/* File: armv5te/OP_DIV_DOUBLE_2ADDR.S */
6537/* File: armv5te/binopWide2addr.S */
6538    /*
6539     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6540     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6541     * This could be an ARM instruction or a function call.  (If the result
6542     * comes back in a register other than r0, you can override "result".)
6543     *
6544     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6545     * vCC (r1).  Useful for integer division and modulus.
6546     *
6547     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6548     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6549     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6550     *      rem-double/2addr
6551     */
6552    /* binop/2addr vA, vB */
6553    mov     r9, rINST, lsr #8           @ r9<- A+
6554    mov     r1, rINST, lsr #12          @ r1<- B
6555    and     r9, r9, #15
6556    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6557    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6558    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6559    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6560    .if 0
6561    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6562    beq     common_errDivideByZero
6563    .endif
6564    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6565
6566                               @ optional op; may set condition codes
6567    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
6568    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6569    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6570    GOTO_OPCODE(ip)                     @ jump to next instruction
6571    /* 12-15 instructions */
6572
6573
6574/* ------------------------------ */
6575    .balign 64
6576.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6577/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */
6578/* EABI doesn't define a double remainder function, but libm does */
6579/* File: armv5te/binopWide2addr.S */
6580    /*
6581     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6582     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6583     * This could be an ARM instruction or a function call.  (If the result
6584     * comes back in a register other than r0, you can override "result".)
6585     *
6586     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6587     * vCC (r1).  Useful for integer division and modulus.
6588     *
6589     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6590     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6591     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6592     *      rem-double/2addr
6593     */
6594    /* binop/2addr vA, vB */
6595    mov     r9, rINST, lsr #8           @ r9<- A+
6596    mov     r1, rINST, lsr #12          @ r1<- B
6597    and     r9, r9, #15
6598    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6599    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6600    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6601    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6602    .if 0
6603    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6604    beq     common_errDivideByZero
6605    .endif
6606    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6607
6608                               @ optional op; may set condition codes
6609    bl      fmod                              @ result<- op, r0-r3 changed
6610    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6611    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6612    GOTO_OPCODE(ip)                     @ jump to next instruction
6613    /* 12-15 instructions */
6614
6615
6616/* ------------------------------ */
6617    .balign 64
6618.L_OP_ADD_INT_LIT16: /* 0xd0 */
6619/* File: armv5te/OP_ADD_INT_LIT16.S */
6620/* File: armv5te/binopLit16.S */
6621    /*
6622     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6623     * that specifies an instruction that performs "result = r0 op r1".
6624     * This could be an ARM instruction or a function call.  (If the result
6625     * comes back in a register other than r0, you can override "result".)
6626     *
6627     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6628     * vCC (r1).  Useful for integer division and modulus.
6629     *
6630     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6631     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6632     */
6633    /* binop/lit16 vA, vB, #+CCCC */
6634    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6635    mov     r2, rINST, lsr #12          @ r2<- B
6636    mov     r9, rINST, lsr #8           @ r9<- A+
6637    GET_VREG(r0, r2)                    @ r0<- vB
6638    and     r9, r9, #15
6639    .if 0
6640    cmp     r1, #0                      @ is second operand zero?
6641    beq     common_errDivideByZero
6642    .endif
6643    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6644
6645    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6646    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6647    SET_VREG(r0, r9)               @ vAA<- r0
6648    GOTO_OPCODE(ip)                     @ jump to next instruction
6649    /* 10-13 instructions */
6650
6651
6652/* ------------------------------ */
6653    .balign 64
6654.L_OP_RSUB_INT: /* 0xd1 */
6655/* File: armv5te/OP_RSUB_INT.S */
6656/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6657/* File: armv5te/binopLit16.S */
6658    /*
6659     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6660     * that specifies an instruction that performs "result = r0 op r1".
6661     * This could be an ARM instruction or a function call.  (If the result
6662     * comes back in a register other than r0, you can override "result".)
6663     *
6664     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6665     * vCC (r1).  Useful for integer division and modulus.
6666     *
6667     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6668     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6669     */
6670    /* binop/lit16 vA, vB, #+CCCC */
6671    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6672    mov     r2, rINST, lsr #12          @ r2<- B
6673    mov     r9, rINST, lsr #8           @ r9<- A+
6674    GET_VREG(r0, r2)                    @ r0<- vB
6675    and     r9, r9, #15
6676    .if 0
6677    cmp     r1, #0                      @ is second operand zero?
6678    beq     common_errDivideByZero
6679    .endif
6680    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6681
6682    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6683    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6684    SET_VREG(r0, r9)               @ vAA<- r0
6685    GOTO_OPCODE(ip)                     @ jump to next instruction
6686    /* 10-13 instructions */
6687
6688
6689/* ------------------------------ */
6690    .balign 64
6691.L_OP_MUL_INT_LIT16: /* 0xd2 */
6692/* File: armv5te/OP_MUL_INT_LIT16.S */
6693/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6694/* File: armv5te/binopLit16.S */
6695    /*
6696     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6697     * that specifies an instruction that performs "result = r0 op r1".
6698     * This could be an ARM instruction or a function call.  (If the result
6699     * comes back in a register other than r0, you can override "result".)
6700     *
6701     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6702     * vCC (r1).  Useful for integer division and modulus.
6703     *
6704     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6705     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6706     */
6707    /* binop/lit16 vA, vB, #+CCCC */
6708    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6709    mov     r2, rINST, lsr #12          @ r2<- B
6710    mov     r9, rINST, lsr #8           @ r9<- A+
6711    GET_VREG(r0, r2)                    @ r0<- vB
6712    and     r9, r9, #15
6713    .if 0
6714    cmp     r1, #0                      @ is second operand zero?
6715    beq     common_errDivideByZero
6716    .endif
6717    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6718
6719    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6720    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6721    SET_VREG(r0, r9)               @ vAA<- r0
6722    GOTO_OPCODE(ip)                     @ jump to next instruction
6723    /* 10-13 instructions */
6724
6725
6726/* ------------------------------ */
6727    .balign 64
6728.L_OP_DIV_INT_LIT16: /* 0xd3 */
6729/* File: armv5te/OP_DIV_INT_LIT16.S */
6730/* File: armv5te/binopLit16.S */
6731    /*
6732     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6733     * that specifies an instruction that performs "result = r0 op r1".
6734     * This could be an ARM instruction or a function call.  (If the result
6735     * comes back in a register other than r0, you can override "result".)
6736     *
6737     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6738     * vCC (r1).  Useful for integer division and modulus.
6739     *
6740     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6741     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6742     */
6743    /* binop/lit16 vA, vB, #+CCCC */
6744    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6745    mov     r2, rINST, lsr #12          @ r2<- B
6746    mov     r9, rINST, lsr #8           @ r9<- A+
6747    GET_VREG(r0, r2)                    @ r0<- vB
6748    and     r9, r9, #15
6749    .if 1
6750    cmp     r1, #0                      @ is second operand zero?
6751    beq     common_errDivideByZero
6752    .endif
6753    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6754
6755    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6756    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6757    SET_VREG(r0, r9)               @ vAA<- r0
6758    GOTO_OPCODE(ip)                     @ jump to next instruction
6759    /* 10-13 instructions */
6760
6761
6762/* ------------------------------ */
6763    .balign 64
6764.L_OP_REM_INT_LIT16: /* 0xd4 */
6765/* File: armv5te/OP_REM_INT_LIT16.S */
6766/* idivmod returns quotient in r0 and remainder in r1 */
6767/* File: armv5te/binopLit16.S */
6768    /*
6769     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6770     * that specifies an instruction that performs "result = r0 op r1".
6771     * This could be an ARM instruction or a function call.  (If the result
6772     * comes back in a register other than r0, you can override "result".)
6773     *
6774     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6775     * vCC (r1).  Useful for integer division and modulus.
6776     *
6777     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6778     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6779     */
6780    /* binop/lit16 vA, vB, #+CCCC */
6781    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6782    mov     r2, rINST, lsr #12          @ r2<- B
6783    mov     r9, rINST, lsr #8           @ r9<- A+
6784    GET_VREG(r0, r2)                    @ r0<- vB
6785    and     r9, r9, #15
6786    .if 1
6787    cmp     r1, #0                      @ is second operand zero?
6788    beq     common_errDivideByZero
6789    .endif
6790    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6791
6792    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6793    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6794    SET_VREG(r1, r9)               @ vAA<- r1
6795    GOTO_OPCODE(ip)                     @ jump to next instruction
6796    /* 10-13 instructions */
6797
6798
6799/* ------------------------------ */
6800    .balign 64
6801.L_OP_AND_INT_LIT16: /* 0xd5 */
6802/* File: armv5te/OP_AND_INT_LIT16.S */
6803/* File: armv5te/binopLit16.S */
6804    /*
6805     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6806     * that specifies an instruction that performs "result = r0 op r1".
6807     * This could be an ARM instruction or a function call.  (If the result
6808     * comes back in a register other than r0, you can override "result".)
6809     *
6810     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6811     * vCC (r1).  Useful for integer division and modulus.
6812     *
6813     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6814     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6815     */
6816    /* binop/lit16 vA, vB, #+CCCC */
6817    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6818    mov     r2, rINST, lsr #12          @ r2<- B
6819    mov     r9, rINST, lsr #8           @ r9<- A+
6820    GET_VREG(r0, r2)                    @ r0<- vB
6821    and     r9, r9, #15
6822    .if 0
6823    cmp     r1, #0                      @ is second operand zero?
6824    beq     common_errDivideByZero
6825    .endif
6826    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6827
6828    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6829    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6830    SET_VREG(r0, r9)               @ vAA<- r0
6831    GOTO_OPCODE(ip)                     @ jump to next instruction
6832    /* 10-13 instructions */
6833
6834
6835/* ------------------------------ */
6836    .balign 64
6837.L_OP_OR_INT_LIT16: /* 0xd6 */
6838/* File: armv5te/OP_OR_INT_LIT16.S */
6839/* File: armv5te/binopLit16.S */
6840    /*
6841     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6842     * that specifies an instruction that performs "result = r0 op r1".
6843     * This could be an ARM instruction or a function call.  (If the result
6844     * comes back in a register other than r0, you can override "result".)
6845     *
6846     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6847     * vCC (r1).  Useful for integer division and modulus.
6848     *
6849     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6850     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6851     */
6852    /* binop/lit16 vA, vB, #+CCCC */
6853    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6854    mov     r2, rINST, lsr #12          @ r2<- B
6855    mov     r9, rINST, lsr #8           @ r9<- A+
6856    GET_VREG(r0, r2)                    @ r0<- vB
6857    and     r9, r9, #15
6858    .if 0
6859    cmp     r1, #0                      @ is second operand zero?
6860    beq     common_errDivideByZero
6861    .endif
6862    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6863
6864    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6865    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6866    SET_VREG(r0, r9)               @ vAA<- r0
6867    GOTO_OPCODE(ip)                     @ jump to next instruction
6868    /* 10-13 instructions */
6869
6870
6871/* ------------------------------ */
6872    .balign 64
6873.L_OP_XOR_INT_LIT16: /* 0xd7 */
6874/* File: armv5te/OP_XOR_INT_LIT16.S */
6875/* File: armv5te/binopLit16.S */
6876    /*
6877     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6878     * that specifies an instruction that performs "result = r0 op r1".
6879     * This could be an ARM instruction or a function call.  (If the result
6880     * comes back in a register other than r0, you can override "result".)
6881     *
6882     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6883     * vCC (r1).  Useful for integer division and modulus.
6884     *
6885     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6886     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6887     */
6888    /* binop/lit16 vA, vB, #+CCCC */
6889    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6890    mov     r2, rINST, lsr #12          @ r2<- B
6891    mov     r9, rINST, lsr #8           @ r9<- A+
6892    GET_VREG(r0, r2)                    @ r0<- vB
6893    and     r9, r9, #15
6894    .if 0
6895    cmp     r1, #0                      @ is second operand zero?
6896    beq     common_errDivideByZero
6897    .endif
6898    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6899
6900    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6901    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6902    SET_VREG(r0, r9)               @ vAA<- r0
6903    GOTO_OPCODE(ip)                     @ jump to next instruction
6904    /* 10-13 instructions */
6905
6906
6907/* ------------------------------ */
6908    .balign 64
6909.L_OP_ADD_INT_LIT8: /* 0xd8 */
6910/* File: armv5te/OP_ADD_INT_LIT8.S */
6911/* File: armv5te/binopLit8.S */
6912    /*
6913     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6914     * that specifies an instruction that performs "result = r0 op r1".
6915     * This could be an ARM instruction or a function call.  (If the result
6916     * comes back in a register other than r0, you can override "result".)
6917     *
6918     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6919     * vCC (r1).  Useful for integer division and modulus.
6920     *
6921     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6922     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6923     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6924     */
6925    /* binop/lit8 vAA, vBB, #+CC */
6926    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6927    mov     r9, rINST, lsr #8           @ r9<- AA
6928    and     r2, r3, #255                @ r2<- BB
6929    GET_VREG(r0, r2)                    @ r0<- vBB
6930    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6931    .if 0
6932    @cmp     r1, #0                      @ is second operand zero?
6933    beq     common_errDivideByZero
6934    .endif
6935    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6936
6937                               @ optional op; may set condition codes
6938    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6939    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6940    SET_VREG(r0, r9)               @ vAA<- r0
6941    GOTO_OPCODE(ip)                     @ jump to next instruction
6942    /* 10-12 instructions */
6943
6944
6945/* ------------------------------ */
6946    .balign 64
6947.L_OP_RSUB_INT_LIT8: /* 0xd9 */
6948/* File: armv5te/OP_RSUB_INT_LIT8.S */
6949/* File: armv5te/binopLit8.S */
6950    /*
6951     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6952     * that specifies an instruction that performs "result = r0 op r1".
6953     * This could be an ARM instruction or a function call.  (If the result
6954     * comes back in a register other than r0, you can override "result".)
6955     *
6956     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6957     * vCC (r1).  Useful for integer division and modulus.
6958     *
6959     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6960     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6961     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6962     */
6963    /* binop/lit8 vAA, vBB, #+CC */
6964    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6965    mov     r9, rINST, lsr #8           @ r9<- AA
6966    and     r2, r3, #255                @ r2<- BB
6967    GET_VREG(r0, r2)                    @ r0<- vBB
6968    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6969    .if 0
6970    @cmp     r1, #0                      @ is second operand zero?
6971    beq     common_errDivideByZero
6972    .endif
6973    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6974
6975                               @ optional op; may set condition codes
6976    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6977    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6978    SET_VREG(r0, r9)               @ vAA<- r0
6979    GOTO_OPCODE(ip)                     @ jump to next instruction
6980    /* 10-12 instructions */
6981
6982
6983/* ------------------------------ */
6984    .balign 64
6985.L_OP_MUL_INT_LIT8: /* 0xda */
6986/* File: armv5te/OP_MUL_INT_LIT8.S */
6987/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6988/* File: armv5te/binopLit8.S */
6989    /*
6990     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6991     * that specifies an instruction that performs "result = r0 op r1".
6992     * This could be an ARM instruction or a function call.  (If the result
6993     * comes back in a register other than r0, you can override "result".)
6994     *
6995     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6996     * vCC (r1).  Useful for integer division and modulus.
6997     *
6998     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6999     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7000     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7001     */
7002    /* binop/lit8 vAA, vBB, #+CC */
7003    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7004    mov     r9, rINST, lsr #8           @ r9<- AA
7005    and     r2, r3, #255                @ r2<- BB
7006    GET_VREG(r0, r2)                    @ r0<- vBB
7007    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7008    .if 0
7009    @cmp     r1, #0                      @ is second operand zero?
7010    beq     common_errDivideByZero
7011    .endif
7012    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7013
7014                               @ optional op; may set condition codes
7015    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
7016    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7017    SET_VREG(r0, r9)               @ vAA<- r0
7018    GOTO_OPCODE(ip)                     @ jump to next instruction
7019    /* 10-12 instructions */
7020
7021
7022/* ------------------------------ */
7023    .balign 64
7024.L_OP_DIV_INT_LIT8: /* 0xdb */
7025/* File: armv5te/OP_DIV_INT_LIT8.S */
7026/* File: armv5te/binopLit8.S */
7027    /*
7028     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7029     * that specifies an instruction that performs "result = r0 op r1".
7030     * This could be an ARM instruction or a function call.  (If the result
7031     * comes back in a register other than r0, you can override "result".)
7032     *
7033     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7034     * vCC (r1).  Useful for integer division and modulus.
7035     *
7036     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7037     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7038     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7039     */
7040    /* binop/lit8 vAA, vBB, #+CC */
7041    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7042    mov     r9, rINST, lsr #8           @ r9<- AA
7043    and     r2, r3, #255                @ r2<- BB
7044    GET_VREG(r0, r2)                    @ r0<- vBB
7045    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7046    .if 1
7047    @cmp     r1, #0                      @ is second operand zero?
7048    beq     common_errDivideByZero
7049    .endif
7050    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7051
7052                               @ optional op; may set condition codes
7053    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
7054    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7055    SET_VREG(r0, r9)               @ vAA<- r0
7056    GOTO_OPCODE(ip)                     @ jump to next instruction
7057    /* 10-12 instructions */
7058
7059
7060/* ------------------------------ */
7061    .balign 64
7062.L_OP_REM_INT_LIT8: /* 0xdc */
7063/* File: armv5te/OP_REM_INT_LIT8.S */
7064/* idivmod returns quotient in r0 and remainder in r1 */
7065/* File: armv5te/binopLit8.S */
7066    /*
7067     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7068     * that specifies an instruction that performs "result = r0 op r1".
7069     * This could be an ARM instruction or a function call.  (If the result
7070     * comes back in a register other than r0, you can override "result".)
7071     *
7072     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7073     * vCC (r1).  Useful for integer division and modulus.
7074     *
7075     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7076     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7077     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7078     */
7079    /* binop/lit8 vAA, vBB, #+CC */
7080    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7081    mov     r9, rINST, lsr #8           @ r9<- AA
7082    and     r2, r3, #255                @ r2<- BB
7083    GET_VREG(r0, r2)                    @ r0<- vBB
7084    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7085    .if 1
7086    @cmp     r1, #0                      @ is second operand zero?
7087    beq     common_errDivideByZero
7088    .endif
7089    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7090
7091                               @ optional op; may set condition codes
7092    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
7093    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7094    SET_VREG(r1, r9)               @ vAA<- r1
7095    GOTO_OPCODE(ip)                     @ jump to next instruction
7096    /* 10-12 instructions */
7097
7098
7099/* ------------------------------ */
7100    .balign 64
7101.L_OP_AND_INT_LIT8: /* 0xdd */
7102/* File: armv5te/OP_AND_INT_LIT8.S */
7103/* File: armv5te/binopLit8.S */
7104    /*
7105     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7106     * that specifies an instruction that performs "result = r0 op r1".
7107     * This could be an ARM instruction or a function call.  (If the result
7108     * comes back in a register other than r0, you can override "result".)
7109     *
7110     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7111     * vCC (r1).  Useful for integer division and modulus.
7112     *
7113     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7114     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7115     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7116     */
7117    /* binop/lit8 vAA, vBB, #+CC */
7118    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7119    mov     r9, rINST, lsr #8           @ r9<- AA
7120    and     r2, r3, #255                @ r2<- BB
7121    GET_VREG(r0, r2)                    @ r0<- vBB
7122    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7123    .if 0
7124    @cmp     r1, #0                      @ is second operand zero?
7125    beq     common_errDivideByZero
7126    .endif
7127    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7128
7129                               @ optional op; may set condition codes
7130    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
7131    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7132    SET_VREG(r0, r9)               @ vAA<- r0
7133    GOTO_OPCODE(ip)                     @ jump to next instruction
7134    /* 10-12 instructions */
7135
7136
7137/* ------------------------------ */
7138    .balign 64
7139.L_OP_OR_INT_LIT8: /* 0xde */
7140/* File: armv5te/OP_OR_INT_LIT8.S */
7141/* File: armv5te/binopLit8.S */
7142    /*
7143     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7144     * that specifies an instruction that performs "result = r0 op r1".
7145     * This could be an ARM instruction or a function call.  (If the result
7146     * comes back in a register other than r0, you can override "result".)
7147     *
7148     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7149     * vCC (r1).  Useful for integer division and modulus.
7150     *
7151     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7152     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7153     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7154     */
7155    /* binop/lit8 vAA, vBB, #+CC */
7156    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7157    mov     r9, rINST, lsr #8           @ r9<- AA
7158    and     r2, r3, #255                @ r2<- BB
7159    GET_VREG(r0, r2)                    @ r0<- vBB
7160    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7161    .if 0
7162    @cmp     r1, #0                      @ is second operand zero?
7163    beq     common_errDivideByZero
7164    .endif
7165    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7166
7167                               @ optional op; may set condition codes
7168    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
7169    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7170    SET_VREG(r0, r9)               @ vAA<- r0
7171    GOTO_OPCODE(ip)                     @ jump to next instruction
7172    /* 10-12 instructions */
7173
7174
7175/* ------------------------------ */
7176    .balign 64
7177.L_OP_XOR_INT_LIT8: /* 0xdf */
7178/* File: armv5te/OP_XOR_INT_LIT8.S */
7179/* File: armv5te/binopLit8.S */
7180    /*
7181     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7182     * that specifies an instruction that performs "result = r0 op r1".
7183     * This could be an ARM instruction or a function call.  (If the result
7184     * comes back in a register other than r0, you can override "result".)
7185     *
7186     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7187     * vCC (r1).  Useful for integer division and modulus.
7188     *
7189     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7190     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7191     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7192     */
7193    /* binop/lit8 vAA, vBB, #+CC */
7194    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7195    mov     r9, rINST, lsr #8           @ r9<- AA
7196    and     r2, r3, #255                @ r2<- BB
7197    GET_VREG(r0, r2)                    @ r0<- vBB
7198    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7199    .if 0
7200    @cmp     r1, #0                      @ is second operand zero?
7201    beq     common_errDivideByZero
7202    .endif
7203    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7204
7205                               @ optional op; may set condition codes
7206    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7207    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7208    SET_VREG(r0, r9)               @ vAA<- r0
7209    GOTO_OPCODE(ip)                     @ jump to next instruction
7210    /* 10-12 instructions */
7211
7212
7213/* ------------------------------ */
7214    .balign 64
7215.L_OP_SHL_INT_LIT8: /* 0xe0 */
7216/* File: armv5te/OP_SHL_INT_LIT8.S */
7217/* File: armv5te/binopLit8.S */
7218    /*
7219     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7220     * that specifies an instruction that performs "result = r0 op r1".
7221     * This could be an ARM instruction or a function call.  (If the result
7222     * comes back in a register other than r0, you can override "result".)
7223     *
7224     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7225     * vCC (r1).  Useful for integer division and modulus.
7226     *
7227     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7228     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7229     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7230     */
7231    /* binop/lit8 vAA, vBB, #+CC */
7232    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7233    mov     r9, rINST, lsr #8           @ r9<- AA
7234    and     r2, r3, #255                @ r2<- BB
7235    GET_VREG(r0, r2)                    @ r0<- vBB
7236    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7237    .if 0
7238    @cmp     r1, #0                      @ is second operand zero?
7239    beq     common_errDivideByZero
7240    .endif
7241    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7242
7243    and     r1, r1, #31                           @ optional op; may set condition codes
7244    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
7245    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7246    SET_VREG(r0, r9)               @ vAA<- r0
7247    GOTO_OPCODE(ip)                     @ jump to next instruction
7248    /* 10-12 instructions */
7249
7250
7251/* ------------------------------ */
7252    .balign 64
7253.L_OP_SHR_INT_LIT8: /* 0xe1 */
7254/* File: armv5te/OP_SHR_INT_LIT8.S */
7255/* File: armv5te/binopLit8.S */
7256    /*
7257     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7258     * that specifies an instruction that performs "result = r0 op r1".
7259     * This could be an ARM instruction or a function call.  (If the result
7260     * comes back in a register other than r0, you can override "result".)
7261     *
7262     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7263     * vCC (r1).  Useful for integer division and modulus.
7264     *
7265     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7266     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7267     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7268     */
7269    /* binop/lit8 vAA, vBB, #+CC */
7270    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7271    mov     r9, rINST, lsr #8           @ r9<- AA
7272    and     r2, r3, #255                @ r2<- BB
7273    GET_VREG(r0, r2)                    @ r0<- vBB
7274    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7275    .if 0
7276    @cmp     r1, #0                      @ is second operand zero?
7277    beq     common_errDivideByZero
7278    .endif
7279    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7280
7281    and     r1, r1, #31                           @ optional op; may set condition codes
7282    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
7283    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7284    SET_VREG(r0, r9)               @ vAA<- r0
7285    GOTO_OPCODE(ip)                     @ jump to next instruction
7286    /* 10-12 instructions */
7287
7288
7289/* ------------------------------ */
7290    .balign 64
7291.L_OP_USHR_INT_LIT8: /* 0xe2 */
7292/* File: armv5te/OP_USHR_INT_LIT8.S */
7293/* File: armv5te/binopLit8.S */
7294    /*
7295     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7296     * that specifies an instruction that performs "result = r0 op r1".
7297     * This could be an ARM instruction or a function call.  (If the result
7298     * comes back in a register other than r0, you can override "result".)
7299     *
7300     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7301     * vCC (r1).  Useful for integer division and modulus.
7302     *
7303     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7304     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7305     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7306     */
7307    /* binop/lit8 vAA, vBB, #+CC */
7308    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7309    mov     r9, rINST, lsr #8           @ r9<- AA
7310    and     r2, r3, #255                @ r2<- BB
7311    GET_VREG(r0, r2)                    @ r0<- vBB
7312    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7313    .if 0
7314    @cmp     r1, #0                      @ is second operand zero?
7315    beq     common_errDivideByZero
7316    .endif
7317    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7318
7319    and     r1, r1, #31                           @ optional op; may set condition codes
7320    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
7321    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7322    SET_VREG(r0, r9)               @ vAA<- r0
7323    GOTO_OPCODE(ip)                     @ jump to next instruction
7324    /* 10-12 instructions */
7325
7326
7327/* ------------------------------ */
7328    .balign 64
7329.L_OP_IGET_VOLATILE: /* 0xe3 */
7330/* File: armv5te/OP_IGET_VOLATILE.S */
7331/* File: armv5te/OP_IGET.S */
7332    /*
7333     * General 32-bit instance field get.
7334     *
7335     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7336     */
7337    /* op vA, vB, field@CCCC */
7338    mov     r0, rINST, lsr #12          @ r0<- B
7339    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7340    FETCH(r1, 1)                        @ r1<- field ref CCCC
7341    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7342    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7343    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7344    cmp     r0, #0                      @ is resolved entry null?
7345    bne     .LOP_IGET_VOLATILE_finish          @ no, already resolved
73468:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7347    EXPORT_PC()                         @ resolve() could throw
7348    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7349    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7350    cmp     r0, #0
7351    bne     .LOP_IGET_VOLATILE_finish
7352    b       common_exceptionThrown
7353
7354
7355/* ------------------------------ */
7356    .balign 64
7357.L_OP_IPUT_VOLATILE: /* 0xe4 */
7358/* File: armv5te/OP_IPUT_VOLATILE.S */
7359/* File: armv5te/OP_IPUT.S */
7360    /*
7361     * General 32-bit instance field put.
7362     *
7363     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
7364     */
7365    /* op vA, vB, field@CCCC */
7366    mov     r0, rINST, lsr #12          @ r0<- B
7367    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7368    FETCH(r1, 1)                        @ r1<- field ref CCCC
7369    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7370    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7371    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7372    cmp     r0, #0                      @ is resolved entry null?
7373    bne     .LOP_IPUT_VOLATILE_finish          @ no, already resolved
73748:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7375    EXPORT_PC()                         @ resolve() could throw
7376    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7377    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7378    cmp     r0, #0                      @ success?
7379    bne     .LOP_IPUT_VOLATILE_finish          @ yes, finish up
7380    b       common_exceptionThrown
7381
7382
7383/* ------------------------------ */
7384    .balign 64
7385.L_OP_SGET_VOLATILE: /* 0xe5 */
7386/* File: armv5te/OP_SGET_VOLATILE.S */
7387/* File: armv5te/OP_SGET.S */
7388    /*
7389     * General 32-bit SGET handler.
7390     *
7391     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7392     */
7393    /* op vAA, field@BBBB */
7394    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7395    FETCH(r1, 1)                        @ r1<- field ref BBBB
7396    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7397    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7398    cmp     r0, #0                      @ is resolved entry null?
7399    beq     .LOP_SGET_VOLATILE_resolve         @ yes, do resolve
7400.LOP_SGET_VOLATILE_finish: @ field ptr in r0
7401    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7402    SMP_DMB                            @ acquiring load
7403    mov     r2, rINST, lsr #8           @ r2<- AA
7404    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7405    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7406    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7407    GOTO_OPCODE(ip)                     @ jump to next instruction
7408
7409
7410/* ------------------------------ */
7411    .balign 64
7412.L_OP_SPUT_VOLATILE: /* 0xe6 */
7413/* File: armv5te/OP_SPUT_VOLATILE.S */
7414/* File: armv5te/OP_SPUT.S */
7415    /*
7416     * General 32-bit SPUT handler.
7417     *
7418     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
7419     */
7420    /* op vAA, field@BBBB */
7421    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7422    FETCH(r1, 1)                        @ r1<- field ref BBBB
7423    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7424    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7425    cmp     r0, #0                      @ is resolved entry null?
7426    beq     .LOP_SPUT_VOLATILE_resolve         @ yes, do resolve
7427.LOP_SPUT_VOLATILE_finish:   @ field ptr in r0
7428    mov     r2, rINST, lsr #8           @ r2<- AA
7429    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7430    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7431    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7432    SMP_DMB_ST                        @ releasing store
7433    str     r1, [r0, #offStaticField_value] @ field<- vAA
7434    SMP_DMB
7435    GOTO_OPCODE(ip)                     @ jump to next instruction
7436
7437
7438/* ------------------------------ */
7439    .balign 64
7440.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
7441/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */
7442/* File: armv5te/OP_IGET.S */
7443    /*
7444     * General 32-bit instance field get.
7445     *
7446     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7447     */
7448    /* op vA, vB, field@CCCC */
7449    mov     r0, rINST, lsr #12          @ r0<- B
7450    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7451    FETCH(r1, 1)                        @ r1<- field ref CCCC
7452    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7453    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7454    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7455    cmp     r0, #0                      @ is resolved entry null?
7456    bne     .LOP_IGET_OBJECT_VOLATILE_finish          @ no, already resolved
74578:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7458    EXPORT_PC()                         @ resolve() could throw
7459    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7460    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7461    cmp     r0, #0
7462    bne     .LOP_IGET_OBJECT_VOLATILE_finish
7463    b       common_exceptionThrown
7464
7465
7466/* ------------------------------ */
7467    .balign 64
7468.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
7469/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */
7470/* File: armv5te/OP_IGET_WIDE.S */
7471    /*
7472     * Wide 32-bit instance field get.
7473     */
7474    /* iget-wide vA, vB, field@CCCC */
7475    mov     r0, rINST, lsr #12          @ r0<- B
7476    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7477    FETCH(r1, 1)                        @ r1<- field ref CCCC
7478    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7479    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7480    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7481    cmp     r0, #0                      @ is resolved entry null?
7482    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
74838:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7484    EXPORT_PC()                         @ resolve() could throw
7485    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7486    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7487    cmp     r0, #0
7488    bne     .LOP_IGET_WIDE_VOLATILE_finish
7489    b       common_exceptionThrown
7490
7491
7492/* ------------------------------ */
7493    .balign 64
7494.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
7495/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */
7496/* File: armv5te/OP_IPUT_WIDE.S */
7497    /* iput-wide vA, vB, field@CCCC */
7498    mov     r0, rINST, lsr #12          @ r0<- B
7499    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7500    FETCH(r1, 1)                        @ r1<- field ref CCCC
7501    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7502    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7503    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7504    cmp     r0, #0                      @ is resolved entry null?
7505    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
75068:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7507    EXPORT_PC()                         @ resolve() could throw
7508    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7509    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7510    cmp     r0, #0                      @ success?
7511    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
7512    b       common_exceptionThrown
7513
7514
7515/* ------------------------------ */
7516    .balign 64
7517.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
7518/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */
7519/* File: armv5te/OP_SGET_WIDE.S */
7520    /*
7521     * 64-bit SGET handler.
7522     */
7523    /* sget-wide vAA, field@BBBB */
7524    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7525    FETCH(r1, 1)                        @ r1<- field ref BBBB
7526    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7527    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7528    cmp     r0, #0                      @ is resolved entry null?
7529    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
7530.LOP_SGET_WIDE_VOLATILE_finish:
7531    mov     r9, rINST, lsr #8           @ r9<- AA
7532    .if 1
7533    add     r0, r0, #offStaticField_value @ r0<- pointer to data
7534    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
7535    .else
7536    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
7537    .endif
7538    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7539    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7540    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
7541    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7542    GOTO_OPCODE(ip)                     @ jump to next instruction
7543
7544
7545/* ------------------------------ */
7546    .balign 64
7547.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
7548/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */
7549/* File: armv5te/OP_SPUT_WIDE.S */
7550    /*
7551     * 64-bit SPUT handler.
7552     */
7553    /* sput-wide vAA, field@BBBB */
7554    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
7555    FETCH(r1, 1)                        @ r1<- field ref BBBB
7556    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7557    mov     r9, rINST, lsr #8           @ r9<- AA
7558    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
7559    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7560    cmp     r2, #0                      @ is resolved entry null?
7561    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7562.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
7563    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7564    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7565    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7566    .if 1
7567    add     r2, r2, #offStaticField_value @ r2<- pointer to data
7568    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
7569    .else
7570    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
7571    .endif
7572    GOTO_OPCODE(r10)                    @ jump to next instruction
7573
7574
7575/* ------------------------------ */
7576    .balign 64
7577.L_OP_BREAKPOINT: /* 0xec */
7578/* File: armv5te/OP_BREAKPOINT.S */
7579    /*
7580     * Breakpoint handler.
7581     *
7582     * Restart this instruction with the original opcode.  By
7583     * the time we get here, the breakpoint will have already been
7584     * handled.
7585     */
7586    mov     r0, rPC
7587    bl      dvmGetOriginalOpcode        @ (rPC)
7588    FETCH(rINST, 0)                     @ reload OP_BREAKPOINT + rest of inst
7589    ldr     r1, [rSELF, #offThread_mainHandlerTable]
7590    and     rINST, #0xff00
7591    orr     rINST, rINST, r0
7592    GOTO_OPCODE_BASE(r1, r0)
7593
7594/* ------------------------------ */
7595    .balign 64
7596.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
7597/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
7598    /*
7599     * Handle a throw-verification-error instruction.  This throws an
7600     * exception for an error discovered during verification.  The
7601     * exception is indicated by AA, with some detail provided by BBBB.
7602     */
7603    /* op AA, ref@BBBB */
7604    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
7605    FETCH(r2, 1)                        @ r2<- BBBB
7606    EXPORT_PC()                         @ export the PC
7607    mov     r1, rINST, lsr #8           @ r1<- AA
7608    bl      dvmThrowVerificationError   @ always throws
7609    b       common_exceptionThrown      @ handle exception
7610
7611/* ------------------------------ */
7612    .balign 64
7613.L_OP_EXECUTE_INLINE: /* 0xee */
7614/* File: armv5te/OP_EXECUTE_INLINE.S */
7615    /*
7616     * Execute a "native inline" instruction.
7617     *
7618     * We need to call an InlineOp4Func:
7619     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7620     *
7621     * The first four args are in r0-r3, pointer to return value storage
7622     * is on the stack.  The function's return value is a flag that tells
7623     * us if an exception was thrown.
7624     *
7625     * TUNING: could maintain two tables, pointer in Thread and
7626     * swap if profiler/debuggger active.
7627     */
7628    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7629    ldrh    r2, [rSELF, #offThread_subMode]
7630    FETCH(r10, 1)                       @ r10<- BBBB
7631    EXPORT_PC()                         @ can throw
7632    ands    r2, #kSubModeDebugProfile   @ Any going on?
7633    bne     .LOP_EXECUTE_INLINE_debugmode       @ yes - take slow path
7634.LOP_EXECUTE_INLINE_resume:
7635    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7636    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7637    mov     r0, rINST, lsr #12          @ r0<- B
7638    str     r1, [sp]                    @ push &self->retval
7639    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7640    add     sp, sp, #8                  @ pop stack
7641    cmp     r0, #0                      @ test boolean result of inline
7642    beq     common_exceptionThrown      @ returned false, handle exception
7643    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7644    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7645    GOTO_OPCODE(ip)                     @ jump to next instruction
7646
7647/* ------------------------------ */
7648    .balign 64
7649.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7650/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7651    /*
7652     * Execute a "native inline" instruction, using "/range" semantics.
7653     * Same idea as execute-inline, but we get the args differently.
7654     *
7655     * We need to call an InlineOp4Func:
7656     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7657     *
7658     * The first four args are in r0-r3, pointer to return value storage
7659     * is on the stack.  The function's return value is a flag that tells
7660     * us if an exception was thrown.
7661     */
7662    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7663    ldrh    r2, [rSELF, #offThread_subMode]
7664    FETCH(r10, 1)                       @ r10<- BBBB
7665    EXPORT_PC()                         @ can throw
7666    ands    r2, #kSubModeDebugProfile   @ Any going on?
7667    bne     .LOP_EXECUTE_INLINE_RANGE_debugmode       @ yes - take slow path
7668.LOP_EXECUTE_INLINE_RANGE_resume:
7669    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7670    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7671    mov     r0, rINST, lsr #8           @ r0<- AA
7672    str     r1, [sp]                    @ push &self->retval
7673    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7674    add     sp, sp, #8                  @ pop stack
7675    cmp     r0, #0                      @ test boolean result of inline
7676    beq     common_exceptionThrown      @ returned false, handle exception
7677    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7678    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7679    GOTO_OPCODE(ip)                     @ jump to next instruction
7680
7681/* ------------------------------ */
7682    .balign 64
7683.L_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
7684/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
7685    /*
7686     * Invoke Object.<init> on an object.  In practice we know that
7687     * Object's nullary constructor doesn't do anything, so we just
7688     * skip it unless a debugger is active.
7689     */
7690    FETCH(r1, 2)                  @ r1<- CCCC
7691    GET_VREG(r0, r1)                    @ r0<- "this" ptr
7692    cmp     r0, #0                      @ check for NULL
7693    beq     common_errNullObject        @ export PC and throw NPE
7694    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
7695    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
7696    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
7697    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_setFinal        @ yes, go
7698.LOP_INVOKE_OBJECT_INIT_RANGE_finish:
7699    ldrh    r1, [rSELF, #offThread_subMode]
7700    ands    r1, #kSubModeDebuggerActive @ debugger active?
7701    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_debugger        @ Yes - skip optimization
7702    FETCH_ADVANCE_INST(2+1)       @ advance to next instr, load rINST
7703    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7704    GOTO_OPCODE(ip)                     @ execute it
7705
7706/* ------------------------------ */
7707    .balign 64
7708.L_OP_RETURN_VOID_BARRIER: /* 0xf1 */
7709/* File: armv5te/OP_RETURN_VOID_BARRIER.S */
7710    SMP_DMB_ST
7711    b       common_returnFromMethod
7712
7713/* ------------------------------ */
7714    .balign 64
7715.L_OP_IGET_QUICK: /* 0xf2 */
7716/* File: armv5te/OP_IGET_QUICK.S */
7717    /* For: iget-quick, iget-object-quick */
7718    /* op vA, vB, offset@CCCC */
7719    mov     r2, rINST, lsr #12          @ r2<- B
7720    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7721    FETCH(r1, 1)                        @ r1<- field byte offset
7722    cmp     r3, #0                      @ check object for null
7723    mov     r2, rINST, lsr #8           @ r2<- A(+)
7724    beq     common_errNullObject        @ object was null
7725    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7726    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7727    and     r2, r2, #15
7728    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7729    SET_VREG(r0, r2)                    @ fp[A]<- r0
7730    GOTO_OPCODE(ip)                     @ jump to next instruction
7731
7732/* ------------------------------ */
7733    .balign 64
7734.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7735/* File: armv5te/OP_IGET_WIDE_QUICK.S */
7736    /* iget-wide-quick vA, vB, offset@CCCC */
7737    mov     r2, rINST, lsr #12          @ r2<- B
7738    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7739    FETCH(ip, 1)                        @ ip<- field byte offset
7740    cmp     r3, #0                      @ check object for null
7741    mov     r2, rINST, lsr #8           @ r2<- A(+)
7742    beq     common_errNullObject        @ object was null
7743    ldrd    r0, [r3, ip]                @ r0<- obj.field (64 bits, aligned)
7744    and     r2, r2, #15
7745    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7746    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7747    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7748    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7749    GOTO_OPCODE(ip)                     @ jump to next instruction
7750
7751/* ------------------------------ */
7752    .balign 64
7753.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7754/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7755/* File: armv5te/OP_IGET_QUICK.S */
7756    /* For: iget-quick, iget-object-quick */
7757    /* op vA, vB, offset@CCCC */
7758    mov     r2, rINST, lsr #12          @ r2<- B
7759    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7760    FETCH(r1, 1)                        @ r1<- field byte offset
7761    cmp     r3, #0                      @ check object for null
7762    mov     r2, rINST, lsr #8           @ r2<- A(+)
7763    beq     common_errNullObject        @ object was null
7764    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7765    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7766    and     r2, r2, #15
7767    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7768    SET_VREG(r0, r2)                    @ fp[A]<- r0
7769    GOTO_OPCODE(ip)                     @ jump to next instruction
7770
7771
7772/* ------------------------------ */
7773    .balign 64
7774.L_OP_IPUT_QUICK: /* 0xf5 */
7775/* File: armv5te/OP_IPUT_QUICK.S */
7776    /* For: iput-quick */
7777    /* op vA, vB, offset@CCCC */
7778    mov     r2, rINST, lsr #12          @ r2<- B
7779    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7780    FETCH(r1, 1)                        @ r1<- field byte offset
7781    cmp     r3, #0                      @ check object for null
7782    mov     r2, rINST, lsr #8           @ r2<- A(+)
7783    beq     common_errNullObject        @ object was null
7784    and     r2, r2, #15
7785    GET_VREG(r0, r2)                    @ r0<- fp[A]
7786    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7787    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7788    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7789    GOTO_OPCODE(ip)                     @ jump to next instruction
7790
7791/* ------------------------------ */
7792    .balign 64
7793.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7794/* File: armv5te/OP_IPUT_WIDE_QUICK.S */
7795    /* iput-wide-quick vA, vB, offset@CCCC */
7796    mov     r0, rINST, lsr #8           @ r0<- A(+)
7797    mov     r1, rINST, lsr #12          @ r1<- B
7798    and     r0, r0, #15
7799    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7800    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7801    cmp     r2, #0                      @ check object for null
7802    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7803    beq     common_errNullObject        @ object was null
7804    FETCH(r3, 1)                        @ r3<- field byte offset
7805    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7806    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7807    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7808    GOTO_OPCODE(ip)                     @ jump to next instruction
7809
7810/* ------------------------------ */
7811    .balign 64
7812.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7813/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7814    /* For: iput-object-quick */
7815    /* op vA, vB, offset@CCCC */
7816    mov     r2, rINST, lsr #12          @ r2<- B
7817    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7818    FETCH(r1, 1)                        @ r1<- field byte offset
7819    cmp     r3, #0                      @ check object for null
7820    mov     r2, rINST, lsr #8           @ r2<- A(+)
7821    beq     common_errNullObject        @ object was null
7822    and     r2, r2, #15
7823    GET_VREG(r0, r2)                    @ r0<- fp[A]
7824    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7825    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7826    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7827    cmp     r0, #0
7828    strneb  r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
7829    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7830    GOTO_OPCODE(ip)                     @ jump to next instruction
7831
7832/* ------------------------------ */
7833    .balign 64
7834.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7835/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7836    /*
7837     * Handle an optimized virtual method call.
7838     *
7839     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7840     */
7841    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7842    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7843    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7844    FETCH(r1, 1)                        @ r1<- BBBB
7845    .if     (!0)
7846    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7847    .endif
7848    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7849    cmp     r9, #0                      @ is "this" null?
7850    beq     common_errNullObject        @ null "this", throw exception
7851    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7852    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7853    EXPORT_PC()                         @ invoke must export
7854    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7855    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7856
7857/* ------------------------------ */
7858    .balign 64
7859.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7860/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7861/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7862    /*
7863     * Handle an optimized virtual method call.
7864     *
7865     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7866     */
7867    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7868    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7869    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7870    FETCH(r1, 1)                        @ r1<- BBBB
7871    .if     (!1)
7872    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7873    .endif
7874    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7875    cmp     r9, #0                      @ is "this" null?
7876    beq     common_errNullObject        @ null "this", throw exception
7877    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7878    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7879    EXPORT_PC()                         @ invoke must export
7880    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7881    bl      common_invokeMethodRange @ (r0=method, r9="this")
7882
7883
7884/* ------------------------------ */
7885    .balign 64
7886.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7887/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7888    /*
7889     * Handle an optimized "super" method call.
7890     *
7891     * for: [opt] invoke-super-quick, invoke-super-quick/range
7892     */
7893    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7894    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7895    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7896    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7897    .if     (!0)
7898    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7899    .endif
7900    FETCH(r1, 1)                        @ r1<- BBBB
7901    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7902    EXPORT_PC()                         @ must export for invoke
7903    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7904    GET_VREG(r9, r10)                   @ r9<- "this"
7905    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7906    cmp     r9, #0                      @ null "this" ref?
7907    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7908    beq     common_errNullObject        @ "this" is null, throw exception
7909    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7910
7911/* ------------------------------ */
7912    .balign 64
7913.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7914/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
7915/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7916    /*
7917     * Handle an optimized "super" method call.
7918     *
7919     * for: [opt] invoke-super-quick, invoke-super-quick/range
7920     */
7921    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7922    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7923    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7924    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7925    .if     (!1)
7926    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7927    .endif
7928    FETCH(r1, 1)                        @ r1<- BBBB
7929    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7930    EXPORT_PC()                         @ must export for invoke
7931    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7932    GET_VREG(r9, r10)                   @ r9<- "this"
7933    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7934    cmp     r9, #0                      @ null "this" ref?
7935    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7936    beq     common_errNullObject        @ "this" is null, throw exception
7937    bl      common_invokeMethodRange @ (r0=method, r9="this")
7938
7939
7940/* ------------------------------ */
7941    .balign 64
7942.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
7943/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */
7944/* File: armv5te/OP_IPUT_OBJECT.S */
7945    /*
7946     * 32-bit instance field put.
7947     *
7948     * for: iput-object, iput-object-volatile
7949     */
7950    /* op vA, vB, field@CCCC */
7951    mov     r0, rINST, lsr #12          @ r0<- B
7952    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7953    FETCH(r1, 1)                        @ r1<- field ref CCCC
7954    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7955    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7956    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7957    cmp     r0, #0                      @ is resolved entry null?
7958    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ no, already resolved
79598:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7960    EXPORT_PC()                         @ resolve() could throw
7961    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7962    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7963    cmp     r0, #0                      @ success?
7964    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ yes, finish up
7965    b       common_exceptionThrown
7966
7967
7968/* ------------------------------ */
7969    .balign 64
7970.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
7971/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */
7972/* File: armv5te/OP_SGET.S */
7973    /*
7974     * General 32-bit SGET handler.
7975     *
7976     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7977     */
7978    /* op vAA, field@BBBB */
7979    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7980    FETCH(r1, 1)                        @ r1<- field ref BBBB
7981    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7982    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7983    cmp     r0, #0                      @ is resolved entry null?
7984    beq     .LOP_SGET_OBJECT_VOLATILE_resolve         @ yes, do resolve
7985.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0
7986    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7987    SMP_DMB                            @ acquiring load
7988    mov     r2, rINST, lsr #8           @ r2<- AA
7989    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7990    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7991    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7992    GOTO_OPCODE(ip)                     @ jump to next instruction
7993
7994
7995/* ------------------------------ */
7996    .balign 64
7997.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
7998/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */
7999/* File: armv5te/OP_SPUT_OBJECT.S */
8000    /*
8001     * 32-bit SPUT handler for objects
8002     *
8003     * for: sput-object, sput-object-volatile
8004     */
8005    /* op vAA, field@BBBB */
8006    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8007    FETCH(r1, 1)                        @ r1<- field ref BBBB
8008    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8009    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8010    cmp     r0, #0                      @ is resolved entry null?
8011    beq     .LOP_SPUT_OBJECT_VOLATILE_resolve         @ yes, do resolve
8012.LOP_SPUT_OBJECT_VOLATILE_finish:   @ field ptr in r0
8013    mov     r2, rINST, lsr #8           @ r2<- AA
8014    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8015    GET_VREG(r1, r2)                    @ r1<- fp[AA]
8016    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8017    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
8018    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8019    SMP_DMB_ST                        @ releasing store
8020    b       .LOP_SPUT_OBJECT_VOLATILE_end
8021
8022
8023/* ------------------------------ */
8024    .balign 64
8025.L_OP_DISPATCH_FF: /* 0xff */
8026/* File: armv5te/OP_DISPATCH_FF.S */
8027    mov     ip, rINST, lsr #8           @ ip<- extended opcode
8028    add     ip, ip, #256                @ add offset for extended opcodes
8029    GOTO_OPCODE(ip)                     @ go to proper extended handler
8030
8031
8032/* ------------------------------ */
8033    .balign 64
8034.L_OP_CONST_CLASS_JUMBO: /* 0x100 */
8035/* File: armv5te/OP_CONST_CLASS_JUMBO.S */
8036    /* const-class/jumbo vBBBB, Class@AAAAAAAA */
8037    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8038    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<-self>methodClassDex
8039    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8040    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
8041    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8042    FETCH(r9, 3)                        @ r9<- BBBB
8043    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[AAAAaaaa]
8044    cmp     r0, #0                      @ not yet resolved?
8045    beq     .LOP_CONST_CLASS_JUMBO_resolve
8046    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8047    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8048    SET_VREG(r0, r9)                    @ vBBBB<- r0
8049    GOTO_OPCODE(ip)                     @ jump to next instruction
8050
8051/* ------------------------------ */
8052    .balign 64
8053.L_OP_CHECK_CAST_JUMBO: /* 0x101 */
8054/* File: armv5te/OP_CHECK_CAST_JUMBO.S */
8055    /*
8056     * Check to see if a cast from one class to another is allowed.
8057     */
8058    /* check-cast/jumbo vBBBB, class@AAAAAAAA */
8059    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8060    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8061    FETCH(r3, 3)                        @ r3<- BBBB
8062    orr     r2, r0, r2, lsl #16         @ r2<- AAAAaaaa
8063    GET_VREG(r9, r3)                    @ r9<- object
8064    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
8065    cmp     r9, #0                      @ is object null?
8066    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
8067    beq     .LOP_CHECK_CAST_JUMBO_okay            @ null obj, cast always succeeds
8068    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
8069    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8070    cmp     r1, #0                      @ have we resolved this before?
8071    beq     .LOP_CHECK_CAST_JUMBO_resolve         @ not resolved, do it now
8072.LOP_CHECK_CAST_JUMBO_resolved:
8073    cmp     r0, r1                      @ same class (trivial success)?
8074    bne     .LOP_CHECK_CAST_JUMBO_fullcheck       @ no, do full check
8075    b       .LOP_CHECK_CAST_JUMBO_okay            @ yes, finish up
8076
8077/* ------------------------------ */
8078    .balign 64
8079.L_OP_INSTANCE_OF_JUMBO: /* 0x102 */
8080/* File: armv5te/OP_INSTANCE_OF_JUMBO.S */
8081    /*
8082     * Check to see if an object reference is an instance of a class.
8083     *
8084     * Most common situation is a non-null object, being compared against
8085     * an already-resolved class.
8086     *
8087     * TODO: convert most of this into a common subroutine, shared with
8088     *       OP_INSTANCE_OF.S.
8089     */
8090    /* instance-of/jumbo vBBBB, vCCCC, class@AAAAAAAA */
8091    FETCH(r3, 4)                        @ r3<- vCCCC
8092    FETCH(r9, 3)                        @ r9<- vBBBB
8093    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
8094    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
8095    cmp     r0, #0                      @ is object null?
8096    beq     .LOP_INSTANCE_OF_JUMBO_store           @ null obj, not an instance, store r0
8097    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8098    FETCH(r3, 2)                        @ r3<- AAAA (hi)
8099    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
8100    orr     r3, r1, r3, lsl #16         @ r3<- AAAAaaaa
8101    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
8102    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
8103    cmp     r1, #0                      @ have we resolved this before?
8104    beq     .LOP_INSTANCE_OF_JUMBO_resolve         @ not resolved, do it now
8105    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ resolved, continue
8106
8107/* ------------------------------ */
8108    .balign 64
8109.L_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
8110/* File: armv5te/OP_NEW_INSTANCE_JUMBO.S */
8111    /*
8112     * Create a new instance of a class.
8113     */
8114    /* new-instance/jumbo vBBBB, class@AAAAAAAA */
8115    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8116    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8117    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8118    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8119    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
8120    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
8121#if defined(WITH_JIT)
8122    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
8123#endif
8124    EXPORT_PC()                         @ req'd for init, resolve, alloc
8125    cmp     r0, #0                      @ already resolved?
8126    beq     .LOP_NEW_INSTANCE_JUMBO_resolve         @ no, resolve it now
8127.LOP_NEW_INSTANCE_JUMBO_resolved:   @ r0=class
8128    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
8129    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
8130    bne     .LOP_NEW_INSTANCE_JUMBO_needinit        @ no, init class now
8131.LOP_NEW_INSTANCE_JUMBO_initialized: @ r0=class
8132    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
8133    bl      dvmAllocObject              @ r0<- new object
8134    b       .LOP_NEW_INSTANCE_JUMBO_finish          @ continue
8135
8136/* ------------------------------ */
8137    .balign 64
8138.L_OP_NEW_ARRAY_JUMBO: /* 0x104 */
8139/* File: armv5te/OP_NEW_ARRAY_JUMBO.S */
8140    /*
8141     * Allocate an array of objects, specified with the array class
8142     * and a count.
8143     *
8144     * The verifier guarantees that this is an array class, so we don't
8145     * check for it here.
8146     */
8147    /* new-array/jumbo vBBBB, vCCCC, class@AAAAAAAA */
8148    FETCH(r2, 1)                        @ r2<- aaaa (lo)
8149    FETCH(r3, 2)                        @ r3<- AAAA (hi)
8150    FETCH(r0, 4)                        @ r0<- vCCCC
8151    orr     r2, r2, r3, lsl #16         @ r2<- AAAAaaaa
8152    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8153    GET_VREG(r1, r0)                    @ r1<- vCCCC (array length)
8154    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
8155    cmp     r1, #0                      @ check length
8156    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
8157    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
8158    cmp     r0, #0                      @ already resolved?
8159    EXPORT_PC()                         @ req'd for resolve, alloc
8160    bne     .LOP_NEW_ARRAY_JUMBO_finish          @ resolved, continue
8161    b       .LOP_NEW_ARRAY_JUMBO_resolve         @ do resolve now
8162
8163/* ------------------------------ */
8164    .balign 64
8165.L_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
8166/* File: armv5te/OP_FILLED_NEW_ARRAY_JUMBO.S */
8167    /*
8168     * Create a new array with elements filled from registers.
8169     *
8170     * TODO: convert most of this into a common subroutine, shared with
8171     *       OP_FILLED_NEW_ARRAY.S.
8172     */
8173    /* filled-new-array/jumbo {vCCCC..v(CCCC+BBBB-1)}, type@AAAAAAAA */
8174    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8175    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8176    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8177    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
8178    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8179    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
8180    EXPORT_PC()                         @ need for resolve and alloc
8181    cmp     r0, #0                      @ already resolved?
8182    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_continue        @ yes, continue on
81838:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
8184    mov     r2, #0                      @ r2<- false
8185    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8186    bl      dvmResolveClass             @ r0<- call(clazz, ref)
8187    cmp     r0, #0                      @ got null?
8188    beq     common_exceptionThrown      @ yes, handle exception
8189    b       .LOP_FILLED_NEW_ARRAY_JUMBO_continue
8190
8191/* ------------------------------ */
8192    .balign 64
8193.L_OP_IGET_JUMBO: /* 0x106 */
8194/* File: armv5te/OP_IGET_JUMBO.S */
8195    /*
8196     * Jumbo 32-bit instance field get.
8197     *
8198     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8199     *      iget-char/jumbo, iget-short/jumbo
8200     */
8201    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8202    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8203    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8204    FETCH(r0, 4)                        @ r0<- CCCC
8205    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8206    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8207    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8208    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8209    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8210    cmp     r0, #0                      @ is resolved entry null?
8211    bne     .LOP_IGET_JUMBO_finish          @ no, already resolved
82128:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8213    EXPORT_PC()                         @ resolve() could throw
8214    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8215    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8216    b       .LOP_IGET_JUMBO_resolved        @ resolved, continue
8217
8218/* ------------------------------ */
8219    .balign 64
8220.L_OP_IGET_WIDE_JUMBO: /* 0x107 */
8221/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
8222    /*
8223     * Jumbo 64-bit instance field get.
8224     */
8225    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8226    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8227    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8228    FETCH(r0, 4)                        @ r0<- CCCC
8229    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8230    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8231    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
8232    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8233    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8234    cmp     r0, #0                      @ is resolved entry null?
8235    bne     .LOP_IGET_WIDE_JUMBO_finish          @ no, already resolved
8236    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
8237    EXPORT_PC()                         @ resolve() could throw
8238    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8239    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8240    b       .LOP_IGET_WIDE_JUMBO_resolved        @ resolved, continue
8241
8242/* ------------------------------ */
8243    .balign 64
8244.L_OP_IGET_OBJECT_JUMBO: /* 0x108 */
8245/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
8246/* File: armv5te/OP_IGET_JUMBO.S */
8247    /*
8248     * Jumbo 32-bit instance field get.
8249     *
8250     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8251     *      iget-char/jumbo, iget-short/jumbo
8252     */
8253    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8254    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8255    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8256    FETCH(r0, 4)                        @ r0<- CCCC
8257    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8258    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8259    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8260    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8261    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8262    cmp     r0, #0                      @ is resolved entry null?
8263    bne     .LOP_IGET_OBJECT_JUMBO_finish          @ no, already resolved
82648:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8265    EXPORT_PC()                         @ resolve() could throw
8266    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8267    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8268    b       .LOP_IGET_OBJECT_JUMBO_resolved        @ resolved, continue
8269
8270
8271/* ------------------------------ */
8272    .balign 64
8273.L_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
8274/* File: armv5te/OP_IGET_BOOLEAN_JUMBO.S */
8275@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrb", "sqnum":"1" }
8276/* File: armv5te/OP_IGET_JUMBO.S */
8277    /*
8278     * Jumbo 32-bit instance field get.
8279     *
8280     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8281     *      iget-char/jumbo, iget-short/jumbo
8282     */
8283    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8284    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8285    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8286    FETCH(r0, 4)                        @ r0<- CCCC
8287    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8288    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8289    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8290    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8291    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8292    cmp     r0, #0                      @ is resolved entry null?
8293    bne     .LOP_IGET_BOOLEAN_JUMBO_finish          @ no, already resolved
82948:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8295    EXPORT_PC()                         @ resolve() could throw
8296    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8297    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8298    b       .LOP_IGET_BOOLEAN_JUMBO_resolved        @ resolved, continue
8299
8300
8301/* ------------------------------ */
8302    .balign 64
8303.L_OP_IGET_BYTE_JUMBO: /* 0x10a */
8304/* File: armv5te/OP_IGET_BYTE_JUMBO.S */
8305@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsb", "sqnum":"2" }
8306/* File: armv5te/OP_IGET_JUMBO.S */
8307    /*
8308     * Jumbo 32-bit instance field get.
8309     *
8310     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8311     *      iget-char/jumbo, iget-short/jumbo
8312     */
8313    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8314    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8315    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8316    FETCH(r0, 4)                        @ r0<- CCCC
8317    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8318    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8319    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8320    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8321    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8322    cmp     r0, #0                      @ is resolved entry null?
8323    bne     .LOP_IGET_BYTE_JUMBO_finish          @ no, already resolved
83248:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8325    EXPORT_PC()                         @ resolve() could throw
8326    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8327    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8328    b       .LOP_IGET_BYTE_JUMBO_resolved        @ resolved, continue
8329
8330
8331/* ------------------------------ */
8332    .balign 64
8333.L_OP_IGET_CHAR_JUMBO: /* 0x10b */
8334/* File: armv5te/OP_IGET_CHAR_JUMBO.S */
8335@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrh", "sqnum":"3" }
8336/* File: armv5te/OP_IGET_JUMBO.S */
8337    /*
8338     * Jumbo 32-bit instance field get.
8339     *
8340     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8341     *      iget-char/jumbo, iget-short/jumbo
8342     */
8343    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8344    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8345    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8346    FETCH(r0, 4)                        @ r0<- CCCC
8347    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8348    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8349    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8350    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8351    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8352    cmp     r0, #0                      @ is resolved entry null?
8353    bne     .LOP_IGET_CHAR_JUMBO_finish          @ no, already resolved
83548:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8355    EXPORT_PC()                         @ resolve() could throw
8356    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8357    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8358    b       .LOP_IGET_CHAR_JUMBO_resolved        @ resolved, continue
8359
8360
8361/* ------------------------------ */
8362    .balign 64
8363.L_OP_IGET_SHORT_JUMBO: /* 0x10c */
8364/* File: armv5te/OP_IGET_SHORT_JUMBO.S */
8365@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsh", "sqnum":"4" }
8366/* File: armv5te/OP_IGET_JUMBO.S */
8367    /*
8368     * Jumbo 32-bit instance field get.
8369     *
8370     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8371     *      iget-char/jumbo, iget-short/jumbo
8372     */
8373    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8374    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8375    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8376    FETCH(r0, 4)                        @ r0<- CCCC
8377    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8378    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8379    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8380    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8381    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8382    cmp     r0, #0                      @ is resolved entry null?
8383    bne     .LOP_IGET_SHORT_JUMBO_finish          @ no, already resolved
83848:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8385    EXPORT_PC()                         @ resolve() could throw
8386    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8387    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8388    b       .LOP_IGET_SHORT_JUMBO_resolved        @ resolved, continue
8389
8390
8391/* ------------------------------ */
8392    .balign 64
8393.L_OP_IPUT_JUMBO: /* 0x10d */
8394/* File: armv5te/OP_IPUT_JUMBO.S */
8395    /*
8396     * Jumbo 32-bit instance field put.
8397     *
8398     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8399     *      iput-short/jumbo
8400     */
8401    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8402    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8403    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8404    FETCH(r0, 4)                        @ r0<- CCCC
8405    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8406    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8407    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8408    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8409    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8410    cmp     r0, #0                      @ is resolved entry null?
8411    bne     .LOP_IPUT_JUMBO_finish          @ no, already resolved
84128:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8413    EXPORT_PC()                         @ resolve() could throw
8414    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8415    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8416    b       .LOP_IPUT_JUMBO_resolved        @ resolved, continue
8417
8418/* ------------------------------ */
8419    .balign 64
8420.L_OP_IPUT_WIDE_JUMBO: /* 0x10e */
8421/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
8422    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8423    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8424    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8425    FETCH(r0, 4)                        @ r0<- CCCC
8426    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8427    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8428    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
8429    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
8430    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8431    cmp     r0, #0                      @ is resolved entry null?
8432    bne     .LOP_IPUT_WIDE_JUMBO_finish          @ no, already resolved
84338:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
8434    EXPORT_PC()                         @ resolve() could throw
8435    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8436    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8437    b       .LOP_IPUT_WIDE_JUMBO_resolved        @ resolved, continue
8438
8439/* ------------------------------ */
8440    .balign 64
8441.L_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
8442/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
8443    /*
8444     * Jumbo 32-bit instance field put.
8445     */
8446    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8447    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8448    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8449    FETCH(r0, 4)                        @ r0<- CCCC
8450    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8451    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8452    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8453    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8454    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8455    cmp     r0, #0                      @ is resolved entry null?
8456    bne     .LOP_IPUT_OBJECT_JUMBO_finish          @ no, already resolved
84578:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8458    EXPORT_PC()                         @ resolve() could throw
8459    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8460    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8461    b       .LOP_IPUT_OBJECT_JUMBO_resolved        @ resolved, continue
8462
8463/* ------------------------------ */
8464    .balign 64
8465.L_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
8466/* File: armv5te/OP_IPUT_BOOLEAN_JUMBO.S */
8467@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"1" }
8468/* File: armv5te/OP_IPUT_JUMBO.S */
8469    /*
8470     * Jumbo 32-bit instance field put.
8471     *
8472     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8473     *      iput-short/jumbo
8474     */
8475    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8476    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8477    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8478    FETCH(r0, 4)                        @ r0<- CCCC
8479    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8480    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8481    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8482    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8483    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8484    cmp     r0, #0                      @ is resolved entry null?
8485    bne     .LOP_IPUT_BOOLEAN_JUMBO_finish          @ no, already resolved
84868:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8487    EXPORT_PC()                         @ resolve() could throw
8488    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8489    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8490    b       .LOP_IPUT_BOOLEAN_JUMBO_resolved        @ resolved, continue
8491
8492
8493/* ------------------------------ */
8494    .balign 64
8495.L_OP_IPUT_BYTE_JUMBO: /* 0x111 */
8496/* File: armv5te/OP_IPUT_BYTE_JUMBO.S */
8497@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"2" }
8498/* File: armv5te/OP_IPUT_JUMBO.S */
8499    /*
8500     * Jumbo 32-bit instance field put.
8501     *
8502     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8503     *      iput-short/jumbo
8504     */
8505    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8506    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8507    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8508    FETCH(r0, 4)                        @ r0<- CCCC
8509    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8510    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8511    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8512    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8513    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8514    cmp     r0, #0                      @ is resolved entry null?
8515    bne     .LOP_IPUT_BYTE_JUMBO_finish          @ no, already resolved
85168:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8517    EXPORT_PC()                         @ resolve() could throw
8518    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8519    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8520    b       .LOP_IPUT_BYTE_JUMBO_resolved        @ resolved, continue
8521
8522
8523/* ------------------------------ */
8524    .balign 64
8525.L_OP_IPUT_CHAR_JUMBO: /* 0x112 */
8526/* File: armv5te/OP_IPUT_CHAR_JUMBO.S */
8527@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"3" }
8528/* File: armv5te/OP_IPUT_JUMBO.S */
8529    /*
8530     * Jumbo 32-bit instance field put.
8531     *
8532     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8533     *      iput-short/jumbo
8534     */
8535    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8536    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8537    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8538    FETCH(r0, 4)                        @ r0<- CCCC
8539    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8540    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8541    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8542    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8543    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8544    cmp     r0, #0                      @ is resolved entry null?
8545    bne     .LOP_IPUT_CHAR_JUMBO_finish          @ no, already resolved
85468:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8547    EXPORT_PC()                         @ resolve() could throw
8548    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8549    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8550    b       .LOP_IPUT_CHAR_JUMBO_resolved        @ resolved, continue
8551
8552
8553/* ------------------------------ */
8554    .balign 64
8555.L_OP_IPUT_SHORT_JUMBO: /* 0x113 */
8556/* File: armv5te/OP_IPUT_SHORT_JUMBO.S */
8557@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"4" }
8558/* File: armv5te/OP_IPUT_JUMBO.S */
8559    /*
8560     * Jumbo 32-bit instance field put.
8561     *
8562     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8563     *      iput-short/jumbo
8564     */
8565    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8566    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8567    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8568    FETCH(r0, 4)                        @ r0<- CCCC
8569    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8570    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8571    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8572    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8573    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8574    cmp     r0, #0                      @ is resolved entry null?
8575    bne     .LOP_IPUT_SHORT_JUMBO_finish          @ no, already resolved
85768:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8577    EXPORT_PC()                         @ resolve() could throw
8578    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8579    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8580    b       .LOP_IPUT_SHORT_JUMBO_resolved        @ resolved, continue
8581
8582
8583/* ------------------------------ */
8584    .balign 64
8585.L_OP_SGET_JUMBO: /* 0x114 */
8586/* File: armv5te/OP_SGET_JUMBO.S */
8587    /*
8588     * Jumbo 32-bit SGET handler.
8589     *
8590     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8591     *      sget-char/jumbo, sget-short/jumbo
8592     */
8593    /* exop vBBBB, field@AAAAAAAA */
8594    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8595    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8596    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8597    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8598    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8599    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8600    cmp     r0, #0                      @ is resolved entry null?
8601    beq     .LOP_SGET_JUMBO_resolve         @ yes, do resolve
8602.LOP_SGET_JUMBO_finish: @ field ptr in r0
8603    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8604    @ no-op                             @ acquiring load
8605    FETCH(r2, 3)                        @ r2<- BBBB
8606    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8607    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8608    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8609    GOTO_OPCODE(ip)                     @ jump to next instruction
8610
8611/* ------------------------------ */
8612    .balign 64
8613.L_OP_SGET_WIDE_JUMBO: /* 0x115 */
8614/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
8615    /*
8616     * Jumbo 64-bit SGET handler.
8617     */
8618    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
8619    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8620    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8621    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8622    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
8623    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8624    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
8625    cmp     r0, #0                      @ is resolved entry null?
8626    beq     .LOP_SGET_WIDE_JUMBO_resolve         @ yes, do resolve
8627.LOP_SGET_WIDE_JUMBO_finish:
8628    FETCH(r9, 3)                        @ r9<- BBBB
8629    .if 0
8630    add     r0, r0, #offStaticField_value @ r0<- pointer to data
8631    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
8632    .else
8633    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
8634    .endif
8635    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8636    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8637    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
8638    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8639    GOTO_OPCODE(ip)                     @ jump to next instruction
8640
8641/* ------------------------------ */
8642    .balign 64
8643.L_OP_SGET_OBJECT_JUMBO: /* 0x116 */
8644/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
8645/* File: armv5te/OP_SGET_JUMBO.S */
8646    /*
8647     * Jumbo 32-bit SGET handler.
8648     *
8649     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8650     *      sget-char/jumbo, sget-short/jumbo
8651     */
8652    /* exop vBBBB, field@AAAAAAAA */
8653    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8654    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8655    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8656    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8657    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8658    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8659    cmp     r0, #0                      @ is resolved entry null?
8660    beq     .LOP_SGET_OBJECT_JUMBO_resolve         @ yes, do resolve
8661.LOP_SGET_OBJECT_JUMBO_finish: @ field ptr in r0
8662    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8663    @ no-op                             @ acquiring load
8664    FETCH(r2, 3)                        @ r2<- BBBB
8665    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8666    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8667    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8668    GOTO_OPCODE(ip)                     @ jump to next instruction
8669
8670
8671/* ------------------------------ */
8672    .balign 64
8673.L_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
8674/* File: armv5te/OP_SGET_BOOLEAN_JUMBO.S */
8675/* File: armv5te/OP_SGET_JUMBO.S */
8676    /*
8677     * Jumbo 32-bit SGET handler.
8678     *
8679     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8680     *      sget-char/jumbo, sget-short/jumbo
8681     */
8682    /* exop vBBBB, field@AAAAAAAA */
8683    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8684    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8685    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8686    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8687    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8688    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8689    cmp     r0, #0                      @ is resolved entry null?
8690    beq     .LOP_SGET_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8691.LOP_SGET_BOOLEAN_JUMBO_finish: @ field ptr in r0
8692    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8693    @ no-op                             @ acquiring load
8694    FETCH(r2, 3)                        @ r2<- BBBB
8695    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8696    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8697    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8698    GOTO_OPCODE(ip)                     @ jump to next instruction
8699
8700
8701/* ------------------------------ */
8702    .balign 64
8703.L_OP_SGET_BYTE_JUMBO: /* 0x118 */
8704/* File: armv5te/OP_SGET_BYTE_JUMBO.S */
8705/* File: armv5te/OP_SGET_JUMBO.S */
8706    /*
8707     * Jumbo 32-bit SGET handler.
8708     *
8709     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8710     *      sget-char/jumbo, sget-short/jumbo
8711     */
8712    /* exop vBBBB, field@AAAAAAAA */
8713    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8714    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8715    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8716    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8717    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8718    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8719    cmp     r0, #0                      @ is resolved entry null?
8720    beq     .LOP_SGET_BYTE_JUMBO_resolve         @ yes, do resolve
8721.LOP_SGET_BYTE_JUMBO_finish: @ field ptr in r0
8722    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8723    @ no-op                             @ acquiring load
8724    FETCH(r2, 3)                        @ r2<- BBBB
8725    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8726    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8727    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8728    GOTO_OPCODE(ip)                     @ jump to next instruction
8729
8730
8731/* ------------------------------ */
8732    .balign 64
8733.L_OP_SGET_CHAR_JUMBO: /* 0x119 */
8734/* File: armv5te/OP_SGET_CHAR_JUMBO.S */
8735/* File: armv5te/OP_SGET_JUMBO.S */
8736    /*
8737     * Jumbo 32-bit SGET handler.
8738     *
8739     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8740     *      sget-char/jumbo, sget-short/jumbo
8741     */
8742    /* exop vBBBB, field@AAAAAAAA */
8743    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8744    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8745    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8746    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8747    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8748    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8749    cmp     r0, #0                      @ is resolved entry null?
8750    beq     .LOP_SGET_CHAR_JUMBO_resolve         @ yes, do resolve
8751.LOP_SGET_CHAR_JUMBO_finish: @ field ptr in r0
8752    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8753    @ no-op                             @ acquiring load
8754    FETCH(r2, 3)                        @ r2<- BBBB
8755    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8756    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8757    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8758    GOTO_OPCODE(ip)                     @ jump to next instruction
8759
8760
8761/* ------------------------------ */
8762    .balign 64
8763.L_OP_SGET_SHORT_JUMBO: /* 0x11a */
8764/* File: armv5te/OP_SGET_SHORT_JUMBO.S */
8765/* File: armv5te/OP_SGET_JUMBO.S */
8766    /*
8767     * Jumbo 32-bit SGET handler.
8768     *
8769     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8770     *      sget-char/jumbo, sget-short/jumbo
8771     */
8772    /* exop vBBBB, field@AAAAAAAA */
8773    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8774    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8775    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8776    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8777    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8778    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8779    cmp     r0, #0                      @ is resolved entry null?
8780    beq     .LOP_SGET_SHORT_JUMBO_resolve         @ yes, do resolve
8781.LOP_SGET_SHORT_JUMBO_finish: @ field ptr in r0
8782    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8783    @ no-op                             @ acquiring load
8784    FETCH(r2, 3)                        @ r2<- BBBB
8785    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8786    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8787    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8788    GOTO_OPCODE(ip)                     @ jump to next instruction
8789
8790
8791/* ------------------------------ */
8792    .balign 64
8793.L_OP_SPUT_JUMBO: /* 0x11b */
8794/* File: armv5te/OP_SPUT_JUMBO.S */
8795    /*
8796     * Jumbo 32-bit SPUT handler.
8797     *
8798     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8799     *      sput-short/jumbo
8800     */
8801    /* exop vBBBB, field@AAAAAAAA */
8802    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8803    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8804    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8805    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8806    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8807    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8808    cmp     r0, #0                      @ is resolved entry null?
8809    beq     .LOP_SPUT_JUMBO_resolve         @ yes, do resolve
8810.LOP_SPUT_JUMBO_finish:   @ field ptr in r0
8811    FETCH(r2, 3)                        @ r2<- BBBB
8812    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8813    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8814    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8815    @ no-op                        @ releasing store
8816    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8817    @ no-op
8818    GOTO_OPCODE(ip)                     @ jump to next instruction
8819
8820/* ------------------------------ */
8821    .balign 64
8822.L_OP_SPUT_WIDE_JUMBO: /* 0x11c */
8823/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
8824    /*
8825     * Jumbo 64-bit SPUT handler.
8826     */
8827    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
8828    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
8829    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8830    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8831    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8832    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8833    FETCH(r9, 3)                        @ r9<- BBBB
8834    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
8835    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8836    cmp     r2, #0                      @ is resolved entry null?
8837    beq     .LOP_SPUT_WIDE_JUMBO_resolve         @ yes, do resolve
8838.LOP_SPUT_WIDE_JUMBO_finish: @ field ptr in r2, BBBB in r9
8839    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8840    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
8841    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8842    .if 0
8843    add     r2, r2, #offStaticField_value @ r2<- pointer to data
8844    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
8845    .else
8846    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
8847    .endif
8848    GOTO_OPCODE(r10)                    @ jump to next instruction
8849
8850/* ------------------------------ */
8851    .balign 64
8852.L_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
8853/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
8854    /*
8855     * Jumbo 32-bit SPUT handler for objects
8856     */
8857    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
8858    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8859    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8860    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8861    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8862    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8863    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8864    cmp     r0, #0                      @ is resolved entry null?
8865    beq     .LOP_SPUT_OBJECT_JUMBO_resolve         @ yes, do resolve
8866.LOP_SPUT_OBJECT_JUMBO_finish:   @ field ptr in r0
8867    FETCH(r2, 3)                        @ r2<- BBBB
8868    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8869    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8870    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8871    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
8872    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8873    @ no-op                         @ releasing store
8874    b       .LOP_SPUT_OBJECT_JUMBO_end
8875
8876/* ------------------------------ */
8877    .balign 64
8878.L_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
8879/* File: armv5te/OP_SPUT_BOOLEAN_JUMBO.S */
8880/* File: armv5te/OP_SPUT_JUMBO.S */
8881    /*
8882     * Jumbo 32-bit SPUT handler.
8883     *
8884     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8885     *      sput-short/jumbo
8886     */
8887    /* exop vBBBB, field@AAAAAAAA */
8888    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8889    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8890    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8891    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8892    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8893    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8894    cmp     r0, #0                      @ is resolved entry null?
8895    beq     .LOP_SPUT_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8896.LOP_SPUT_BOOLEAN_JUMBO_finish:   @ field ptr in r0
8897    FETCH(r2, 3)                        @ r2<- BBBB
8898    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8899    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8900    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8901    @ no-op                        @ releasing store
8902    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8903    @ no-op
8904    GOTO_OPCODE(ip)                     @ jump to next instruction
8905
8906
8907/* ------------------------------ */
8908    .balign 64
8909.L_OP_SPUT_BYTE_JUMBO: /* 0x11f */
8910/* File: armv5te/OP_SPUT_BYTE_JUMBO.S */
8911/* File: armv5te/OP_SPUT_JUMBO.S */
8912    /*
8913     * Jumbo 32-bit SPUT handler.
8914     *
8915     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8916     *      sput-short/jumbo
8917     */
8918    /* exop vBBBB, field@AAAAAAAA */
8919    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8920    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8921    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8922    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8923    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8924    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8925    cmp     r0, #0                      @ is resolved entry null?
8926    beq     .LOP_SPUT_BYTE_JUMBO_resolve         @ yes, do resolve
8927.LOP_SPUT_BYTE_JUMBO_finish:   @ field ptr in r0
8928    FETCH(r2, 3)                        @ r2<- BBBB
8929    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8930    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8931    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8932    @ no-op                        @ releasing store
8933    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8934    @ no-op
8935    GOTO_OPCODE(ip)                     @ jump to next instruction
8936
8937
8938/* ------------------------------ */
8939    .balign 64
8940.L_OP_SPUT_CHAR_JUMBO: /* 0x120 */
8941/* File: armv5te/OP_SPUT_CHAR_JUMBO.S */
8942/* File: armv5te/OP_SPUT_JUMBO.S */
8943    /*
8944     * Jumbo 32-bit SPUT handler.
8945     *
8946     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8947     *      sput-short/jumbo
8948     */
8949    /* exop vBBBB, field@AAAAAAAA */
8950    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8951    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8952    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8953    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8954    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8955    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8956    cmp     r0, #0                      @ is resolved entry null?
8957    beq     .LOP_SPUT_CHAR_JUMBO_resolve         @ yes, do resolve
8958.LOP_SPUT_CHAR_JUMBO_finish:   @ field ptr in r0
8959    FETCH(r2, 3)                        @ r2<- BBBB
8960    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8961    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8962    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8963    @ no-op                        @ releasing store
8964    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8965    @ no-op
8966    GOTO_OPCODE(ip)                     @ jump to next instruction
8967
8968
8969/* ------------------------------ */
8970    .balign 64
8971.L_OP_SPUT_SHORT_JUMBO: /* 0x121 */
8972/* File: armv5te/OP_SPUT_SHORT_JUMBO.S */
8973/* File: armv5te/OP_SPUT_JUMBO.S */
8974    /*
8975     * Jumbo 32-bit SPUT handler.
8976     *
8977     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8978     *      sput-short/jumbo
8979     */
8980    /* exop vBBBB, field@AAAAAAAA */
8981    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8982    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8983    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8984    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8985    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8986    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8987    cmp     r0, #0                      @ is resolved entry null?
8988    beq     .LOP_SPUT_SHORT_JUMBO_resolve         @ yes, do resolve
8989.LOP_SPUT_SHORT_JUMBO_finish:   @ field ptr in r0
8990    FETCH(r2, 3)                        @ r2<- BBBB
8991    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8992    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8993    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8994    @ no-op                        @ releasing store
8995    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8996    @ no-op
8997    GOTO_OPCODE(ip)                     @ jump to next instruction
8998
8999
9000/* ------------------------------ */
9001    .balign 64
9002.L_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
9003/* File: armv5te/OP_INVOKE_VIRTUAL_JUMBO.S */
9004    /*
9005     * Handle a virtual method call.
9006     */
9007    /* invoke-virtual/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9008    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
9009    FETCH(r0, 1)                        @ r1<- aaaa (lo)
9010    FETCH(r1, 2)                        @ r1<- AAAA (hi)
9011    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
9012    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
9013    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
9014    cmp     r0, #0                      @ already resolved?
9015    EXPORT_PC()                         @ must export for invoke
9016    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ yes, continue on
9017    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
9018    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9019    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9020    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9021    cmp     r0, #0                      @ got null?
9022    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ no, continue
9023    b       common_exceptionThrown      @ yes, handle exception
9024
9025/* ------------------------------ */
9026    .balign 64
9027.L_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
9028/* File: armv5te/OP_INVOKE_SUPER_JUMBO.S */
9029    /*
9030     * Handle a "super" method call.
9031     */
9032    /* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9033    FETCH(r10, 4)                       @ r10<- CCCC
9034    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
9035    FETCH(r0, 1)                        @ r1<- aaaa (lo)
9036    FETCH(r1, 2)                        @ r1<- AAAA (hi)
9037    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
9038    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
9039    GET_VREG(r9, r10)                   @ r9<- "this" ptr
9040    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
9041    cmp     r9, #0                      @ null "this"?
9042    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
9043    beq     common_errNullObject        @ null "this", throw exception
9044    cmp     r0, #0                      @ already resolved?
9045    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
9046    EXPORT_PC()                         @ must export for invoke
9047    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ resolved, continue on
9048    b       .LOP_INVOKE_SUPER_JUMBO_resolve         @ do resolve now
9049
9050/* ------------------------------ */
9051    .balign 64
9052.L_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
9053/* File: armv5te/OP_INVOKE_DIRECT_JUMBO.S */
9054    /*
9055     * Handle a direct method call.
9056     *
9057     * (We could defer the "is 'this' pointer null" test to the common
9058     * method invocation code, and use a flag to indicate that static
9059     * calls don't count.  If we do this as part of copying the arguments
9060     * out we could avoiding loading the first arg twice.)
9061     *
9062     */
9063    /* invoke-direct/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9064    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
9065    FETCH(r0, 1)                        @ r1<- aaaa (lo)
9066    FETCH(r1, 2)                        @ r1<- AAAA (hi)
9067    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
9068    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
9069    FETCH(r10, 4)                       @ r10<- CCCC
9070    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
9071    cmp     r0, #0                      @ already resolved?
9072    EXPORT_PC()                         @ must export for invoke
9073    GET_VREG(r9, r10)                   @ r9<- "this" ptr
9074    beq     .LOP_INVOKE_DIRECT_JUMBO_resolve         @ not resolved, do it now
9075.LOP_INVOKE_DIRECT_JUMBO_finish:
9076    cmp     r9, #0                      @ null "this" ref?
9077    bne     common_invokeMethodJumbo    @ (r0=method, r9="this")
9078    b       common_errNullObject        @ yes, throw exception
9079
9080/* ------------------------------ */
9081    .balign 64
9082.L_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
9083/* File: armv5te/OP_INVOKE_STATIC_JUMBO.S */
9084    /*
9085     * Handle a static method call.
9086     */
9087    /* invoke-static/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9088    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
9089    FETCH(r0, 1)                        @ r1<- aaaa (lo)
9090    FETCH(r1, 2)                        @ r1<- AAAA (hi)
9091    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
9092    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
9093    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
9094#if defined(WITH_JIT)
9095    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
9096#endif
9097    cmp     r0, #0                      @ already resolved?
9098    EXPORT_PC()                         @ must export for invoke
9099    bne     common_invokeMethodJumboNoThis   @ (r0=method)
9100    b       .LOP_INVOKE_STATIC_JUMBO_resolve
9101
9102/* ------------------------------ */
9103    .balign 64
9104.L_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
9105/* File: armv5te/OP_INVOKE_INTERFACE_JUMBO.S */
9106    /*
9107     * Handle an interface method call.
9108     */
9109    /* invoke-interface/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9110    FETCH(r2, 4)                        @ r2<- CCCC
9111    FETCH(r0, 1)                        @ r0<- aaaa (lo)
9112    FETCH(r1, 2)                        @ r1<- AAAA (hi)
9113    EXPORT_PC()                         @ must export for invoke
9114    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
9115    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
9116    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
9117    cmp     r9, #0                      @ null obj?
9118    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
9119    beq     common_errNullObject        @ yes, fail
9120    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
9121    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
9122    cmp     r0, #0                      @ failed?
9123    beq     common_exceptionThrown      @ yes, handle exception
9124    b       common_invokeMethodJumbo    @ (r0=method, r9="this")
9125
9126/* ------------------------------ */
9127    .balign 64
9128.L_OP_UNUSED_27FF: /* 0x127 */
9129/* File: armv5te/OP_UNUSED_27FF.S */
9130/* File: armv5te/unused.S */
9131    bl      common_abort
9132
9133
9134/* ------------------------------ */
9135    .balign 64
9136.L_OP_UNUSED_28FF: /* 0x128 */
9137/* File: armv5te/OP_UNUSED_28FF.S */
9138/* File: armv5te/unused.S */
9139    bl      common_abort
9140
9141
9142/* ------------------------------ */
9143    .balign 64
9144.L_OP_UNUSED_29FF: /* 0x129 */
9145/* File: armv5te/OP_UNUSED_29FF.S */
9146/* File: armv5te/unused.S */
9147    bl      common_abort
9148
9149
9150/* ------------------------------ */
9151    .balign 64
9152.L_OP_UNUSED_2AFF: /* 0x12a */
9153/* File: armv5te/OP_UNUSED_2AFF.S */
9154/* File: armv5te/unused.S */
9155    bl      common_abort
9156
9157
9158/* ------------------------------ */
9159    .balign 64
9160.L_OP_UNUSED_2BFF: /* 0x12b */
9161/* File: armv5te/OP_UNUSED_2BFF.S */
9162/* File: armv5te/unused.S */
9163    bl      common_abort
9164
9165
9166/* ------------------------------ */
9167    .balign 64
9168.L_OP_UNUSED_2CFF: /* 0x12c */
9169/* File: armv5te/OP_UNUSED_2CFF.S */
9170/* File: armv5te/unused.S */
9171    bl      common_abort
9172
9173
9174/* ------------------------------ */
9175    .balign 64
9176.L_OP_UNUSED_2DFF: /* 0x12d */
9177/* File: armv5te/OP_UNUSED_2DFF.S */
9178/* File: armv5te/unused.S */
9179    bl      common_abort
9180
9181
9182/* ------------------------------ */
9183    .balign 64
9184.L_OP_UNUSED_2EFF: /* 0x12e */
9185/* File: armv5te/OP_UNUSED_2EFF.S */
9186/* File: armv5te/unused.S */
9187    bl      common_abort
9188
9189
9190/* ------------------------------ */
9191    .balign 64
9192.L_OP_UNUSED_2FFF: /* 0x12f */
9193/* File: armv5te/OP_UNUSED_2FFF.S */
9194/* File: armv5te/unused.S */
9195    bl      common_abort
9196
9197
9198/* ------------------------------ */
9199    .balign 64
9200.L_OP_UNUSED_30FF: /* 0x130 */
9201/* File: armv5te/OP_UNUSED_30FF.S */
9202/* File: armv5te/unused.S */
9203    bl      common_abort
9204
9205
9206/* ------------------------------ */
9207    .balign 64
9208.L_OP_UNUSED_31FF: /* 0x131 */
9209/* File: armv5te/OP_UNUSED_31FF.S */
9210/* File: armv5te/unused.S */
9211    bl      common_abort
9212
9213
9214/* ------------------------------ */
9215    .balign 64
9216.L_OP_UNUSED_32FF: /* 0x132 */
9217/* File: armv5te/OP_UNUSED_32FF.S */
9218/* File: armv5te/unused.S */
9219    bl      common_abort
9220
9221
9222/* ------------------------------ */
9223    .balign 64
9224.L_OP_UNUSED_33FF: /* 0x133 */
9225/* File: armv5te/OP_UNUSED_33FF.S */
9226/* File: armv5te/unused.S */
9227    bl      common_abort
9228
9229
9230/* ------------------------------ */
9231    .balign 64
9232.L_OP_UNUSED_34FF: /* 0x134 */
9233/* File: armv5te/OP_UNUSED_34FF.S */
9234/* File: armv5te/unused.S */
9235    bl      common_abort
9236
9237
9238/* ------------------------------ */
9239    .balign 64
9240.L_OP_UNUSED_35FF: /* 0x135 */
9241/* File: armv5te/OP_UNUSED_35FF.S */
9242/* File: armv5te/unused.S */
9243    bl      common_abort
9244
9245
9246/* ------------------------------ */
9247    .balign 64
9248.L_OP_UNUSED_36FF: /* 0x136 */
9249/* File: armv5te/OP_UNUSED_36FF.S */
9250/* File: armv5te/unused.S */
9251    bl      common_abort
9252
9253
9254/* ------------------------------ */
9255    .balign 64
9256.L_OP_UNUSED_37FF: /* 0x137 */
9257/* File: armv5te/OP_UNUSED_37FF.S */
9258/* File: armv5te/unused.S */
9259    bl      common_abort
9260
9261
9262/* ------------------------------ */
9263    .balign 64
9264.L_OP_UNUSED_38FF: /* 0x138 */
9265/* File: armv5te/OP_UNUSED_38FF.S */
9266/* File: armv5te/unused.S */
9267    bl      common_abort
9268
9269
9270/* ------------------------------ */
9271    .balign 64
9272.L_OP_UNUSED_39FF: /* 0x139 */
9273/* File: armv5te/OP_UNUSED_39FF.S */
9274/* File: armv5te/unused.S */
9275    bl      common_abort
9276
9277
9278/* ------------------------------ */
9279    .balign 64
9280.L_OP_UNUSED_3AFF: /* 0x13a */
9281/* File: armv5te/OP_UNUSED_3AFF.S */
9282/* File: armv5te/unused.S */
9283    bl      common_abort
9284
9285
9286/* ------------------------------ */
9287    .balign 64
9288.L_OP_UNUSED_3BFF: /* 0x13b */
9289/* File: armv5te/OP_UNUSED_3BFF.S */
9290/* File: armv5te/unused.S */
9291    bl      common_abort
9292
9293
9294/* ------------------------------ */
9295    .balign 64
9296.L_OP_UNUSED_3CFF: /* 0x13c */
9297/* File: armv5te/OP_UNUSED_3CFF.S */
9298/* File: armv5te/unused.S */
9299    bl      common_abort
9300
9301
9302/* ------------------------------ */
9303    .balign 64
9304.L_OP_UNUSED_3DFF: /* 0x13d */
9305/* File: armv5te/OP_UNUSED_3DFF.S */
9306/* File: armv5te/unused.S */
9307    bl      common_abort
9308
9309
9310/* ------------------------------ */
9311    .balign 64
9312.L_OP_UNUSED_3EFF: /* 0x13e */
9313/* File: armv5te/OP_UNUSED_3EFF.S */
9314/* File: armv5te/unused.S */
9315    bl      common_abort
9316
9317
9318/* ------------------------------ */
9319    .balign 64
9320.L_OP_UNUSED_3FFF: /* 0x13f */
9321/* File: armv5te/OP_UNUSED_3FFF.S */
9322/* File: armv5te/unused.S */
9323    bl      common_abort
9324
9325
9326/* ------------------------------ */
9327    .balign 64
9328.L_OP_UNUSED_40FF: /* 0x140 */
9329/* File: armv5te/OP_UNUSED_40FF.S */
9330/* File: armv5te/unused.S */
9331    bl      common_abort
9332
9333
9334/* ------------------------------ */
9335    .balign 64
9336.L_OP_UNUSED_41FF: /* 0x141 */
9337/* File: armv5te/OP_UNUSED_41FF.S */
9338/* File: armv5te/unused.S */
9339    bl      common_abort
9340
9341
9342/* ------------------------------ */
9343    .balign 64
9344.L_OP_UNUSED_42FF: /* 0x142 */
9345/* File: armv5te/OP_UNUSED_42FF.S */
9346/* File: armv5te/unused.S */
9347    bl      common_abort
9348
9349
9350/* ------------------------------ */
9351    .balign 64
9352.L_OP_UNUSED_43FF: /* 0x143 */
9353/* File: armv5te/OP_UNUSED_43FF.S */
9354/* File: armv5te/unused.S */
9355    bl      common_abort
9356
9357
9358/* ------------------------------ */
9359    .balign 64
9360.L_OP_UNUSED_44FF: /* 0x144 */
9361/* File: armv5te/OP_UNUSED_44FF.S */
9362/* File: armv5te/unused.S */
9363    bl      common_abort
9364
9365
9366/* ------------------------------ */
9367    .balign 64
9368.L_OP_UNUSED_45FF: /* 0x145 */
9369/* File: armv5te/OP_UNUSED_45FF.S */
9370/* File: armv5te/unused.S */
9371    bl      common_abort
9372
9373
9374/* ------------------------------ */
9375    .balign 64
9376.L_OP_UNUSED_46FF: /* 0x146 */
9377/* File: armv5te/OP_UNUSED_46FF.S */
9378/* File: armv5te/unused.S */
9379    bl      common_abort
9380
9381
9382/* ------------------------------ */
9383    .balign 64
9384.L_OP_UNUSED_47FF: /* 0x147 */
9385/* File: armv5te/OP_UNUSED_47FF.S */
9386/* File: armv5te/unused.S */
9387    bl      common_abort
9388
9389
9390/* ------------------------------ */
9391    .balign 64
9392.L_OP_UNUSED_48FF: /* 0x148 */
9393/* File: armv5te/OP_UNUSED_48FF.S */
9394/* File: armv5te/unused.S */
9395    bl      common_abort
9396
9397
9398/* ------------------------------ */
9399    .balign 64
9400.L_OP_UNUSED_49FF: /* 0x149 */
9401/* File: armv5te/OP_UNUSED_49FF.S */
9402/* File: armv5te/unused.S */
9403    bl      common_abort
9404
9405
9406/* ------------------------------ */
9407    .balign 64
9408.L_OP_UNUSED_4AFF: /* 0x14a */
9409/* File: armv5te/OP_UNUSED_4AFF.S */
9410/* File: armv5te/unused.S */
9411    bl      common_abort
9412
9413
9414/* ------------------------------ */
9415    .balign 64
9416.L_OP_UNUSED_4BFF: /* 0x14b */
9417/* File: armv5te/OP_UNUSED_4BFF.S */
9418/* File: armv5te/unused.S */
9419    bl      common_abort
9420
9421
9422/* ------------------------------ */
9423    .balign 64
9424.L_OP_UNUSED_4CFF: /* 0x14c */
9425/* File: armv5te/OP_UNUSED_4CFF.S */
9426/* File: armv5te/unused.S */
9427    bl      common_abort
9428
9429
9430/* ------------------------------ */
9431    .balign 64
9432.L_OP_UNUSED_4DFF: /* 0x14d */
9433/* File: armv5te/OP_UNUSED_4DFF.S */
9434/* File: armv5te/unused.S */
9435    bl      common_abort
9436
9437
9438/* ------------------------------ */
9439    .balign 64
9440.L_OP_UNUSED_4EFF: /* 0x14e */
9441/* File: armv5te/OP_UNUSED_4EFF.S */
9442/* File: armv5te/unused.S */
9443    bl      common_abort
9444
9445
9446/* ------------------------------ */
9447    .balign 64
9448.L_OP_UNUSED_4FFF: /* 0x14f */
9449/* File: armv5te/OP_UNUSED_4FFF.S */
9450/* File: armv5te/unused.S */
9451    bl      common_abort
9452
9453
9454/* ------------------------------ */
9455    .balign 64
9456.L_OP_UNUSED_50FF: /* 0x150 */
9457/* File: armv5te/OP_UNUSED_50FF.S */
9458/* File: armv5te/unused.S */
9459    bl      common_abort
9460
9461
9462/* ------------------------------ */
9463    .balign 64
9464.L_OP_UNUSED_51FF: /* 0x151 */
9465/* File: armv5te/OP_UNUSED_51FF.S */
9466/* File: armv5te/unused.S */
9467    bl      common_abort
9468
9469
9470/* ------------------------------ */
9471    .balign 64
9472.L_OP_UNUSED_52FF: /* 0x152 */
9473/* File: armv5te/OP_UNUSED_52FF.S */
9474/* File: armv5te/unused.S */
9475    bl      common_abort
9476
9477
9478/* ------------------------------ */
9479    .balign 64
9480.L_OP_UNUSED_53FF: /* 0x153 */
9481/* File: armv5te/OP_UNUSED_53FF.S */
9482/* File: armv5te/unused.S */
9483    bl      common_abort
9484
9485
9486/* ------------------------------ */
9487    .balign 64
9488.L_OP_UNUSED_54FF: /* 0x154 */
9489/* File: armv5te/OP_UNUSED_54FF.S */
9490/* File: armv5te/unused.S */
9491    bl      common_abort
9492
9493
9494/* ------------------------------ */
9495    .balign 64
9496.L_OP_UNUSED_55FF: /* 0x155 */
9497/* File: armv5te/OP_UNUSED_55FF.S */
9498/* File: armv5te/unused.S */
9499    bl      common_abort
9500
9501
9502/* ------------------------------ */
9503    .balign 64
9504.L_OP_UNUSED_56FF: /* 0x156 */
9505/* File: armv5te/OP_UNUSED_56FF.S */
9506/* File: armv5te/unused.S */
9507    bl      common_abort
9508
9509
9510/* ------------------------------ */
9511    .balign 64
9512.L_OP_UNUSED_57FF: /* 0x157 */
9513/* File: armv5te/OP_UNUSED_57FF.S */
9514/* File: armv5te/unused.S */
9515    bl      common_abort
9516
9517
9518/* ------------------------------ */
9519    .balign 64
9520.L_OP_UNUSED_58FF: /* 0x158 */
9521/* File: armv5te/OP_UNUSED_58FF.S */
9522/* File: armv5te/unused.S */
9523    bl      common_abort
9524
9525
9526/* ------------------------------ */
9527    .balign 64
9528.L_OP_UNUSED_59FF: /* 0x159 */
9529/* File: armv5te/OP_UNUSED_59FF.S */
9530/* File: armv5te/unused.S */
9531    bl      common_abort
9532
9533
9534/* ------------------------------ */
9535    .balign 64
9536.L_OP_UNUSED_5AFF: /* 0x15a */
9537/* File: armv5te/OP_UNUSED_5AFF.S */
9538/* File: armv5te/unused.S */
9539    bl      common_abort
9540
9541
9542/* ------------------------------ */
9543    .balign 64
9544.L_OP_UNUSED_5BFF: /* 0x15b */
9545/* File: armv5te/OP_UNUSED_5BFF.S */
9546/* File: armv5te/unused.S */
9547    bl      common_abort
9548
9549
9550/* ------------------------------ */
9551    .balign 64
9552.L_OP_UNUSED_5CFF: /* 0x15c */
9553/* File: armv5te/OP_UNUSED_5CFF.S */
9554/* File: armv5te/unused.S */
9555    bl      common_abort
9556
9557
9558/* ------------------------------ */
9559    .balign 64
9560.L_OP_UNUSED_5DFF: /* 0x15d */
9561/* File: armv5te/OP_UNUSED_5DFF.S */
9562/* File: armv5te/unused.S */
9563    bl      common_abort
9564
9565
9566/* ------------------------------ */
9567    .balign 64
9568.L_OP_UNUSED_5EFF: /* 0x15e */
9569/* File: armv5te/OP_UNUSED_5EFF.S */
9570/* File: armv5te/unused.S */
9571    bl      common_abort
9572
9573
9574/* ------------------------------ */
9575    .balign 64
9576.L_OP_UNUSED_5FFF: /* 0x15f */
9577/* File: armv5te/OP_UNUSED_5FFF.S */
9578/* File: armv5te/unused.S */
9579    bl      common_abort
9580
9581
9582/* ------------------------------ */
9583    .balign 64
9584.L_OP_UNUSED_60FF: /* 0x160 */
9585/* File: armv5te/OP_UNUSED_60FF.S */
9586/* File: armv5te/unused.S */
9587    bl      common_abort
9588
9589
9590/* ------------------------------ */
9591    .balign 64
9592.L_OP_UNUSED_61FF: /* 0x161 */
9593/* File: armv5te/OP_UNUSED_61FF.S */
9594/* File: armv5te/unused.S */
9595    bl      common_abort
9596
9597
9598/* ------------------------------ */
9599    .balign 64
9600.L_OP_UNUSED_62FF: /* 0x162 */
9601/* File: armv5te/OP_UNUSED_62FF.S */
9602/* File: armv5te/unused.S */
9603    bl      common_abort
9604
9605
9606/* ------------------------------ */
9607    .balign 64
9608.L_OP_UNUSED_63FF: /* 0x163 */
9609/* File: armv5te/OP_UNUSED_63FF.S */
9610/* File: armv5te/unused.S */
9611    bl      common_abort
9612
9613
9614/* ------------------------------ */
9615    .balign 64
9616.L_OP_UNUSED_64FF: /* 0x164 */
9617/* File: armv5te/OP_UNUSED_64FF.S */
9618/* File: armv5te/unused.S */
9619    bl      common_abort
9620
9621
9622/* ------------------------------ */
9623    .balign 64
9624.L_OP_UNUSED_65FF: /* 0x165 */
9625/* File: armv5te/OP_UNUSED_65FF.S */
9626/* File: armv5te/unused.S */
9627    bl      common_abort
9628
9629
9630/* ------------------------------ */
9631    .balign 64
9632.L_OP_UNUSED_66FF: /* 0x166 */
9633/* File: armv5te/OP_UNUSED_66FF.S */
9634/* File: armv5te/unused.S */
9635    bl      common_abort
9636
9637
9638/* ------------------------------ */
9639    .balign 64
9640.L_OP_UNUSED_67FF: /* 0x167 */
9641/* File: armv5te/OP_UNUSED_67FF.S */
9642/* File: armv5te/unused.S */
9643    bl      common_abort
9644
9645
9646/* ------------------------------ */
9647    .balign 64
9648.L_OP_UNUSED_68FF: /* 0x168 */
9649/* File: armv5te/OP_UNUSED_68FF.S */
9650/* File: armv5te/unused.S */
9651    bl      common_abort
9652
9653
9654/* ------------------------------ */
9655    .balign 64
9656.L_OP_UNUSED_69FF: /* 0x169 */
9657/* File: armv5te/OP_UNUSED_69FF.S */
9658/* File: armv5te/unused.S */
9659    bl      common_abort
9660
9661
9662/* ------------------------------ */
9663    .balign 64
9664.L_OP_UNUSED_6AFF: /* 0x16a */
9665/* File: armv5te/OP_UNUSED_6AFF.S */
9666/* File: armv5te/unused.S */
9667    bl      common_abort
9668
9669
9670/* ------------------------------ */
9671    .balign 64
9672.L_OP_UNUSED_6BFF: /* 0x16b */
9673/* File: armv5te/OP_UNUSED_6BFF.S */
9674/* File: armv5te/unused.S */
9675    bl      common_abort
9676
9677
9678/* ------------------------------ */
9679    .balign 64
9680.L_OP_UNUSED_6CFF: /* 0x16c */
9681/* File: armv5te/OP_UNUSED_6CFF.S */
9682/* File: armv5te/unused.S */
9683    bl      common_abort
9684
9685
9686/* ------------------------------ */
9687    .balign 64
9688.L_OP_UNUSED_6DFF: /* 0x16d */
9689/* File: armv5te/OP_UNUSED_6DFF.S */
9690/* File: armv5te/unused.S */
9691    bl      common_abort
9692
9693
9694/* ------------------------------ */
9695    .balign 64
9696.L_OP_UNUSED_6EFF: /* 0x16e */
9697/* File: armv5te/OP_UNUSED_6EFF.S */
9698/* File: armv5te/unused.S */
9699    bl      common_abort
9700
9701
9702/* ------------------------------ */
9703    .balign 64
9704.L_OP_UNUSED_6FFF: /* 0x16f */
9705/* File: armv5te/OP_UNUSED_6FFF.S */
9706/* File: armv5te/unused.S */
9707    bl      common_abort
9708
9709
9710/* ------------------------------ */
9711    .balign 64
9712.L_OP_UNUSED_70FF: /* 0x170 */
9713/* File: armv5te/OP_UNUSED_70FF.S */
9714/* File: armv5te/unused.S */
9715    bl      common_abort
9716
9717
9718/* ------------------------------ */
9719    .balign 64
9720.L_OP_UNUSED_71FF: /* 0x171 */
9721/* File: armv5te/OP_UNUSED_71FF.S */
9722/* File: armv5te/unused.S */
9723    bl      common_abort
9724
9725
9726/* ------------------------------ */
9727    .balign 64
9728.L_OP_UNUSED_72FF: /* 0x172 */
9729/* File: armv5te/OP_UNUSED_72FF.S */
9730/* File: armv5te/unused.S */
9731    bl      common_abort
9732
9733
9734/* ------------------------------ */
9735    .balign 64
9736.L_OP_UNUSED_73FF: /* 0x173 */
9737/* File: armv5te/OP_UNUSED_73FF.S */
9738/* File: armv5te/unused.S */
9739    bl      common_abort
9740
9741
9742/* ------------------------------ */
9743    .balign 64
9744.L_OP_UNUSED_74FF: /* 0x174 */
9745/* File: armv5te/OP_UNUSED_74FF.S */
9746/* File: armv5te/unused.S */
9747    bl      common_abort
9748
9749
9750/* ------------------------------ */
9751    .balign 64
9752.L_OP_UNUSED_75FF: /* 0x175 */
9753/* File: armv5te/OP_UNUSED_75FF.S */
9754/* File: armv5te/unused.S */
9755    bl      common_abort
9756
9757
9758/* ------------------------------ */
9759    .balign 64
9760.L_OP_UNUSED_76FF: /* 0x176 */
9761/* File: armv5te/OP_UNUSED_76FF.S */
9762/* File: armv5te/unused.S */
9763    bl      common_abort
9764
9765
9766/* ------------------------------ */
9767    .balign 64
9768.L_OP_UNUSED_77FF: /* 0x177 */
9769/* File: armv5te/OP_UNUSED_77FF.S */
9770/* File: armv5te/unused.S */
9771    bl      common_abort
9772
9773
9774/* ------------------------------ */
9775    .balign 64
9776.L_OP_UNUSED_78FF: /* 0x178 */
9777/* File: armv5te/OP_UNUSED_78FF.S */
9778/* File: armv5te/unused.S */
9779    bl      common_abort
9780
9781
9782/* ------------------------------ */
9783    .balign 64
9784.L_OP_UNUSED_79FF: /* 0x179 */
9785/* File: armv5te/OP_UNUSED_79FF.S */
9786/* File: armv5te/unused.S */
9787    bl      common_abort
9788
9789
9790/* ------------------------------ */
9791    .balign 64
9792.L_OP_UNUSED_7AFF: /* 0x17a */
9793/* File: armv5te/OP_UNUSED_7AFF.S */
9794/* File: armv5te/unused.S */
9795    bl      common_abort
9796
9797
9798/* ------------------------------ */
9799    .balign 64
9800.L_OP_UNUSED_7BFF: /* 0x17b */
9801/* File: armv5te/OP_UNUSED_7BFF.S */
9802/* File: armv5te/unused.S */
9803    bl      common_abort
9804
9805
9806/* ------------------------------ */
9807    .balign 64
9808.L_OP_UNUSED_7CFF: /* 0x17c */
9809/* File: armv5te/OP_UNUSED_7CFF.S */
9810/* File: armv5te/unused.S */
9811    bl      common_abort
9812
9813
9814/* ------------------------------ */
9815    .balign 64
9816.L_OP_UNUSED_7DFF: /* 0x17d */
9817/* File: armv5te/OP_UNUSED_7DFF.S */
9818/* File: armv5te/unused.S */
9819    bl      common_abort
9820
9821
9822/* ------------------------------ */
9823    .balign 64
9824.L_OP_UNUSED_7EFF: /* 0x17e */
9825/* File: armv5te/OP_UNUSED_7EFF.S */
9826/* File: armv5te/unused.S */
9827    bl      common_abort
9828
9829
9830/* ------------------------------ */
9831    .balign 64
9832.L_OP_UNUSED_7FFF: /* 0x17f */
9833/* File: armv5te/OP_UNUSED_7FFF.S */
9834/* File: armv5te/unused.S */
9835    bl      common_abort
9836
9837
9838/* ------------------------------ */
9839    .balign 64
9840.L_OP_UNUSED_80FF: /* 0x180 */
9841/* File: armv5te/OP_UNUSED_80FF.S */
9842/* File: armv5te/unused.S */
9843    bl      common_abort
9844
9845
9846/* ------------------------------ */
9847    .balign 64
9848.L_OP_UNUSED_81FF: /* 0x181 */
9849/* File: armv5te/OP_UNUSED_81FF.S */
9850/* File: armv5te/unused.S */
9851    bl      common_abort
9852
9853
9854/* ------------------------------ */
9855    .balign 64
9856.L_OP_UNUSED_82FF: /* 0x182 */
9857/* File: armv5te/OP_UNUSED_82FF.S */
9858/* File: armv5te/unused.S */
9859    bl      common_abort
9860
9861
9862/* ------------------------------ */
9863    .balign 64
9864.L_OP_UNUSED_83FF: /* 0x183 */
9865/* File: armv5te/OP_UNUSED_83FF.S */
9866/* File: armv5te/unused.S */
9867    bl      common_abort
9868
9869
9870/* ------------------------------ */
9871    .balign 64
9872.L_OP_UNUSED_84FF: /* 0x184 */
9873/* File: armv5te/OP_UNUSED_84FF.S */
9874/* File: armv5te/unused.S */
9875    bl      common_abort
9876
9877
9878/* ------------------------------ */
9879    .balign 64
9880.L_OP_UNUSED_85FF: /* 0x185 */
9881/* File: armv5te/OP_UNUSED_85FF.S */
9882/* File: armv5te/unused.S */
9883    bl      common_abort
9884
9885
9886/* ------------------------------ */
9887    .balign 64
9888.L_OP_UNUSED_86FF: /* 0x186 */
9889/* File: armv5te/OP_UNUSED_86FF.S */
9890/* File: armv5te/unused.S */
9891    bl      common_abort
9892
9893
9894/* ------------------------------ */
9895    .balign 64
9896.L_OP_UNUSED_87FF: /* 0x187 */
9897/* File: armv5te/OP_UNUSED_87FF.S */
9898/* File: armv5te/unused.S */
9899    bl      common_abort
9900
9901
9902/* ------------------------------ */
9903    .balign 64
9904.L_OP_UNUSED_88FF: /* 0x188 */
9905/* File: armv5te/OP_UNUSED_88FF.S */
9906/* File: armv5te/unused.S */
9907    bl      common_abort
9908
9909
9910/* ------------------------------ */
9911    .balign 64
9912.L_OP_UNUSED_89FF: /* 0x189 */
9913/* File: armv5te/OP_UNUSED_89FF.S */
9914/* File: armv5te/unused.S */
9915    bl      common_abort
9916
9917
9918/* ------------------------------ */
9919    .balign 64
9920.L_OP_UNUSED_8AFF: /* 0x18a */
9921/* File: armv5te/OP_UNUSED_8AFF.S */
9922/* File: armv5te/unused.S */
9923    bl      common_abort
9924
9925
9926/* ------------------------------ */
9927    .balign 64
9928.L_OP_UNUSED_8BFF: /* 0x18b */
9929/* File: armv5te/OP_UNUSED_8BFF.S */
9930/* File: armv5te/unused.S */
9931    bl      common_abort
9932
9933
9934/* ------------------------------ */
9935    .balign 64
9936.L_OP_UNUSED_8CFF: /* 0x18c */
9937/* File: armv5te/OP_UNUSED_8CFF.S */
9938/* File: armv5te/unused.S */
9939    bl      common_abort
9940
9941
9942/* ------------------------------ */
9943    .balign 64
9944.L_OP_UNUSED_8DFF: /* 0x18d */
9945/* File: armv5te/OP_UNUSED_8DFF.S */
9946/* File: armv5te/unused.S */
9947    bl      common_abort
9948
9949
9950/* ------------------------------ */
9951    .balign 64
9952.L_OP_UNUSED_8EFF: /* 0x18e */
9953/* File: armv5te/OP_UNUSED_8EFF.S */
9954/* File: armv5te/unused.S */
9955    bl      common_abort
9956
9957
9958/* ------------------------------ */
9959    .balign 64
9960.L_OP_UNUSED_8FFF: /* 0x18f */
9961/* File: armv5te/OP_UNUSED_8FFF.S */
9962/* File: armv5te/unused.S */
9963    bl      common_abort
9964
9965
9966/* ------------------------------ */
9967    .balign 64
9968.L_OP_UNUSED_90FF: /* 0x190 */
9969/* File: armv5te/OP_UNUSED_90FF.S */
9970/* File: armv5te/unused.S */
9971    bl      common_abort
9972
9973
9974/* ------------------------------ */
9975    .balign 64
9976.L_OP_UNUSED_91FF: /* 0x191 */
9977/* File: armv5te/OP_UNUSED_91FF.S */
9978/* File: armv5te/unused.S */
9979    bl      common_abort
9980
9981
9982/* ------------------------------ */
9983    .balign 64
9984.L_OP_UNUSED_92FF: /* 0x192 */
9985/* File: armv5te/OP_UNUSED_92FF.S */
9986/* File: armv5te/unused.S */
9987    bl      common_abort
9988
9989
9990/* ------------------------------ */
9991    .balign 64
9992.L_OP_UNUSED_93FF: /* 0x193 */
9993/* File: armv5te/OP_UNUSED_93FF.S */
9994/* File: armv5te/unused.S */
9995    bl      common_abort
9996
9997
9998/* ------------------------------ */
9999    .balign 64
10000.L_OP_UNUSED_94FF: /* 0x194 */
10001/* File: armv5te/OP_UNUSED_94FF.S */
10002/* File: armv5te/unused.S */
10003    bl      common_abort
10004
10005
10006/* ------------------------------ */
10007    .balign 64
10008.L_OP_UNUSED_95FF: /* 0x195 */
10009/* File: armv5te/OP_UNUSED_95FF.S */
10010/* File: armv5te/unused.S */
10011    bl      common_abort
10012
10013
10014/* ------------------------------ */
10015    .balign 64
10016.L_OP_UNUSED_96FF: /* 0x196 */
10017/* File: armv5te/OP_UNUSED_96FF.S */
10018/* File: armv5te/unused.S */
10019    bl      common_abort
10020
10021
10022/* ------------------------------ */
10023    .balign 64
10024.L_OP_UNUSED_97FF: /* 0x197 */
10025/* File: armv5te/OP_UNUSED_97FF.S */
10026/* File: armv5te/unused.S */
10027    bl      common_abort
10028
10029
10030/* ------------------------------ */
10031    .balign 64
10032.L_OP_UNUSED_98FF: /* 0x198 */
10033/* File: armv5te/OP_UNUSED_98FF.S */
10034/* File: armv5te/unused.S */
10035    bl      common_abort
10036
10037
10038/* ------------------------------ */
10039    .balign 64
10040.L_OP_UNUSED_99FF: /* 0x199 */
10041/* File: armv5te/OP_UNUSED_99FF.S */
10042/* File: armv5te/unused.S */
10043    bl      common_abort
10044
10045
10046/* ------------------------------ */
10047    .balign 64
10048.L_OP_UNUSED_9AFF: /* 0x19a */
10049/* File: armv5te/OP_UNUSED_9AFF.S */
10050/* File: armv5te/unused.S */
10051    bl      common_abort
10052
10053
10054/* ------------------------------ */
10055    .balign 64
10056.L_OP_UNUSED_9BFF: /* 0x19b */
10057/* File: armv5te/OP_UNUSED_9BFF.S */
10058/* File: armv5te/unused.S */
10059    bl      common_abort
10060
10061
10062/* ------------------------------ */
10063    .balign 64
10064.L_OP_UNUSED_9CFF: /* 0x19c */
10065/* File: armv5te/OP_UNUSED_9CFF.S */
10066/* File: armv5te/unused.S */
10067    bl      common_abort
10068
10069
10070/* ------------------------------ */
10071    .balign 64
10072.L_OP_UNUSED_9DFF: /* 0x19d */
10073/* File: armv5te/OP_UNUSED_9DFF.S */
10074/* File: armv5te/unused.S */
10075    bl      common_abort
10076
10077
10078/* ------------------------------ */
10079    .balign 64
10080.L_OP_UNUSED_9EFF: /* 0x19e */
10081/* File: armv5te/OP_UNUSED_9EFF.S */
10082/* File: armv5te/unused.S */
10083    bl      common_abort
10084
10085
10086/* ------------------------------ */
10087    .balign 64
10088.L_OP_UNUSED_9FFF: /* 0x19f */
10089/* File: armv5te/OP_UNUSED_9FFF.S */
10090/* File: armv5te/unused.S */
10091    bl      common_abort
10092
10093
10094/* ------------------------------ */
10095    .balign 64
10096.L_OP_UNUSED_A0FF: /* 0x1a0 */
10097/* File: armv5te/OP_UNUSED_A0FF.S */
10098/* File: armv5te/unused.S */
10099    bl      common_abort
10100
10101
10102/* ------------------------------ */
10103    .balign 64
10104.L_OP_UNUSED_A1FF: /* 0x1a1 */
10105/* File: armv5te/OP_UNUSED_A1FF.S */
10106/* File: armv5te/unused.S */
10107    bl      common_abort
10108
10109
10110/* ------------------------------ */
10111    .balign 64
10112.L_OP_UNUSED_A2FF: /* 0x1a2 */
10113/* File: armv5te/OP_UNUSED_A2FF.S */
10114/* File: armv5te/unused.S */
10115    bl      common_abort
10116
10117
10118/* ------------------------------ */
10119    .balign 64
10120.L_OP_UNUSED_A3FF: /* 0x1a3 */
10121/* File: armv5te/OP_UNUSED_A3FF.S */
10122/* File: armv5te/unused.S */
10123    bl      common_abort
10124
10125
10126/* ------------------------------ */
10127    .balign 64
10128.L_OP_UNUSED_A4FF: /* 0x1a4 */
10129/* File: armv5te/OP_UNUSED_A4FF.S */
10130/* File: armv5te/unused.S */
10131    bl      common_abort
10132
10133
10134/* ------------------------------ */
10135    .balign 64
10136.L_OP_UNUSED_A5FF: /* 0x1a5 */
10137/* File: armv5te/OP_UNUSED_A5FF.S */
10138/* File: armv5te/unused.S */
10139    bl      common_abort
10140
10141
10142/* ------------------------------ */
10143    .balign 64
10144.L_OP_UNUSED_A6FF: /* 0x1a6 */
10145/* File: armv5te/OP_UNUSED_A6FF.S */
10146/* File: armv5te/unused.S */
10147    bl      common_abort
10148
10149
10150/* ------------------------------ */
10151    .balign 64
10152.L_OP_UNUSED_A7FF: /* 0x1a7 */
10153/* File: armv5te/OP_UNUSED_A7FF.S */
10154/* File: armv5te/unused.S */
10155    bl      common_abort
10156
10157
10158/* ------------------------------ */
10159    .balign 64
10160.L_OP_UNUSED_A8FF: /* 0x1a8 */
10161/* File: armv5te/OP_UNUSED_A8FF.S */
10162/* File: armv5te/unused.S */
10163    bl      common_abort
10164
10165
10166/* ------------------------------ */
10167    .balign 64
10168.L_OP_UNUSED_A9FF: /* 0x1a9 */
10169/* File: armv5te/OP_UNUSED_A9FF.S */
10170/* File: armv5te/unused.S */
10171    bl      common_abort
10172
10173
10174/* ------------------------------ */
10175    .balign 64
10176.L_OP_UNUSED_AAFF: /* 0x1aa */
10177/* File: armv5te/OP_UNUSED_AAFF.S */
10178/* File: armv5te/unused.S */
10179    bl      common_abort
10180
10181
10182/* ------------------------------ */
10183    .balign 64
10184.L_OP_UNUSED_ABFF: /* 0x1ab */
10185/* File: armv5te/OP_UNUSED_ABFF.S */
10186/* File: armv5te/unused.S */
10187    bl      common_abort
10188
10189
10190/* ------------------------------ */
10191    .balign 64
10192.L_OP_UNUSED_ACFF: /* 0x1ac */
10193/* File: armv5te/OP_UNUSED_ACFF.S */
10194/* File: armv5te/unused.S */
10195    bl      common_abort
10196
10197
10198/* ------------------------------ */
10199    .balign 64
10200.L_OP_UNUSED_ADFF: /* 0x1ad */
10201/* File: armv5te/OP_UNUSED_ADFF.S */
10202/* File: armv5te/unused.S */
10203    bl      common_abort
10204
10205
10206/* ------------------------------ */
10207    .balign 64
10208.L_OP_UNUSED_AEFF: /* 0x1ae */
10209/* File: armv5te/OP_UNUSED_AEFF.S */
10210/* File: armv5te/unused.S */
10211    bl      common_abort
10212
10213
10214/* ------------------------------ */
10215    .balign 64
10216.L_OP_UNUSED_AFFF: /* 0x1af */
10217/* File: armv5te/OP_UNUSED_AFFF.S */
10218/* File: armv5te/unused.S */
10219    bl      common_abort
10220
10221
10222/* ------------------------------ */
10223    .balign 64
10224.L_OP_UNUSED_B0FF: /* 0x1b0 */
10225/* File: armv5te/OP_UNUSED_B0FF.S */
10226/* File: armv5te/unused.S */
10227    bl      common_abort
10228
10229
10230/* ------------------------------ */
10231    .balign 64
10232.L_OP_UNUSED_B1FF: /* 0x1b1 */
10233/* File: armv5te/OP_UNUSED_B1FF.S */
10234/* File: armv5te/unused.S */
10235    bl      common_abort
10236
10237
10238/* ------------------------------ */
10239    .balign 64
10240.L_OP_UNUSED_B2FF: /* 0x1b2 */
10241/* File: armv5te/OP_UNUSED_B2FF.S */
10242/* File: armv5te/unused.S */
10243    bl      common_abort
10244
10245
10246/* ------------------------------ */
10247    .balign 64
10248.L_OP_UNUSED_B3FF: /* 0x1b3 */
10249/* File: armv5te/OP_UNUSED_B3FF.S */
10250/* File: armv5te/unused.S */
10251    bl      common_abort
10252
10253
10254/* ------------------------------ */
10255    .balign 64
10256.L_OP_UNUSED_B4FF: /* 0x1b4 */
10257/* File: armv5te/OP_UNUSED_B4FF.S */
10258/* File: armv5te/unused.S */
10259    bl      common_abort
10260
10261
10262/* ------------------------------ */
10263    .balign 64
10264.L_OP_UNUSED_B5FF: /* 0x1b5 */
10265/* File: armv5te/OP_UNUSED_B5FF.S */
10266/* File: armv5te/unused.S */
10267    bl      common_abort
10268
10269
10270/* ------------------------------ */
10271    .balign 64
10272.L_OP_UNUSED_B6FF: /* 0x1b6 */
10273/* File: armv5te/OP_UNUSED_B6FF.S */
10274/* File: armv5te/unused.S */
10275    bl      common_abort
10276
10277
10278/* ------------------------------ */
10279    .balign 64
10280.L_OP_UNUSED_B7FF: /* 0x1b7 */
10281/* File: armv5te/OP_UNUSED_B7FF.S */
10282/* File: armv5te/unused.S */
10283    bl      common_abort
10284
10285
10286/* ------------------------------ */
10287    .balign 64
10288.L_OP_UNUSED_B8FF: /* 0x1b8 */
10289/* File: armv5te/OP_UNUSED_B8FF.S */
10290/* File: armv5te/unused.S */
10291    bl      common_abort
10292
10293
10294/* ------------------------------ */
10295    .balign 64
10296.L_OP_UNUSED_B9FF: /* 0x1b9 */
10297/* File: armv5te/OP_UNUSED_B9FF.S */
10298/* File: armv5te/unused.S */
10299    bl      common_abort
10300
10301
10302/* ------------------------------ */
10303    .balign 64
10304.L_OP_UNUSED_BAFF: /* 0x1ba */
10305/* File: armv5te/OP_UNUSED_BAFF.S */
10306/* File: armv5te/unused.S */
10307    bl      common_abort
10308
10309
10310/* ------------------------------ */
10311    .balign 64
10312.L_OP_UNUSED_BBFF: /* 0x1bb */
10313/* File: armv5te/OP_UNUSED_BBFF.S */
10314/* File: armv5te/unused.S */
10315    bl      common_abort
10316
10317
10318/* ------------------------------ */
10319    .balign 64
10320.L_OP_UNUSED_BCFF: /* 0x1bc */
10321/* File: armv5te/OP_UNUSED_BCFF.S */
10322/* File: armv5te/unused.S */
10323    bl      common_abort
10324
10325
10326/* ------------------------------ */
10327    .balign 64
10328.L_OP_UNUSED_BDFF: /* 0x1bd */
10329/* File: armv5te/OP_UNUSED_BDFF.S */
10330/* File: armv5te/unused.S */
10331    bl      common_abort
10332
10333
10334/* ------------------------------ */
10335    .balign 64
10336.L_OP_UNUSED_BEFF: /* 0x1be */
10337/* File: armv5te/OP_UNUSED_BEFF.S */
10338/* File: armv5te/unused.S */
10339    bl      common_abort
10340
10341
10342/* ------------------------------ */
10343    .balign 64
10344.L_OP_UNUSED_BFFF: /* 0x1bf */
10345/* File: armv5te/OP_UNUSED_BFFF.S */
10346/* File: armv5te/unused.S */
10347    bl      common_abort
10348
10349
10350/* ------------------------------ */
10351    .balign 64
10352.L_OP_UNUSED_C0FF: /* 0x1c0 */
10353/* File: armv5te/OP_UNUSED_C0FF.S */
10354/* File: armv5te/unused.S */
10355    bl      common_abort
10356
10357
10358/* ------------------------------ */
10359    .balign 64
10360.L_OP_UNUSED_C1FF: /* 0x1c1 */
10361/* File: armv5te/OP_UNUSED_C1FF.S */
10362/* File: armv5te/unused.S */
10363    bl      common_abort
10364
10365
10366/* ------------------------------ */
10367    .balign 64
10368.L_OP_UNUSED_C2FF: /* 0x1c2 */
10369/* File: armv5te/OP_UNUSED_C2FF.S */
10370/* File: armv5te/unused.S */
10371    bl      common_abort
10372
10373
10374/* ------------------------------ */
10375    .balign 64
10376.L_OP_UNUSED_C3FF: /* 0x1c3 */
10377/* File: armv5te/OP_UNUSED_C3FF.S */
10378/* File: armv5te/unused.S */
10379    bl      common_abort
10380
10381
10382/* ------------------------------ */
10383    .balign 64
10384.L_OP_UNUSED_C4FF: /* 0x1c4 */
10385/* File: armv5te/OP_UNUSED_C4FF.S */
10386/* File: armv5te/unused.S */
10387    bl      common_abort
10388
10389
10390/* ------------------------------ */
10391    .balign 64
10392.L_OP_UNUSED_C5FF: /* 0x1c5 */
10393/* File: armv5te/OP_UNUSED_C5FF.S */
10394/* File: armv5te/unused.S */
10395    bl      common_abort
10396
10397
10398/* ------------------------------ */
10399    .balign 64
10400.L_OP_UNUSED_C6FF: /* 0x1c6 */
10401/* File: armv5te/OP_UNUSED_C6FF.S */
10402/* File: armv5te/unused.S */
10403    bl      common_abort
10404
10405
10406/* ------------------------------ */
10407    .balign 64
10408.L_OP_UNUSED_C7FF: /* 0x1c7 */
10409/* File: armv5te/OP_UNUSED_C7FF.S */
10410/* File: armv5te/unused.S */
10411    bl      common_abort
10412
10413
10414/* ------------------------------ */
10415    .balign 64
10416.L_OP_UNUSED_C8FF: /* 0x1c8 */
10417/* File: armv5te/OP_UNUSED_C8FF.S */
10418/* File: armv5te/unused.S */
10419    bl      common_abort
10420
10421
10422/* ------------------------------ */
10423    .balign 64
10424.L_OP_UNUSED_C9FF: /* 0x1c9 */
10425/* File: armv5te/OP_UNUSED_C9FF.S */
10426/* File: armv5te/unused.S */
10427    bl      common_abort
10428
10429
10430/* ------------------------------ */
10431    .balign 64
10432.L_OP_UNUSED_CAFF: /* 0x1ca */
10433/* File: armv5te/OP_UNUSED_CAFF.S */
10434/* File: armv5te/unused.S */
10435    bl      common_abort
10436
10437
10438/* ------------------------------ */
10439    .balign 64
10440.L_OP_UNUSED_CBFF: /* 0x1cb */
10441/* File: armv5te/OP_UNUSED_CBFF.S */
10442/* File: armv5te/unused.S */
10443    bl      common_abort
10444
10445
10446/* ------------------------------ */
10447    .balign 64
10448.L_OP_UNUSED_CCFF: /* 0x1cc */
10449/* File: armv5te/OP_UNUSED_CCFF.S */
10450/* File: armv5te/unused.S */
10451    bl      common_abort
10452
10453
10454/* ------------------------------ */
10455    .balign 64
10456.L_OP_UNUSED_CDFF: /* 0x1cd */
10457/* File: armv5te/OP_UNUSED_CDFF.S */
10458/* File: armv5te/unused.S */
10459    bl      common_abort
10460
10461
10462/* ------------------------------ */
10463    .balign 64
10464.L_OP_UNUSED_CEFF: /* 0x1ce */
10465/* File: armv5te/OP_UNUSED_CEFF.S */
10466/* File: armv5te/unused.S */
10467    bl      common_abort
10468
10469
10470/* ------------------------------ */
10471    .balign 64
10472.L_OP_UNUSED_CFFF: /* 0x1cf */
10473/* File: armv5te/OP_UNUSED_CFFF.S */
10474/* File: armv5te/unused.S */
10475    bl      common_abort
10476
10477
10478/* ------------------------------ */
10479    .balign 64
10480.L_OP_UNUSED_D0FF: /* 0x1d0 */
10481/* File: armv5te/OP_UNUSED_D0FF.S */
10482/* File: armv5te/unused.S */
10483    bl      common_abort
10484
10485
10486/* ------------------------------ */
10487    .balign 64
10488.L_OP_UNUSED_D1FF: /* 0x1d1 */
10489/* File: armv5te/OP_UNUSED_D1FF.S */
10490/* File: armv5te/unused.S */
10491    bl      common_abort
10492
10493
10494/* ------------------------------ */
10495    .balign 64
10496.L_OP_UNUSED_D2FF: /* 0x1d2 */
10497/* File: armv5te/OP_UNUSED_D2FF.S */
10498/* File: armv5te/unused.S */
10499    bl      common_abort
10500
10501
10502/* ------------------------------ */
10503    .balign 64
10504.L_OP_UNUSED_D3FF: /* 0x1d3 */
10505/* File: armv5te/OP_UNUSED_D3FF.S */
10506/* File: armv5te/unused.S */
10507    bl      common_abort
10508
10509
10510/* ------------------------------ */
10511    .balign 64
10512.L_OP_UNUSED_D4FF: /* 0x1d4 */
10513/* File: armv5te/OP_UNUSED_D4FF.S */
10514/* File: armv5te/unused.S */
10515    bl      common_abort
10516
10517
10518/* ------------------------------ */
10519    .balign 64
10520.L_OP_UNUSED_D5FF: /* 0x1d5 */
10521/* File: armv5te/OP_UNUSED_D5FF.S */
10522/* File: armv5te/unused.S */
10523    bl      common_abort
10524
10525
10526/* ------------------------------ */
10527    .balign 64
10528.L_OP_UNUSED_D6FF: /* 0x1d6 */
10529/* File: armv5te/OP_UNUSED_D6FF.S */
10530/* File: armv5te/unused.S */
10531    bl      common_abort
10532
10533
10534/* ------------------------------ */
10535    .balign 64
10536.L_OP_UNUSED_D7FF: /* 0x1d7 */
10537/* File: armv5te/OP_UNUSED_D7FF.S */
10538/* File: armv5te/unused.S */
10539    bl      common_abort
10540
10541
10542/* ------------------------------ */
10543    .balign 64
10544.L_OP_UNUSED_D8FF: /* 0x1d8 */
10545/* File: armv5te/OP_UNUSED_D8FF.S */
10546/* File: armv5te/unused.S */
10547    bl      common_abort
10548
10549
10550/* ------------------------------ */
10551    .balign 64
10552.L_OP_UNUSED_D9FF: /* 0x1d9 */
10553/* File: armv5te/OP_UNUSED_D9FF.S */
10554/* File: armv5te/unused.S */
10555    bl      common_abort
10556
10557
10558/* ------------------------------ */
10559    .balign 64
10560.L_OP_UNUSED_DAFF: /* 0x1da */
10561/* File: armv5te/OP_UNUSED_DAFF.S */
10562/* File: armv5te/unused.S */
10563    bl      common_abort
10564
10565
10566/* ------------------------------ */
10567    .balign 64
10568.L_OP_UNUSED_DBFF: /* 0x1db */
10569/* File: armv5te/OP_UNUSED_DBFF.S */
10570/* File: armv5te/unused.S */
10571    bl      common_abort
10572
10573
10574/* ------------------------------ */
10575    .balign 64
10576.L_OP_UNUSED_DCFF: /* 0x1dc */
10577/* File: armv5te/OP_UNUSED_DCFF.S */
10578/* File: armv5te/unused.S */
10579    bl      common_abort
10580
10581
10582/* ------------------------------ */
10583    .balign 64
10584.L_OP_UNUSED_DDFF: /* 0x1dd */
10585/* File: armv5te/OP_UNUSED_DDFF.S */
10586/* File: armv5te/unused.S */
10587    bl      common_abort
10588
10589
10590/* ------------------------------ */
10591    .balign 64
10592.L_OP_UNUSED_DEFF: /* 0x1de */
10593/* File: armv5te/OP_UNUSED_DEFF.S */
10594/* File: armv5te/unused.S */
10595    bl      common_abort
10596
10597
10598/* ------------------------------ */
10599    .balign 64
10600.L_OP_UNUSED_DFFF: /* 0x1df */
10601/* File: armv5te/OP_UNUSED_DFFF.S */
10602/* File: armv5te/unused.S */
10603    bl      common_abort
10604
10605
10606/* ------------------------------ */
10607    .balign 64
10608.L_OP_UNUSED_E0FF: /* 0x1e0 */
10609/* File: armv5te/OP_UNUSED_E0FF.S */
10610/* File: armv5te/unused.S */
10611    bl      common_abort
10612
10613
10614/* ------------------------------ */
10615    .balign 64
10616.L_OP_UNUSED_E1FF: /* 0x1e1 */
10617/* File: armv5te/OP_UNUSED_E1FF.S */
10618/* File: armv5te/unused.S */
10619    bl      common_abort
10620
10621
10622/* ------------------------------ */
10623    .balign 64
10624.L_OP_UNUSED_E2FF: /* 0x1e2 */
10625/* File: armv5te/OP_UNUSED_E2FF.S */
10626/* File: armv5te/unused.S */
10627    bl      common_abort
10628
10629
10630/* ------------------------------ */
10631    .balign 64
10632.L_OP_UNUSED_E3FF: /* 0x1e3 */
10633/* File: armv5te/OP_UNUSED_E3FF.S */
10634/* File: armv5te/unused.S */
10635    bl      common_abort
10636
10637
10638/* ------------------------------ */
10639    .balign 64
10640.L_OP_UNUSED_E4FF: /* 0x1e4 */
10641/* File: armv5te/OP_UNUSED_E4FF.S */
10642/* File: armv5te/unused.S */
10643    bl      common_abort
10644
10645
10646/* ------------------------------ */
10647    .balign 64
10648.L_OP_UNUSED_E5FF: /* 0x1e5 */
10649/* File: armv5te/OP_UNUSED_E5FF.S */
10650/* File: armv5te/unused.S */
10651    bl      common_abort
10652
10653
10654/* ------------------------------ */
10655    .balign 64
10656.L_OP_UNUSED_E6FF: /* 0x1e6 */
10657/* File: armv5te/OP_UNUSED_E6FF.S */
10658/* File: armv5te/unused.S */
10659    bl      common_abort
10660
10661
10662/* ------------------------------ */
10663    .balign 64
10664.L_OP_UNUSED_E7FF: /* 0x1e7 */
10665/* File: armv5te/OP_UNUSED_E7FF.S */
10666/* File: armv5te/unused.S */
10667    bl      common_abort
10668
10669
10670/* ------------------------------ */
10671    .balign 64
10672.L_OP_UNUSED_E8FF: /* 0x1e8 */
10673/* File: armv5te/OP_UNUSED_E8FF.S */
10674/* File: armv5te/unused.S */
10675    bl      common_abort
10676
10677
10678/* ------------------------------ */
10679    .balign 64
10680.L_OP_UNUSED_E9FF: /* 0x1e9 */
10681/* File: armv5te/OP_UNUSED_E9FF.S */
10682/* File: armv5te/unused.S */
10683    bl      common_abort
10684
10685
10686/* ------------------------------ */
10687    .balign 64
10688.L_OP_UNUSED_EAFF: /* 0x1ea */
10689/* File: armv5te/OP_UNUSED_EAFF.S */
10690/* File: armv5te/unused.S */
10691    bl      common_abort
10692
10693
10694/* ------------------------------ */
10695    .balign 64
10696.L_OP_UNUSED_EBFF: /* 0x1eb */
10697/* File: armv5te/OP_UNUSED_EBFF.S */
10698/* File: armv5te/unused.S */
10699    bl      common_abort
10700
10701
10702/* ------------------------------ */
10703    .balign 64
10704.L_OP_UNUSED_ECFF: /* 0x1ec */
10705/* File: armv5te/OP_UNUSED_ECFF.S */
10706/* File: armv5te/unused.S */
10707    bl      common_abort
10708
10709
10710/* ------------------------------ */
10711    .balign 64
10712.L_OP_UNUSED_EDFF: /* 0x1ed */
10713/* File: armv5te/OP_UNUSED_EDFF.S */
10714/* File: armv5te/unused.S */
10715    bl      common_abort
10716
10717
10718/* ------------------------------ */
10719    .balign 64
10720.L_OP_UNUSED_EEFF: /* 0x1ee */
10721/* File: armv5te/OP_UNUSED_EEFF.S */
10722/* File: armv5te/unused.S */
10723    bl      common_abort
10724
10725
10726/* ------------------------------ */
10727    .balign 64
10728.L_OP_UNUSED_EFFF: /* 0x1ef */
10729/* File: armv5te/OP_UNUSED_EFFF.S */
10730/* File: armv5te/unused.S */
10731    bl      common_abort
10732
10733
10734/* ------------------------------ */
10735    .balign 64
10736.L_OP_UNUSED_F0FF: /* 0x1f0 */
10737/* File: armv5te/OP_UNUSED_F0FF.S */
10738/* File: armv5te/unused.S */
10739    bl      common_abort
10740
10741
10742/* ------------------------------ */
10743    .balign 64
10744.L_OP_UNUSED_F1FF: /* 0x1f1 */
10745/* File: armv5te/OP_UNUSED_F1FF.S */
10746/* File: armv5te/unused.S */
10747    bl      common_abort
10748
10749
10750/* ------------------------------ */
10751    .balign 64
10752.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
10753/* File: armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S */
10754/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
10755    /*
10756     * Invoke Object.<init> on an object.  In practice we know that
10757     * Object's nullary constructor doesn't do anything, so we just
10758     * skip it unless a debugger is active.
10759     */
10760    FETCH(r1, 4)                  @ r1<- CCCC
10761    GET_VREG(r0, r1)                    @ r0<- "this" ptr
10762    cmp     r0, #0                      @ check for NULL
10763    beq     common_errNullObject        @ export PC and throw NPE
10764    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
10765    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
10766    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
10767    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal        @ yes, go
10768.LOP_INVOKE_OBJECT_INIT_JUMBO_finish:
10769    ldrh    r1, [rSELF, #offThread_subMode]
10770    ands    r1, #kSubModeDebuggerActive @ debugger active?
10771    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_debugger        @ Yes - skip optimization
10772    FETCH_ADVANCE_INST(4+1)       @ advance to next instr, load rINST
10773    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
10774    GOTO_OPCODE(ip)                     @ execute it
10775
10776
10777/* ------------------------------ */
10778    .balign 64
10779.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
10780/* File: armv5te/OP_IGET_VOLATILE_JUMBO.S */
10781/* File: armv5te/OP_IGET_JUMBO.S */
10782    /*
10783     * Jumbo 32-bit instance field get.
10784     *
10785     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10786     *      iget-char/jumbo, iget-short/jumbo
10787     */
10788    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10789    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10790    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10791    FETCH(r0, 4)                        @ r0<- CCCC
10792    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10793    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10794    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10795    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10796    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10797    cmp     r0, #0                      @ is resolved entry null?
10798    bne     .LOP_IGET_VOLATILE_JUMBO_finish          @ no, already resolved
107998:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10800    EXPORT_PC()                         @ resolve() could throw
10801    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10802    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10803    b       .LOP_IGET_VOLATILE_JUMBO_resolved        @ resolved, continue
10804
10805
10806/* ------------------------------ */
10807    .balign 64
10808.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
10809/* File: armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S */
10810/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
10811    /*
10812     * Jumbo 64-bit instance field get.
10813     */
10814    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10815    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10816    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10817    FETCH(r0, 4)                        @ r0<- CCCC
10818    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10819    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10820    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10821    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10822    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10823    cmp     r0, #0                      @ is resolved entry null?
10824    bne     .LOP_IGET_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
10825    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10826    EXPORT_PC()                         @ resolve() could throw
10827    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10828    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10829    b       .LOP_IGET_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10830
10831
10832/* ------------------------------ */
10833    .balign 64
10834.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
10835/* File: armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S */
10836/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
10837/* File: armv5te/OP_IGET_JUMBO.S */
10838    /*
10839     * Jumbo 32-bit instance field get.
10840     *
10841     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10842     *      iget-char/jumbo, iget-short/jumbo
10843     */
10844    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10845    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10846    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10847    FETCH(r0, 4)                        @ r0<- CCCC
10848    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10849    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10850    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10851    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10852    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10853    cmp     r0, #0                      @ is resolved entry null?
10854    bne     .LOP_IGET_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
108558:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10856    EXPORT_PC()                         @ resolve() could throw
10857    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10858    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10859    b       .LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10860
10861
10862
10863/* ------------------------------ */
10864    .balign 64
10865.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
10866/* File: armv5te/OP_IPUT_VOLATILE_JUMBO.S */
10867/* File: armv5te/OP_IPUT_JUMBO.S */
10868    /*
10869     * Jumbo 32-bit instance field put.
10870     *
10871     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
10872     *      iput-short/jumbo
10873     */
10874    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10875    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10876    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10877    FETCH(r0, 4)                        @ r0<- CCCC
10878    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10879    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10880    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10881    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10882    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10883    cmp     r0, #0                      @ is resolved entry null?
10884    bne     .LOP_IPUT_VOLATILE_JUMBO_finish          @ no, already resolved
108858:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10886    EXPORT_PC()                         @ resolve() could throw
10887    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10888    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10889    b       .LOP_IPUT_VOLATILE_JUMBO_resolved        @ resolved, continue
10890
10891
10892/* ------------------------------ */
10893    .balign 64
10894.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
10895/* File: armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S */
10896/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
10897    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10898    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10899    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10900    FETCH(r0, 4)                        @ r0<- CCCC
10901    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10902    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10903    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10904    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
10905    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10906    cmp     r0, #0                      @ is resolved entry null?
10907    bne     .LOP_IPUT_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
109088:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10909    EXPORT_PC()                         @ resolve() could throw
10910    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10911    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10912    b       .LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10913
10914
10915/* ------------------------------ */
10916    .balign 64
10917.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
10918/* File: armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S */
10919/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
10920    /*
10921     * Jumbo 32-bit instance field put.
10922     */
10923    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10924    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10925    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10926    FETCH(r0, 4)                        @ r0<- CCCC
10927    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10928    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10929    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10930    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10931    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10932    cmp     r0, #0                      @ is resolved entry null?
10933    bne     .LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
109348:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10935    EXPORT_PC()                         @ resolve() could throw
10936    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10937    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10938    b       .LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10939
10940
10941/* ------------------------------ */
10942    .balign 64
10943.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
10944/* File: armv5te/OP_SGET_VOLATILE_JUMBO.S */
10945/* File: armv5te/OP_SGET_JUMBO.S */
10946    /*
10947     * Jumbo 32-bit SGET handler.
10948     *
10949     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
10950     *      sget-char/jumbo, sget-short/jumbo
10951     */
10952    /* exop vBBBB, field@AAAAAAAA */
10953    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10954    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10955    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10956    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10957    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10958    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10959    cmp     r0, #0                      @ is resolved entry null?
10960    beq     .LOP_SGET_VOLATILE_JUMBO_resolve         @ yes, do resolve
10961.LOP_SGET_VOLATILE_JUMBO_finish: @ field ptr in r0
10962    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
10963    SMP_DMB                            @ acquiring load
10964    FETCH(r2, 3)                        @ r2<- BBBB
10965    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10966    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
10967    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10968    GOTO_OPCODE(ip)                     @ jump to next instruction
10969
10970
10971/* ------------------------------ */
10972    .balign 64
10973.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
10974/* File: armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S */
10975/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
10976    /*
10977     * Jumbo 64-bit SGET handler.
10978     */
10979    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
10980    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10981    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10982    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10983    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
10984    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10985    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
10986    cmp     r0, #0                      @ is resolved entry null?
10987    beq     .LOP_SGET_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
10988.LOP_SGET_WIDE_VOLATILE_JUMBO_finish:
10989    FETCH(r9, 3)                        @ r9<- BBBB
10990    .if 1
10991    add     r0, r0, #offStaticField_value @ r0<- pointer to data
10992    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
10993    .else
10994    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
10995    .endif
10996    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
10997    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10998    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
10999    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11000    GOTO_OPCODE(ip)                     @ jump to next instruction
11001
11002
11003/* ------------------------------ */
11004    .balign 64
11005.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
11006/* File: armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S */
11007/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
11008/* File: armv5te/OP_SGET_JUMBO.S */
11009    /*
11010     * Jumbo 32-bit SGET handler.
11011     *
11012     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
11013     *      sget-char/jumbo, sget-short/jumbo
11014     */
11015    /* exop vBBBB, field@AAAAAAAA */
11016    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
11017    FETCH(r0, 1)                        @ r0<- aaaa (lo)
11018    FETCH(r1, 2)                        @ r1<- AAAA (hi)
11019    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
11020    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
11021    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
11022    cmp     r0, #0                      @ is resolved entry null?
11023    beq     .LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
11024.LOP_SGET_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
11025    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
11026    SMP_DMB                            @ acquiring load
11027    FETCH(r2, 3)                        @ r2<- BBBB
11028    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
11029    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
11030    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11031    GOTO_OPCODE(ip)                     @ jump to next instruction
11032
11033
11034
11035/* ------------------------------ */
11036    .balign 64
11037.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
11038/* File: armv5te/OP_SPUT_VOLATILE_JUMBO.S */
11039/* File: armv5te/OP_SPUT_JUMBO.S */
11040    /*
11041     * Jumbo 32-bit SPUT handler.
11042     *
11043     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
11044     *      sput-short/jumbo
11045     */
11046    /* exop vBBBB, field@AAAAAAAA */
11047    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
11048    FETCH(r0, 1)                        @ r0<- aaaa (lo)
11049    FETCH(r1, 2)                        @ r1<- AAAA (hi)
11050    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
11051    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
11052    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
11053    cmp     r0, #0                      @ is resolved entry null?
11054    beq     .LOP_SPUT_VOLATILE_JUMBO_resolve         @ yes, do resolve
11055.LOP_SPUT_VOLATILE_JUMBO_finish:   @ field ptr in r0
11056    FETCH(r2, 3)                        @ r2<- BBBB
11057    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
11058    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
11059    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11060    SMP_DMB_ST                        @ releasing store
11061    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
11062    SMP_DMB
11063    GOTO_OPCODE(ip)                     @ jump to next instruction
11064
11065
11066/* ------------------------------ */
11067    .balign 64
11068.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
11069/* File: armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S */
11070/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
11071    /*
11072     * Jumbo 64-bit SPUT handler.
11073     */
11074    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
11075    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
11076    FETCH(r1, 1)                        @ r1<- aaaa (lo)
11077    FETCH(r2, 2)                        @ r2<- AAAA (hi)
11078    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
11079    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
11080    FETCH(r9, 3)                        @ r9<- BBBB
11081    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
11082    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
11083    cmp     r2, #0                      @ is resolved entry null?
11084    beq     .LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
11085.LOP_SPUT_WIDE_VOLATILE_JUMBO_finish: @ field ptr in r2, BBBB in r9
11086    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
11087    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
11088    GET_INST_OPCODE(r10)                @ extract opcode from rINST
11089    .if 1
11090    add     r2, r2, #offStaticField_value @ r2<- pointer to data
11091    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
11092    .else
11093    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
11094    .endif
11095    GOTO_OPCODE(r10)                    @ jump to next instruction
11096
11097
11098/* ------------------------------ */
11099    .balign 64
11100.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
11101/* File: armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S */
11102/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
11103    /*
11104     * Jumbo 32-bit SPUT handler for objects
11105     */
11106    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
11107    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
11108    FETCH(r0, 1)                        @ r0<- aaaa (lo)
11109    FETCH(r1, 2)                        @ r1<- AAAA (hi)
11110    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
11111    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
11112    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
11113    cmp     r0, #0                      @ is resolved entry null?
11114    beq     .LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
11115.LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish:   @ field ptr in r0
11116    FETCH(r2, 3)                        @ r2<- BBBB
11117    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
11118    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
11119    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11120    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
11121    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11122    SMP_DMB_ST                        @ releasing store
11123    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_end
11124
11125
11126/* ------------------------------ */
11127    .balign 64
11128.L_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
11129/* File: armv5te/OP_THROW_VERIFICATION_ERROR_JUMBO.S */
11130    /*
11131     * Handle a jumbo throw-verification-error instruction.  This throws an
11132     * exception for an error discovered during verification.  The
11133     * exception is indicated by BBBB, with some detail provided by AAAAAAAA.
11134     */
11135    /* exop BBBB, Class@AAAAAAAA */
11136    FETCH(r1, 1)                        @ r1<- aaaa (lo)
11137    FETCH(r2, 2)                        @ r2<- AAAA (hi)
11138    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
11139    orr     r2, r1, r2, lsl #16         @ r2<- AAAAaaaa
11140    EXPORT_PC()                         @ export the PC
11141    FETCH(r1, 3)                        @ r1<- BBBB
11142    bl      dvmThrowVerificationError   @ always throws
11143    b       common_exceptionThrown      @ handle exception
11144
11145    .balign 64
11146    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
11147    .global dvmAsmInstructionEnd
11148dvmAsmInstructionEnd:
11149
11150/*
11151 * ===========================================================================
11152 *  Sister implementations
11153 * ===========================================================================
11154 */
11155    .global dvmAsmSisterStart
11156    .type   dvmAsmSisterStart, %function
11157    .text
11158    .balign 4
11159dvmAsmSisterStart:
11160
11161/* continuation for OP_CONST_STRING */
11162
11163    /*
11164     * Continuation if the String has not yet been resolved.
11165     *  r1: BBBB (String ref)
11166     *  r9: target register
11167     */
11168.LOP_CONST_STRING_resolve:
11169    EXPORT_PC()
11170    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
11171    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
11172    bl      dvmResolveString            @ r0<- String reference
11173    cmp     r0, #0                      @ failed?
11174    beq     common_exceptionThrown      @ yup, handle the exception
11175    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11176    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11177    SET_VREG(r0, r9)                    @ vAA<- r0
11178    GOTO_OPCODE(ip)                     @ jump to next instruction
11179
11180/* continuation for OP_CONST_STRING_JUMBO */
11181
11182    /*
11183     * Continuation if the String has not yet been resolved.
11184     *  r1: BBBBBBBB (String ref)
11185     *  r9: target register
11186     */
11187.LOP_CONST_STRING_JUMBO_resolve:
11188    EXPORT_PC()
11189    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
11190    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
11191    bl      dvmResolveString            @ r0<- String reference
11192    cmp     r0, #0                      @ failed?
11193    beq     common_exceptionThrown      @ yup, handle the exception
11194    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
11195    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11196    SET_VREG(r0, r9)                    @ vAA<- r0
11197    GOTO_OPCODE(ip)                     @ jump to next instruction
11198
11199/* continuation for OP_CONST_CLASS */
11200
11201    /*
11202     * Continuation if the Class has not yet been resolved.
11203     *  r1: BBBB (Class ref)
11204     *  r9: target register
11205     */
11206.LOP_CONST_CLASS_resolve:
11207    EXPORT_PC()
11208    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
11209    mov     r2, #1                      @ r2<- true
11210    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
11211    bl      dvmResolveClass             @ r0<- Class reference
11212    cmp     r0, #0                      @ failed?
11213    beq     common_exceptionThrown      @ yup, handle the exception
11214    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11215    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11216    SET_VREG(r0, r9)                    @ vAA<- r0
11217    GOTO_OPCODE(ip)                     @ jump to next instruction
11218
11219/* continuation for OP_CHECK_CAST */
11220
11221    /*
11222     * Trivial test failed, need to perform full check.  This is common.
11223     *  r0 holds obj->clazz
11224     *  r1 holds desired class resolved from BBBB
11225     *  r9 holds object
11226     */
11227.LOP_CHECK_CAST_fullcheck:
11228    mov     r10, r1                     @ avoid ClassObject getting clobbered
11229    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
11230    cmp     r0, #0                      @ failed?
11231    bne     .LOP_CHECK_CAST_okay            @ no, success
11232
11233    @ A cast has failed.  We need to throw a ClassCastException.
11234    EXPORT_PC()                         @ about to throw
11235    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
11236    mov     r1, r10                     @ r1<- desired class
11237    bl      dvmThrowClassCastException
11238    b       common_exceptionThrown
11239
11240    /*
11241     * Resolution required.  This is the least-likely path.
11242     *
11243     *  r2 holds BBBB
11244     *  r9 holds object
11245     */
11246.LOP_CHECK_CAST_resolve:
11247    EXPORT_PC()                         @ resolve() could throw
11248    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11249    mov     r1, r2                      @ r1<- BBBB
11250    mov     r2, #0                      @ r2<- false
11251    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11252    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
11253    cmp     r0, #0                      @ got null?
11254    beq     common_exceptionThrown      @ yes, handle exception
11255    mov     r1, r0                      @ r1<- class resolved from BBB
11256    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
11257    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
11258
11259/* continuation for OP_INSTANCE_OF */
11260
11261    /*
11262     * Trivial test failed, need to perform full check.  This is common.
11263     *  r0 holds obj->clazz
11264     *  r1 holds class resolved from BBBB
11265     *  r9 holds A
11266     */
11267.LOP_INSTANCE_OF_fullcheck:
11268    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
11269    @ fall through to OP_INSTANCE_OF_store
11270
11271    /*
11272     * r0 holds boolean result
11273     * r9 holds A
11274     */
11275.LOP_INSTANCE_OF_store:
11276    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11277    SET_VREG(r0, r9)                    @ vA<- r0
11278    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11279    GOTO_OPCODE(ip)                     @ jump to next instruction
11280
11281    /*
11282     * Trivial test succeeded, save and bail.
11283     *  r9 holds A
11284     */
11285.LOP_INSTANCE_OF_trivial:
11286    mov     r0, #1                      @ indicate success
11287    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
11288    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11289    SET_VREG(r0, r9)                    @ vA<- r0
11290    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11291    GOTO_OPCODE(ip)                     @ jump to next instruction
11292
11293    /*
11294     * Resolution required.  This is the least-likely path.
11295     *
11296     *  r3 holds BBBB
11297     *  r9 holds A
11298     */
11299.LOP_INSTANCE_OF_resolve:
11300    EXPORT_PC()                         @ resolve() could throw
11301    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
11302    mov     r1, r3                      @ r1<- BBBB
11303    mov     r2, #1                      @ r2<- true
11304    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
11305    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
11306    cmp     r0, #0                      @ got null?
11307    beq     common_exceptionThrown      @ yes, handle exception
11308    mov     r1, r0                      @ r1<- class resolved from BBB
11309    mov     r3, rINST, lsr #12          @ r3<- B
11310    GET_VREG(r0, r3)                    @ r0<- vB (object)
11311    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
11312    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
11313
11314/* continuation for OP_NEW_INSTANCE */
11315
11316    .balign 32                          @ minimize cache lines
11317.LOP_NEW_INSTANCE_finish: @ r0=new object
11318    mov     r3, rINST, lsr #8           @ r3<- AA
11319    cmp     r0, #0                      @ failed?
11320#if defined(WITH_JIT)
11321    /*
11322     * The JIT needs the class to be fully resolved before it can
11323     * include this instruction in a trace.
11324     */
11325    ldrh    r1, [rSELF, #offThread_subMode]
11326    beq     common_exceptionThrown      @ yes, handle the exception
11327    ands    r1, #kSubModeJitTraceBuild  @ under construction?
11328    bne     .LOP_NEW_INSTANCE_jitCheck
11329#else
11330    beq     common_exceptionThrown      @ yes, handle the exception
11331#endif
11332.LOP_NEW_INSTANCE_end:
11333    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11334    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11335    SET_VREG(r0, r3)                    @ vAA<- r0
11336    GOTO_OPCODE(ip)                     @ jump to next instruction
11337
11338#if defined(WITH_JIT)
11339    /*
11340     * Check to see if we need to stop the trace building early.
11341     * r0: new object
11342     * r3: vAA
11343     */
11344.LOP_NEW_INSTANCE_jitCheck:
11345    ldr     r1, [r10]                   @ reload resolved class
11346    cmp     r1, #0                      @ okay?
11347    bne     .LOP_NEW_INSTANCE_end             @ yes, finish
11348    mov     r9, r0                      @ preserve new object
11349    mov     r10, r3                     @ preserve vAA
11350    mov     r0, rSELF
11351    mov     r1, rPC
11352    bl      dvmJitEndTraceSelect        @ (self, pc)
11353    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11354    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11355    SET_VREG(r9, r10)                   @ vAA<- new object
11356    GOTO_OPCODE(ip)                     @ jump to next instruction
11357#endif
11358
11359    /*
11360     * Class initialization required.
11361     *
11362     *  r0 holds class object
11363     */
11364.LOP_NEW_INSTANCE_needinit:
11365    mov     r9, r0                      @ save r0
11366    bl      dvmInitClass                @ initialize class
11367    cmp     r0, #0                      @ check boolean result
11368    mov     r0, r9                      @ restore r0
11369    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
11370    b       common_exceptionThrown      @ failed, deal with init exception
11371
11372    /*
11373     * Resolution required.  This is the least-likely path.
11374     *
11375     *  r1 holds BBBB
11376     */
11377.LOP_NEW_INSTANCE_resolve:
11378    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11379    mov     r2, #0                      @ r2<- false
11380    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11381    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
11382    cmp     r0, #0                      @ got null?
11383    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
11384    b       common_exceptionThrown      @ yes, handle exception
11385
11386/* continuation for OP_NEW_ARRAY */
11387
11388
11389    /*
11390     * Resolve class.  (This is an uncommon case.)
11391     *
11392     *  r1 holds array length
11393     *  r2 holds class ref CCCC
11394     */
11395.LOP_NEW_ARRAY_resolve:
11396    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11397    mov     r9, r1                      @ r9<- length (save)
11398    mov     r1, r2                      @ r1<- CCCC
11399    mov     r2, #0                      @ r2<- false
11400    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11401    bl      dvmResolveClass             @ r0<- call(clazz, ref)
11402    cmp     r0, #0                      @ got null?
11403    mov     r1, r9                      @ r1<- length (restore)
11404    beq     common_exceptionThrown      @ yes, handle exception
11405    @ fall through to OP_NEW_ARRAY_finish
11406
11407    /*
11408     * Finish allocation.
11409     *
11410     *  r0 holds class
11411     *  r1 holds array length
11412     */
11413.LOP_NEW_ARRAY_finish:
11414    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
11415    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
11416    cmp     r0, #0                      @ failed?
11417    mov     r2, rINST, lsr #8           @ r2<- A+
11418    beq     common_exceptionThrown      @ yes, handle the exception
11419    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11420    and     r2, r2, #15                 @ r2<- A
11421    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11422    SET_VREG(r0, r2)                    @ vA<- r0
11423    GOTO_OPCODE(ip)                     @ jump to next instruction
11424
11425/* continuation for OP_FILLED_NEW_ARRAY */
11426
11427    /*
11428     * On entry:
11429     *  r0 holds array class
11430     *  r10 holds AA or BA
11431     */
11432.LOP_FILLED_NEW_ARRAY_continue:
11433    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11434    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11435    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11436    .if     0
11437    mov     r1, r10                     @ r1<- AA (length)
11438    .else
11439    mov     r1, r10, lsr #4             @ r1<- B (length)
11440    .endif
11441    cmp     rINST, #'I'                 @ array of ints?
11442    cmpne   rINST, #'L'                 @ array of objects?
11443    cmpne   rINST, #'['                 @ array of arrays?
11444    mov     r9, r1                      @ save length in r9
11445    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
11446    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11447    cmp     r0, #0                      @ null return?
11448    beq     common_exceptionThrown      @ alloc failed, handle exception
11449
11450    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11451    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11452    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11453    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11454    subs    r9, r9, #1                  @ length--, check for neg
11455    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11456    bmi     2f                          @ was zero, bail
11457
11458    @ copy values from registers into the array
11459    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11460    .if     0
11461    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
114621:  ldr     r3, [r2], #4                @ r3<- *r2++
11463    subs    r9, r9, #1                  @ count--
11464    str     r3, [r0], #4                @ *contents++ = vX
11465    bpl     1b
11466    @ continue at 2
11467    .else
11468    cmp     r9, #4                      @ length was initially 5?
11469    and     r2, r10, #15                @ r2<- A
11470    bne     1f                          @ <= 4 args, branch
11471    GET_VREG(r3, r2)                    @ r3<- vA
11472    sub     r9, r9, #1                  @ count--
11473    str     r3, [r0, #16]               @ contents[4] = vA
114741:  and     r2, r1, #15                 @ r2<- F/E/D/C
11475    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11476    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11477    subs    r9, r9, #1                  @ count--
11478    str     r3, [r0], #4                @ *contents++ = vX
11479    bpl     1b
11480    @ continue at 2
11481    .endif
11482
114832:
11484    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11485    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11486    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11487    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11488    cmp     r1, #'I'                         @ Is int array?
11489    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11490    GOTO_OPCODE(ip)                          @ execute it
11491
11492    /*
11493     * Throw an exception indicating that we have not implemented this
11494     * mode of filled-new-array.
11495     */
11496.LOP_FILLED_NEW_ARRAY_notimpl:
11497    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY
11498    bl      dvmThrowInternalError
11499    b       common_exceptionThrown
11500
11501    /*
11502     * Ideally we'd only define this once, but depending on layout we can
11503     * exceed the range of the load above.
11504     */
11505
11506.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY:
11507    .word   .LstrFilledNewArrayNotImpl
11508
11509/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
11510
11511    /*
11512     * On entry:
11513     *  r0 holds array class
11514     *  r10 holds AA or BA
11515     */
11516.LOP_FILLED_NEW_ARRAY_RANGE_continue:
11517    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11518    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11519    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11520    .if     1
11521    mov     r1, r10                     @ r1<- AA (length)
11522    .else
11523    mov     r1, r10, lsr #4             @ r1<- B (length)
11524    .endif
11525    cmp     rINST, #'I'                 @ array of ints?
11526    cmpne   rINST, #'L'                 @ array of objects?
11527    cmpne   rINST, #'['                 @ array of arrays?
11528    mov     r9, r1                      @ save length in r9
11529    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
11530    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11531    cmp     r0, #0                      @ null return?
11532    beq     common_exceptionThrown      @ alloc failed, handle exception
11533
11534    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11535    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11536    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11537    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11538    subs    r9, r9, #1                  @ length--, check for neg
11539    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11540    bmi     2f                          @ was zero, bail
11541
11542    @ copy values from registers into the array
11543    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11544    .if     1
11545    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
115461:  ldr     r3, [r2], #4                @ r3<- *r2++
11547    subs    r9, r9, #1                  @ count--
11548    str     r3, [r0], #4                @ *contents++ = vX
11549    bpl     1b
11550    @ continue at 2
11551    .else
11552    cmp     r9, #4                      @ length was initially 5?
11553    and     r2, r10, #15                @ r2<- A
11554    bne     1f                          @ <= 4 args, branch
11555    GET_VREG(r3, r2)                    @ r3<- vA
11556    sub     r9, r9, #1                  @ count--
11557    str     r3, [r0, #16]               @ contents[4] = vA
115581:  and     r2, r1, #15                 @ r2<- F/E/D/C
11559    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11560    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11561    subs    r9, r9, #1                  @ count--
11562    str     r3, [r0], #4                @ *contents++ = vX
11563    bpl     1b
11564    @ continue at 2
11565    .endif
11566
115672:
11568    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11569    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11570    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11571    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11572    cmp     r1, #'I'                         @ Is int array?
11573    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11574    GOTO_OPCODE(ip)                          @ execute it
11575
11576    /*
11577     * Throw an exception indicating that we have not implemented this
11578     * mode of filled-new-array.
11579     */
11580.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
11581    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE
11582    bl      dvmThrowInternalError
11583    b       common_exceptionThrown
11584
11585    /*
11586     * Ideally we'd only define this once, but depending on layout we can
11587     * exceed the range of the load above.
11588     */
11589
11590.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE:
11591    .word   .LstrFilledNewArrayNotImpl
11592
11593/* continuation for OP_CMPL_FLOAT */
11594
11595    @ Test for NaN with a second comparison.  EABI forbids testing bit
11596    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
11597    @ make the library call.
11598.LOP_CMPL_FLOAT_gt_or_nan:
11599    mov     r1, r9                      @ reverse order
11600    mov     r0, r10
11601    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
11602    @bleq    common_abort
11603    movcc   r1, #1                      @ (greater than) r1<- 1
11604    bcc     .LOP_CMPL_FLOAT_finish
11605    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
11606    b       .LOP_CMPL_FLOAT_finish
11607
11608
11609#if 0       /* "clasic" form */
11610    FETCH(r0, 1)                        @ r0<- CCBB
11611    and     r2, r0, #255                @ r2<- BB
11612    mov     r3, r0, lsr #8              @ r3<- CC
11613    GET_VREG(r9, r2)                    @ r9<- vBB
11614    GET_VREG(r10, r3)                   @ r10<- vCC
11615    mov     r0, r9                      @ r0<- vBB
11616    mov     r1, r10                     @ r1<- vCC
11617    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
11618    cmp     r0, #0                      @ equal?
11619    movne   r1, #0                      @ yes, result is 0
11620    bne     OP_CMPL_FLOAT_finish
11621    mov     r0, r9                      @ r0<- vBB
11622    mov     r1, r10                     @ r1<- vCC
11623    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
11624    cmp     r0, #0                      @ less than?
11625    b       OP_CMPL_FLOAT_continue
11626@%break
11627
11628OP_CMPL_FLOAT_continue:
11629    mvnne   r1, #0                      @ yes, result is -1
11630    bne     OP_CMPL_FLOAT_finish
11631    mov     r0, r9                      @ r0<- vBB
11632    mov     r1, r10                     @ r1<- vCC
11633    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
11634    cmp     r0, #0                      @ greater than?
11635    beq     OP_CMPL_FLOAT_nan               @ no, must be NaN
11636    mov     r1, #1                      @ yes, result is 1
11637    @ fall through to _finish
11638
11639OP_CMPL_FLOAT_finish:
11640    mov     r3, rINST, lsr #8           @ r3<- AA
11641    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11642    SET_VREG(r1, r3)                    @ vAA<- r1
11643    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11644    GOTO_OPCODE(ip)                     @ jump to next instruction
11645
11646    /*
11647     * This is expected to be uncommon, so we double-branch (once to here,
11648     * again back to _finish).
11649     */
11650OP_CMPL_FLOAT_nan:
11651    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
11652    b       OP_CMPL_FLOAT_finish
11653
11654#endif
11655
11656/* continuation for OP_CMPG_FLOAT */
11657
11658    @ Test for NaN with a second comparison.  EABI forbids testing bit
11659    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
11660    @ make the library call.
11661.LOP_CMPG_FLOAT_gt_or_nan:
11662    mov     r1, r9                      @ reverse order
11663    mov     r0, r10
11664    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
11665    @bleq    common_abort
11666    movcc   r1, #1                      @ (greater than) r1<- 1
11667    bcc     .LOP_CMPG_FLOAT_finish
11668    mov     r1, #1                            @ r1<- 1 or -1 for NaN
11669    b       .LOP_CMPG_FLOAT_finish
11670
11671
11672#if 0       /* "clasic" form */
11673    FETCH(r0, 1)                        @ r0<- CCBB
11674    and     r2, r0, #255                @ r2<- BB
11675    mov     r3, r0, lsr #8              @ r3<- CC
11676    GET_VREG(r9, r2)                    @ r9<- vBB
11677    GET_VREG(r10, r3)                   @ r10<- vCC
11678    mov     r0, r9                      @ r0<- vBB
11679    mov     r1, r10                     @ r1<- vCC
11680    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
11681    cmp     r0, #0                      @ equal?
11682    movne   r1, #0                      @ yes, result is 0
11683    bne     OP_CMPG_FLOAT_finish
11684    mov     r0, r9                      @ r0<- vBB
11685    mov     r1, r10                     @ r1<- vCC
11686    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
11687    cmp     r0, #0                      @ less than?
11688    b       OP_CMPG_FLOAT_continue
11689@%break
11690
11691OP_CMPG_FLOAT_continue:
11692    mvnne   r1, #0                      @ yes, result is -1
11693    bne     OP_CMPG_FLOAT_finish
11694    mov     r0, r9                      @ r0<- vBB
11695    mov     r1, r10                     @ r1<- vCC
11696    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
11697    cmp     r0, #0                      @ greater than?
11698    beq     OP_CMPG_FLOAT_nan               @ no, must be NaN
11699    mov     r1, #1                      @ yes, result is 1
11700    @ fall through to _finish
11701
11702OP_CMPG_FLOAT_finish:
11703    mov     r3, rINST, lsr #8           @ r3<- AA
11704    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11705    SET_VREG(r1, r3)                    @ vAA<- r1
11706    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11707    GOTO_OPCODE(ip)                     @ jump to next instruction
11708
11709    /*
11710     * This is expected to be uncommon, so we double-branch (once to here,
11711     * again back to _finish).
11712     */
11713OP_CMPG_FLOAT_nan:
11714    mov     r1, #1                            @ r1<- 1 or -1 for NaN
11715    b       OP_CMPG_FLOAT_finish
11716
11717#endif
11718
11719/* continuation for OP_CMPL_DOUBLE */
11720
11721    @ Test for NaN with a second comparison.  EABI forbids testing bit
11722    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
11723    @ make the library call.
11724.LOP_CMPL_DOUBLE_gt_or_nan:
11725    ldmia   r10, {r0-r1}                @ reverse order
11726    ldmia   r9, {r2-r3}
11727    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
11728    @bleq    common_abort
11729    movcc   r1, #1                      @ (greater than) r1<- 1
11730    bcc     .LOP_CMPL_DOUBLE_finish
11731    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
11732    b       .LOP_CMPL_DOUBLE_finish
11733
11734/* continuation for OP_CMPG_DOUBLE */
11735
11736    @ Test for NaN with a second comparison.  EABI forbids testing bit
11737    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
11738    @ make the library call.
11739.LOP_CMPG_DOUBLE_gt_or_nan:
11740    ldmia   r10, {r0-r1}                @ reverse order
11741    ldmia   r9, {r2-r3}
11742    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
11743    @bleq    common_abort
11744    movcc   r1, #1                      @ (greater than) r1<- 1
11745    bcc     .LOP_CMPG_DOUBLE_finish
11746    mov     r1, #1                            @ r1<- 1 or -1 for NaN
11747    b       .LOP_CMPG_DOUBLE_finish
11748
11749/* continuation for OP_CMP_LONG */
11750
11751.LOP_CMP_LONG_less:
11752    mvn     r1, #0                      @ r1<- -1
11753    @ Want to cond code the next mov so we can avoid branch, but don't see it;
11754    @ instead, we just replicate the tail end.
11755    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11756    SET_VREG(r1, r9)                    @ vAA<- r1
11757    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11758    GOTO_OPCODE(ip)                     @ jump to next instruction
11759
11760.LOP_CMP_LONG_greater:
11761    mov     r1, #1                      @ r1<- 1
11762    @ fall through to _finish
11763
11764.LOP_CMP_LONG_finish:
11765    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11766    SET_VREG(r1, r9)                    @ vAA<- r1
11767    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11768    GOTO_OPCODE(ip)                     @ jump to next instruction
11769
11770/* continuation for OP_AGET_WIDE */
11771
11772.LOP_AGET_WIDE_finish:
11773    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11774    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11775    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
11776    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11777    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
11778    GOTO_OPCODE(ip)                     @ jump to next instruction
11779
11780/* continuation for OP_APUT_WIDE */
11781
11782.LOP_APUT_WIDE_finish:
11783    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11784    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
11785    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11786    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11787    GOTO_OPCODE(ip)                     @ jump to next instruction
11788
11789/* continuation for OP_APUT_OBJECT */
11790    /*
11791     * On entry:
11792     *  rINST = vBB (arrayObj)
11793     *  r9 = vAA (obj)
11794     *  r10 = offset into array (vBB + vCC * width)
11795     */
11796.LOP_APUT_OBJECT_finish:
11797    cmp     r9, #0                      @ storing null reference?
11798    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
11799    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
11800    ldr     r1, [rINST, #offObject_clazz]  @ r1<- arrayObj->clazz
11801    bl      dvmCanPutArrayElement       @ test object type vs. array type
11802    cmp     r0, #0                      @ okay?
11803    beq     .LOP_APUT_OBJECT_throw           @ no
11804    mov     r1, rINST                   @ r1<- arrayObj
11805    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11806    ldr     r2, [rSELF, #offThread_cardTable]     @ get biased CT base
11807    add     r10, #offArrayObject_contents   @ r0<- pointer to slot
11808    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11809    str     r9, [r10]                   @ vBB[vCC]<- vAA
11810    strb    r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
11811    GOTO_OPCODE(ip)                     @ jump to next instruction
11812.LOP_APUT_OBJECT_skip_check:
11813    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11814    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11815    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
11816    GOTO_OPCODE(ip)                     @ jump to next instruction
11817.LOP_APUT_OBJECT_throw:
11818    @ The types don't match.  We need to throw an ArrayStoreException.
11819    ldr     r0, [r9, #offObject_clazz]
11820    ldr     r1, [rINST, #offObject_clazz]
11821    EXPORT_PC()
11822    bl      dvmThrowArrayStoreExceptionIncompatibleElement
11823    b       common_exceptionThrown
11824
11825/* continuation for OP_IGET */
11826
11827    /*
11828     * Currently:
11829     *  r0 holds resolved field
11830     *  r9 holds object
11831     */
11832.LOP_IGET_finish:
11833    @bl      common_squeak0
11834    cmp     r9, #0                      @ check object for null
11835    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11836    beq     common_errNullObject        @ object was null
11837    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11838    @ no-op                             @ acquiring load
11839    mov     r2, rINST, lsr #8           @ r2<- A+
11840    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11841    and     r2, r2, #15                 @ r2<- A
11842    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11843    SET_VREG(r0, r2)                    @ fp[A]<- r0
11844    GOTO_OPCODE(ip)                     @ jump to next instruction
11845
11846/* continuation for OP_IGET_WIDE */
11847
11848    /*
11849     * Currently:
11850     *  r0 holds resolved field
11851     *  r9 holds object
11852     */
11853.LOP_IGET_WIDE_finish:
11854    cmp     r9, #0                      @ check object for null
11855    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11856    beq     common_errNullObject        @ object was null
11857    .if     0
11858    add     r0, r9, r3                  @ r0<- address of field
11859    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
11860    .else
11861    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
11862    .endif
11863    mov     r2, rINST, lsr #8           @ r2<- A+
11864    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11865    and     r2, r2, #15                 @ r2<- A
11866    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
11867    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11868    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
11869    GOTO_OPCODE(ip)                     @ jump to next instruction
11870
11871/* continuation for OP_IGET_OBJECT */
11872
11873    /*
11874     * Currently:
11875     *  r0 holds resolved field
11876     *  r9 holds object
11877     */
11878.LOP_IGET_OBJECT_finish:
11879    @bl      common_squeak0
11880    cmp     r9, #0                      @ check object for null
11881    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11882    beq     common_errNullObject        @ object was null
11883    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11884    @ no-op                             @ acquiring load
11885    mov     r2, rINST, lsr #8           @ r2<- A+
11886    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11887    and     r2, r2, #15                 @ r2<- A
11888    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11889    SET_VREG(r0, r2)                    @ fp[A]<- r0
11890    GOTO_OPCODE(ip)                     @ jump to next instruction
11891
11892/* continuation for OP_IGET_BOOLEAN */
11893
11894    /*
11895     * Currently:
11896     *  r0 holds resolved field
11897     *  r9 holds object
11898     */
11899.LOP_IGET_BOOLEAN_finish:
11900    @bl      common_squeak1
11901    cmp     r9, #0                      @ check object for null
11902    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11903    beq     common_errNullObject        @ object was null
11904    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11905    @ no-op                             @ acquiring load
11906    mov     r2, rINST, lsr #8           @ r2<- A+
11907    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11908    and     r2, r2, #15                 @ r2<- A
11909    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11910    SET_VREG(r0, r2)                    @ fp[A]<- r0
11911    GOTO_OPCODE(ip)                     @ jump to next instruction
11912
11913/* continuation for OP_IGET_BYTE */
11914
11915    /*
11916     * Currently:
11917     *  r0 holds resolved field
11918     *  r9 holds object
11919     */
11920.LOP_IGET_BYTE_finish:
11921    @bl      common_squeak2
11922    cmp     r9, #0                      @ check object for null
11923    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11924    beq     common_errNullObject        @ object was null
11925    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11926    @ no-op                             @ acquiring load
11927    mov     r2, rINST, lsr #8           @ r2<- A+
11928    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11929    and     r2, r2, #15                 @ r2<- A
11930    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11931    SET_VREG(r0, r2)                    @ fp[A]<- r0
11932    GOTO_OPCODE(ip)                     @ jump to next instruction
11933
11934/* continuation for OP_IGET_CHAR */
11935
11936    /*
11937     * Currently:
11938     *  r0 holds resolved field
11939     *  r9 holds object
11940     */
11941.LOP_IGET_CHAR_finish:
11942    @bl      common_squeak3
11943    cmp     r9, #0                      @ check object for null
11944    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11945    beq     common_errNullObject        @ object was null
11946    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11947    @ no-op                             @ acquiring load
11948    mov     r2, rINST, lsr #8           @ r2<- A+
11949    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11950    and     r2, r2, #15                 @ r2<- A
11951    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11952    SET_VREG(r0, r2)                    @ fp[A]<- r0
11953    GOTO_OPCODE(ip)                     @ jump to next instruction
11954
11955/* continuation for OP_IGET_SHORT */
11956
11957    /*
11958     * Currently:
11959     *  r0 holds resolved field
11960     *  r9 holds object
11961     */
11962.LOP_IGET_SHORT_finish:
11963    @bl      common_squeak4
11964    cmp     r9, #0                      @ check object for null
11965    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11966    beq     common_errNullObject        @ object was null
11967    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11968    @ no-op                             @ acquiring load
11969    mov     r2, rINST, lsr #8           @ r2<- A+
11970    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11971    and     r2, r2, #15                 @ r2<- A
11972    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11973    SET_VREG(r0, r2)                    @ fp[A]<- r0
11974    GOTO_OPCODE(ip)                     @ jump to next instruction
11975
11976/* continuation for OP_IPUT */
11977
11978    /*
11979     * Currently:
11980     *  r0 holds resolved field
11981     *  r9 holds object
11982     */
11983.LOP_IPUT_finish:
11984    @bl      common_squeak0
11985    mov     r1, rINST, lsr #8           @ r1<- A+
11986    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11987    and     r1, r1, #15                 @ r1<- A
11988    cmp     r9, #0                      @ check object for null
11989    GET_VREG(r0, r1)                    @ r0<- fp[A]
11990    beq     common_errNullObject        @ object was null
11991    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11992    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11993    @ no-op                         @ releasing store
11994    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11995    @ no-op
11996    GOTO_OPCODE(ip)                     @ jump to next instruction
11997
11998/* continuation for OP_IPUT_WIDE */
11999
12000    /*
12001     * Currently:
12002     *  r0 holds resolved field
12003     *  r9 holds object
12004     */
12005.LOP_IPUT_WIDE_finish:
12006    mov     r2, rINST, lsr #8           @ r2<- A+
12007    cmp     r9, #0                      @ check object for null
12008    and     r2, r2, #15                 @ r2<- A
12009    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12010    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
12011    beq     common_errNullObject        @ object was null
12012    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12013    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
12014    GET_INST_OPCODE(r10)                @ extract opcode from rINST
12015    .if     0
12016    add     r2, r9, r3                  @ r2<- target address
12017    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
12018    .else
12019    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
12020    .endif
12021    GOTO_OPCODE(r10)                    @ jump to next instruction
12022
12023/* continuation for OP_IPUT_OBJECT */
12024
12025    /*
12026     * Currently:
12027     *  r0 holds resolved field
12028     *  r9 holds object
12029     */
12030.LOP_IPUT_OBJECT_finish:
12031    @bl      common_squeak0
12032    mov     r1, rINST, lsr #8           @ r1<- A+
12033    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12034    and     r1, r1, #15                 @ r1<- A
12035    cmp     r9, #0                      @ check object for null
12036    GET_VREG(r0, r1)                    @ r0<- fp[A]
12037    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
12038    beq     common_errNullObject        @ object was null
12039    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12040    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12041    @ no-op                         @ releasing store
12042    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
12043    @ no-op
12044    cmp     r0, #0                      @ stored a null reference?
12045    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
12046    GOTO_OPCODE(ip)                     @ jump to next instruction
12047
12048/* continuation for OP_IPUT_BOOLEAN */
12049
12050    /*
12051     * Currently:
12052     *  r0 holds resolved field
12053     *  r9 holds object
12054     */
12055.LOP_IPUT_BOOLEAN_finish:
12056    @bl      common_squeak1
12057    mov     r1, rINST, lsr #8           @ r1<- A+
12058    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12059    and     r1, r1, #15                 @ r1<- A
12060    cmp     r9, #0                      @ check object for null
12061    GET_VREG(r0, r1)                    @ r0<- fp[A]
12062    beq     common_errNullObject        @ object was null
12063    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12064    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12065    @ no-op                         @ releasing store
12066    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12067    @ no-op
12068    GOTO_OPCODE(ip)                     @ jump to next instruction
12069
12070/* continuation for OP_IPUT_BYTE */
12071
12072    /*
12073     * Currently:
12074     *  r0 holds resolved field
12075     *  r9 holds object
12076     */
12077.LOP_IPUT_BYTE_finish:
12078    @bl      common_squeak2
12079    mov     r1, rINST, lsr #8           @ r1<- A+
12080    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12081    and     r1, r1, #15                 @ r1<- A
12082    cmp     r9, #0                      @ check object for null
12083    GET_VREG(r0, r1)                    @ r0<- fp[A]
12084    beq     common_errNullObject        @ object was null
12085    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12086    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12087    @ no-op                         @ releasing store
12088    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12089    @ no-op
12090    GOTO_OPCODE(ip)                     @ jump to next instruction
12091
12092/* continuation for OP_IPUT_CHAR */
12093
12094    /*
12095     * Currently:
12096     *  r0 holds resolved field
12097     *  r9 holds object
12098     */
12099.LOP_IPUT_CHAR_finish:
12100    @bl      common_squeak3
12101    mov     r1, rINST, lsr #8           @ r1<- A+
12102    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12103    and     r1, r1, #15                 @ r1<- A
12104    cmp     r9, #0                      @ check object for null
12105    GET_VREG(r0, r1)                    @ r0<- fp[A]
12106    beq     common_errNullObject        @ object was null
12107    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12108    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12109    @ no-op                         @ releasing store
12110    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12111    @ no-op
12112    GOTO_OPCODE(ip)                     @ jump to next instruction
12113
12114/* continuation for OP_IPUT_SHORT */
12115
12116    /*
12117     * Currently:
12118     *  r0 holds resolved field
12119     *  r9 holds object
12120     */
12121.LOP_IPUT_SHORT_finish:
12122    @bl      common_squeak4
12123    mov     r1, rINST, lsr #8           @ r1<- A+
12124    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12125    and     r1, r1, #15                 @ r1<- A
12126    cmp     r9, #0                      @ check object for null
12127    GET_VREG(r0, r1)                    @ r0<- fp[A]
12128    beq     common_errNullObject        @ object was null
12129    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12130    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12131    @ no-op                         @ releasing store
12132    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12133    @ no-op
12134    GOTO_OPCODE(ip)                     @ jump to next instruction
12135
12136/* continuation for OP_SGET */
12137
12138    /*
12139     * Continuation if the field has not yet been resolved.
12140     *  r1:  BBBB field ref
12141     *  r10: dvmDex->pResFields
12142     */
12143.LOP_SGET_resolve:
12144    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12145#if defined(WITH_JIT)
12146    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12147#endif
12148    EXPORT_PC()                         @ resolve() could throw, so export now
12149    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12150    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12151    cmp     r0, #0                      @ success?
12152    beq     common_exceptionThrown      @ no, handle exception
12153#if defined(WITH_JIT)
12154    /*
12155     * If the JIT is actively building a trace we need to make sure
12156     * that the field is fully resolved before including this instruction.
12157     */
12158    bl      common_verifyField
12159#endif
12160    b       .LOP_SGET_finish
12161
12162/* continuation for OP_SGET_WIDE */
12163
12164    /*
12165     * Continuation if the field has not yet been resolved.
12166     *  r1:  BBBB field ref
12167     *  r10: dvmDex->pResFields
12168     *
12169     * Returns StaticField pointer in r0.
12170     */
12171.LOP_SGET_WIDE_resolve:
12172    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12173#if defined(WITH_JIT)
12174    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
12175#endif
12176    EXPORT_PC()                         @ resolve() could throw, so export now
12177    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12178    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12179    cmp     r0, #0                      @ success?
12180    beq     common_exceptionThrown      @ no, handle exception
12181#if defined(WITH_JIT)
12182    /*
12183     * If the JIT is actively building a trace we need to make sure
12184     * that the field is fully resolved before including this instruction.
12185     */
12186    bl      common_verifyField
12187#endif
12188    b       .LOP_SGET_WIDE_finish          @ resume
12189
12190/* continuation for OP_SGET_OBJECT */
12191
12192    /*
12193     * Continuation if the field has not yet been resolved.
12194     *  r1:  BBBB field ref
12195     *  r10: dvmDex->pResFields
12196     */
12197.LOP_SGET_OBJECT_resolve:
12198    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12199#if defined(WITH_JIT)
12200    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12201#endif
12202    EXPORT_PC()                         @ resolve() could throw, so export now
12203    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12204    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12205    cmp     r0, #0                      @ success?
12206    beq     common_exceptionThrown      @ no, handle exception
12207#if defined(WITH_JIT)
12208    /*
12209     * If the JIT is actively building a trace we need to make sure
12210     * that the field is fully resolved before including this instruction.
12211     */
12212    bl      common_verifyField
12213#endif
12214    b       .LOP_SGET_OBJECT_finish
12215
12216/* continuation for OP_SGET_BOOLEAN */
12217
12218    /*
12219     * Continuation if the field has not yet been resolved.
12220     *  r1:  BBBB field ref
12221     *  r10: dvmDex->pResFields
12222     */
12223.LOP_SGET_BOOLEAN_resolve:
12224    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12225#if defined(WITH_JIT)
12226    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12227#endif
12228    EXPORT_PC()                         @ resolve() could throw, so export now
12229    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12230    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12231    cmp     r0, #0                      @ success?
12232    beq     common_exceptionThrown      @ no, handle exception
12233#if defined(WITH_JIT)
12234    /*
12235     * If the JIT is actively building a trace we need to make sure
12236     * that the field is fully resolved before including this instruction.
12237     */
12238    bl      common_verifyField
12239#endif
12240    b       .LOP_SGET_BOOLEAN_finish
12241
12242/* continuation for OP_SGET_BYTE */
12243
12244    /*
12245     * Continuation if the field has not yet been resolved.
12246     *  r1:  BBBB field ref
12247     *  r10: dvmDex->pResFields
12248     */
12249.LOP_SGET_BYTE_resolve:
12250    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12251#if defined(WITH_JIT)
12252    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12253#endif
12254    EXPORT_PC()                         @ resolve() could throw, so export now
12255    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12256    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12257    cmp     r0, #0                      @ success?
12258    beq     common_exceptionThrown      @ no, handle exception
12259#if defined(WITH_JIT)
12260    /*
12261     * If the JIT is actively building a trace we need to make sure
12262     * that the field is fully resolved before including this instruction.
12263     */
12264    bl      common_verifyField
12265#endif
12266    b       .LOP_SGET_BYTE_finish
12267
12268/* continuation for OP_SGET_CHAR */
12269
12270    /*
12271     * Continuation if the field has not yet been resolved.
12272     *  r1:  BBBB field ref
12273     *  r10: dvmDex->pResFields
12274     */
12275.LOP_SGET_CHAR_resolve:
12276    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12277#if defined(WITH_JIT)
12278    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12279#endif
12280    EXPORT_PC()                         @ resolve() could throw, so export now
12281    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12282    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12283    cmp     r0, #0                      @ success?
12284    beq     common_exceptionThrown      @ no, handle exception
12285#if defined(WITH_JIT)
12286    /*
12287     * If the JIT is actively building a trace we need to make sure
12288     * that the field is fully resolved before including this instruction.
12289     */
12290    bl      common_verifyField
12291#endif
12292    b       .LOP_SGET_CHAR_finish
12293
12294/* continuation for OP_SGET_SHORT */
12295
12296    /*
12297     * Continuation if the field has not yet been resolved.
12298     *  r1:  BBBB field ref
12299     *  r10: dvmDex->pResFields
12300     */
12301.LOP_SGET_SHORT_resolve:
12302    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12303#if defined(WITH_JIT)
12304    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12305#endif
12306    EXPORT_PC()                         @ resolve() could throw, so export now
12307    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12308    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12309    cmp     r0, #0                      @ success?
12310    beq     common_exceptionThrown      @ no, handle exception
12311#if defined(WITH_JIT)
12312    /*
12313     * If the JIT is actively building a trace we need to make sure
12314     * that the field is fully resolved before including this instruction.
12315     */
12316    bl      common_verifyField
12317#endif
12318    b       .LOP_SGET_SHORT_finish
12319
12320/* continuation for OP_SPUT */
12321
12322    /*
12323     * Continuation if the field has not yet been resolved.
12324     *  r1:  BBBB field ref
12325     *  r10: dvmDex->pResFields
12326     */
12327.LOP_SPUT_resolve:
12328    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12329#if defined(WITH_JIT)
12330    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12331#endif
12332    EXPORT_PC()                         @ resolve() could throw, so export now
12333    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12334    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12335    cmp     r0, #0                      @ success?
12336    beq     common_exceptionThrown      @ no, handle exception
12337#if defined(WITH_JIT)
12338    /*
12339     * If the JIT is actively building a trace we need to make sure
12340     * that the field is fully resolved before including this instruction.
12341     */
12342    bl      common_verifyField
12343#endif
12344    b       .LOP_SPUT_finish          @ resume
12345
12346/* continuation for OP_SPUT_WIDE */
12347
12348    /*
12349     * Continuation if the field has not yet been resolved.
12350     *  r1:  BBBB field ref
12351     *  r9:  &fp[AA]
12352     *  r10: dvmDex->pResFields
12353     *
12354     * Returns StaticField pointer in r2.
12355     */
12356.LOP_SPUT_WIDE_resolve:
12357    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12358#if defined(WITH_JIT)
12359    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12360#endif
12361    EXPORT_PC()                         @ resolve() could throw, so export now
12362    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12363    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12364    cmp     r0, #0                      @ success?
12365    mov     r2, r0                      @ copy to r2
12366    beq     common_exceptionThrown      @ no, handle exception
12367#if defined(WITH_JIT)
12368    /*
12369     * If the JIT is actively building a trace we need to make sure
12370     * that the field is fully resolved before including this instruction.
12371     */
12372    bl      common_verifyField
12373#endif
12374    b       .LOP_SPUT_WIDE_finish          @ resume
12375
12376/* continuation for OP_SPUT_OBJECT */
12377
12378
12379.LOP_SPUT_OBJECT_end:
12380    str     r1, [r0, #offStaticField_value]  @ field<- vAA
12381    @ no-op
12382    cmp     r1, #0                      @ stored a null object?
12383    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
12384    GOTO_OPCODE(ip)                     @ jump to next instruction
12385
12386    /* Continuation if the field has not yet been resolved.
12387     * r1:  BBBB field ref
12388     * r10: dvmDex->pResFields
12389     */
12390.LOP_SPUT_OBJECT_resolve:
12391    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12392#if defined(WITH_JIT)
12393    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12394#endif
12395    EXPORT_PC()                         @ resolve() could throw, so export now
12396    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12397    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12398    cmp     r0, #0                      @ success?
12399    beq     common_exceptionThrown      @ no, handle exception
12400#if defined(WITH_JIT)
12401    /*
12402     * If the JIT is actively building a trace we need to make sure
12403     * that the field is fully resolved before including this instruction.
12404     */
12405    bl      common_verifyField
12406#endif
12407    b       .LOP_SPUT_OBJECT_finish          @ resume
12408
12409
12410/* continuation for OP_SPUT_BOOLEAN */
12411
12412    /*
12413     * Continuation if the field has not yet been resolved.
12414     *  r1:  BBBB field ref
12415     *  r10: dvmDex->pResFields
12416     */
12417.LOP_SPUT_BOOLEAN_resolve:
12418    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12419#if defined(WITH_JIT)
12420    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12421#endif
12422    EXPORT_PC()                         @ resolve() could throw, so export now
12423    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12424    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12425    cmp     r0, #0                      @ success?
12426    beq     common_exceptionThrown      @ no, handle exception
12427#if defined(WITH_JIT)
12428    /*
12429     * If the JIT is actively building a trace we need to make sure
12430     * that the field is fully resolved before including this instruction.
12431     */
12432    bl      common_verifyField
12433#endif
12434    b       .LOP_SPUT_BOOLEAN_finish          @ resume
12435
12436/* continuation for OP_SPUT_BYTE */
12437
12438    /*
12439     * Continuation if the field has not yet been resolved.
12440     *  r1:  BBBB field ref
12441     *  r10: dvmDex->pResFields
12442     */
12443.LOP_SPUT_BYTE_resolve:
12444    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12445#if defined(WITH_JIT)
12446    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12447#endif
12448    EXPORT_PC()                         @ resolve() could throw, so export now
12449    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12450    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12451    cmp     r0, #0                      @ success?
12452    beq     common_exceptionThrown      @ no, handle exception
12453#if defined(WITH_JIT)
12454    /*
12455     * If the JIT is actively building a trace we need to make sure
12456     * that the field is fully resolved before including this instruction.
12457     */
12458    bl      common_verifyField
12459#endif
12460    b       .LOP_SPUT_BYTE_finish          @ resume
12461
12462/* continuation for OP_SPUT_CHAR */
12463
12464    /*
12465     * Continuation if the field has not yet been resolved.
12466     *  r1:  BBBB field ref
12467     *  r10: dvmDex->pResFields
12468     */
12469.LOP_SPUT_CHAR_resolve:
12470    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12471#if defined(WITH_JIT)
12472    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12473#endif
12474    EXPORT_PC()                         @ resolve() could throw, so export now
12475    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12476    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12477    cmp     r0, #0                      @ success?
12478    beq     common_exceptionThrown      @ no, handle exception
12479#if defined(WITH_JIT)
12480    /*
12481     * If the JIT is actively building a trace we need to make sure
12482     * that the field is fully resolved before including this instruction.
12483     */
12484    bl      common_verifyField
12485#endif
12486    b       .LOP_SPUT_CHAR_finish          @ resume
12487
12488/* continuation for OP_SPUT_SHORT */
12489
12490    /*
12491     * Continuation if the field has not yet been resolved.
12492     *  r1:  BBBB field ref
12493     *  r10: dvmDex->pResFields
12494     */
12495.LOP_SPUT_SHORT_resolve:
12496    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12497#if defined(WITH_JIT)
12498    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12499#endif
12500    EXPORT_PC()                         @ resolve() could throw, so export now
12501    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12502    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12503    cmp     r0, #0                      @ success?
12504    beq     common_exceptionThrown      @ no, handle exception
12505#if defined(WITH_JIT)
12506    /*
12507     * If the JIT is actively building a trace we need to make sure
12508     * that the field is fully resolved before including this instruction.
12509     */
12510    bl      common_verifyField
12511#endif
12512    b       .LOP_SPUT_SHORT_finish          @ resume
12513
12514/* continuation for OP_INVOKE_VIRTUAL */
12515
12516    /*
12517     * At this point:
12518     *  r0 = resolved base method
12519     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
12520     */
12521.LOP_INVOKE_VIRTUAL_continue:
12522    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12523    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12524    cmp     r9, #0                      @ is "this" null?
12525    beq     common_errNullObject        @ null "this", throw exception
12526    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12527    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12528    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12529    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
12530
12531/* continuation for OP_INVOKE_SUPER */
12532
12533    /*
12534     * At this point:
12535     *  r0 = resolved base method
12536     *  r10 = method->clazz
12537     */
12538.LOP_INVOKE_SUPER_continue:
12539    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12540    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12541    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12542    EXPORT_PC()                         @ must export for invoke
12543    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12544    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
12545    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12546    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12547    bl      common_invokeMethodNoRange @ continue on
12548
12549.LOP_INVOKE_SUPER_resolve:
12550    mov     r0, r10                     @ r0<- method->clazz
12551    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12552    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12553    cmp     r0, #0                      @ got null?
12554    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
12555    b       common_exceptionThrown      @ yes, handle exception
12556
12557    /*
12558     * Throw a NoSuchMethodError with the method name as the message.
12559     *  r0 = resolved base method
12560     */
12561.LOP_INVOKE_SUPER_nsm:
12562    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12563    b       common_errNoSuchMethod
12564
12565/* continuation for OP_INVOKE_DIRECT */
12566
12567    /*
12568     * On entry:
12569     *  r1 = reference (BBBB or CCCC)
12570     *  r10 = "this" register
12571     */
12572.LOP_INVOKE_DIRECT_resolve:
12573    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12574    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12575    mov     r2, #METHOD_DIRECT          @ resolver method type
12576    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12577    cmp     r0, #0                      @ got null?
12578    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
12579    b       common_exceptionThrown      @ yes, handle exception
12580
12581/* continuation for OP_INVOKE_STATIC */
12582
12583
12584.LOP_INVOKE_STATIC_resolve:
12585    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12586    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12587    mov     r2, #METHOD_STATIC          @ resolver method type
12588    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12589    cmp     r0, #0                      @ got null?
12590#if defined(WITH_JIT)
12591    /*
12592     * Check to see if we're actively building a trace.  If so,
12593     * we need to keep this instruction out of it.
12594     * r10: &resolved_methodToCall
12595     */
12596    ldrh    r2, [rSELF, #offThread_subMode]
12597    beq     common_exceptionThrown            @ null, handle exception
12598    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12599    beq     common_invokeMethodNoRange     @ no (r0=method, r9="this")
12600    ldr     r1, [r10]                         @ reload resolved method
12601    cmp     r1, #0                            @ finished resolving?
12602    bne     common_invokeMethodNoRange     @ yes (r0=method, r9="this")
12603    mov     r10, r0                           @ preserve method
12604    mov     r0, rSELF
12605    mov     r1, rPC
12606    bl      dvmJitEndTraceSelect              @ (self, pc)
12607    mov     r0, r10
12608    b       common_invokeMethodNoRange     @ whew, finally!
12609#else
12610    bne     common_invokeMethodNoRange     @ (r0=method, r9="this")
12611    b       common_exceptionThrown            @ yes, handle exception
12612#endif
12613
12614/* continuation for OP_INVOKE_VIRTUAL_RANGE */
12615
12616    /*
12617     * At this point:
12618     *  r0 = resolved base method
12619     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
12620     */
12621.LOP_INVOKE_VIRTUAL_RANGE_continue:
12622    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12623    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12624    cmp     r9, #0                      @ is "this" null?
12625    beq     common_errNullObject        @ null "this", throw exception
12626    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12627    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12628    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12629    bl      common_invokeMethodRange @ (r0=method, r9="this")
12630
12631/* continuation for OP_INVOKE_SUPER_RANGE */
12632
12633    /*
12634     * At this point:
12635     *  r0 = resolved base method
12636     *  r10 = method->clazz
12637     */
12638.LOP_INVOKE_SUPER_RANGE_continue:
12639    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12640    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12641    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12642    EXPORT_PC()                         @ must export for invoke
12643    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12644    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
12645    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12646    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12647    bl      common_invokeMethodRange @ continue on
12648
12649.LOP_INVOKE_SUPER_RANGE_resolve:
12650    mov     r0, r10                     @ r0<- method->clazz
12651    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12652    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12653    cmp     r0, #0                      @ got null?
12654    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
12655    b       common_exceptionThrown      @ yes, handle exception
12656
12657    /*
12658     * Throw a NoSuchMethodError with the method name as the message.
12659     *  r0 = resolved base method
12660     */
12661.LOP_INVOKE_SUPER_RANGE_nsm:
12662    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12663    b       common_errNoSuchMethod
12664
12665/* continuation for OP_INVOKE_DIRECT_RANGE */
12666
12667    /*
12668     * On entry:
12669     *  r1 = reference (BBBB or CCCC)
12670     *  r10 = "this" register
12671     */
12672.LOP_INVOKE_DIRECT_RANGE_resolve:
12673    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12674    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12675    mov     r2, #METHOD_DIRECT          @ resolver method type
12676    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12677    cmp     r0, #0                      @ got null?
12678    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
12679    b       common_exceptionThrown      @ yes, handle exception
12680
12681/* continuation for OP_INVOKE_STATIC_RANGE */
12682
12683
12684.LOP_INVOKE_STATIC_RANGE_resolve:
12685    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12686    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12687    mov     r2, #METHOD_STATIC          @ resolver method type
12688    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12689    cmp     r0, #0                      @ got null?
12690#if defined(WITH_JIT)
12691    /*
12692     * Check to see if we're actively building a trace.  If so,
12693     * we need to keep this instruction out of it.
12694     * r10: &resolved_methodToCall
12695     */
12696    ldrh    r2, [rSELF, #offThread_subMode]
12697    beq     common_exceptionThrown            @ null, handle exception
12698    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12699    beq     common_invokeMethodRange     @ no (r0=method, r9="this")
12700    ldr     r1, [r10]                         @ reload resolved method
12701    cmp     r1, #0                            @ finished resolving?
12702    bne     common_invokeMethodRange     @ yes (r0=method, r9="this")
12703    mov     r10, r0                           @ preserve method
12704    mov     r0, rSELF
12705    mov     r1, rPC
12706    bl      dvmJitEndTraceSelect              @ (self, pc)
12707    mov     r0, r10
12708    b       common_invokeMethodRange     @ whew, finally!
12709#else
12710    bne     common_invokeMethodRange     @ (r0=method, r9="this")
12711    b       common_exceptionThrown            @ yes, handle exception
12712#endif
12713
12714/* continuation for OP_FLOAT_TO_LONG */
12715/*
12716 * Convert the float in r0 to a long in r0/r1.
12717 *
12718 * We have to clip values to long min/max per the specification.  The
12719 * expected common case is a "reasonable" value that converts directly
12720 * to modest integer.  The EABI convert function isn't doing this for us.
12721 */
12722f2l_doconv:
12723    stmfd   sp!, {r4, lr}
12724    mov     r1, #0x5f000000             @ (float)maxlong
12725    mov     r4, r0
12726    bl      __aeabi_fcmpge              @ is arg >= maxlong?
12727    cmp     r0, #0                      @ nonzero == yes
12728    mvnne   r0, #0                      @ return maxlong (7fffffff)
12729    mvnne   r1, #0x80000000
12730    ldmnefd sp!, {r4, pc}
12731
12732    mov     r0, r4                      @ recover arg
12733    mov     r1, #0xdf000000             @ (float)minlong
12734    bl      __aeabi_fcmple              @ is arg <= minlong?
12735    cmp     r0, #0                      @ nonzero == yes
12736    movne   r0, #0                      @ return minlong (80000000)
12737    movne   r1, #0x80000000
12738    ldmnefd sp!, {r4, pc}
12739
12740    mov     r0, r4                      @ recover arg
12741    mov     r1, r4
12742    bl      __aeabi_fcmpeq              @ is arg == self?
12743    cmp     r0, #0                      @ zero == no
12744    moveq   r1, #0                      @ return zero for NaN
12745    ldmeqfd sp!, {r4, pc}
12746
12747    mov     r0, r4                      @ recover arg
12748    bl      __aeabi_f2lz                @ convert float to long
12749    ldmfd   sp!, {r4, pc}
12750
12751/* continuation for OP_DOUBLE_TO_LONG */
12752/*
12753 * Convert the double in r0/r1 to a long in r0/r1.
12754 *
12755 * We have to clip values to long min/max per the specification.  The
12756 * expected common case is a "reasonable" value that converts directly
12757 * to modest integer.  The EABI convert function isn't doing this for us.
12758 */
12759d2l_doconv:
12760    stmfd   sp!, {r4, r5, lr}           @ save regs
12761    mov     r3, #0x43000000             @ maxlong, as a double (high word)
12762    add     r3, #0x00e00000             @  0x43e00000
12763    mov     r2, #0                      @ maxlong, as a double (low word)
12764    sub     sp, sp, #4                  @ align for EABI
12765    mov     r4, r0                      @ save a copy of r0
12766    mov     r5, r1                      @  and r1
12767    bl      __aeabi_dcmpge              @ is arg >= maxlong?
12768    cmp     r0, #0                      @ nonzero == yes
12769    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
12770    mvnne   r1, #0x80000000
12771    bne     1f
12772
12773    mov     r0, r4                      @ recover arg
12774    mov     r1, r5
12775    mov     r3, #0xc3000000             @ minlong, as a double (high word)
12776    add     r3, #0x00e00000             @  0xc3e00000
12777    mov     r2, #0                      @ minlong, as a double (low word)
12778    bl      __aeabi_dcmple              @ is arg <= minlong?
12779    cmp     r0, #0                      @ nonzero == yes
12780    movne   r0, #0                      @ return minlong (8000000000000000)
12781    movne   r1, #0x80000000
12782    bne     1f
12783
12784    mov     r0, r4                      @ recover arg
12785    mov     r1, r5
12786    mov     r2, r4                      @ compare against self
12787    mov     r3, r5
12788    bl      __aeabi_dcmpeq              @ is arg == self?
12789    cmp     r0, #0                      @ zero == no
12790    moveq   r1, #0                      @ return zero for NaN
12791    beq     1f
12792
12793    mov     r0, r4                      @ recover arg
12794    mov     r1, r5
12795    bl      __aeabi_d2lz                @ convert double to long
12796
127971:
12798    add     sp, sp, #4
12799    ldmfd   sp!, {r4, r5, pc}
12800
12801/* continuation for OP_MUL_LONG */
12802
12803.LOP_MUL_LONG_finish:
12804    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12805    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
12806    GOTO_OPCODE(ip)                     @ jump to next instruction
12807
12808/* continuation for OP_SHL_LONG */
12809
12810.LOP_SHL_LONG_finish:
12811    mov     r0, r0, asl r2              @  r0<- r0 << r2
12812    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12813    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12814    GOTO_OPCODE(ip)                     @ jump to next instruction
12815
12816/* continuation for OP_SHR_LONG */
12817
12818.LOP_SHR_LONG_finish:
12819    mov     r1, r1, asr r2              @  r1<- r1 >> r2
12820    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12821    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12822    GOTO_OPCODE(ip)                     @ jump to next instruction
12823
12824/* continuation for OP_USHR_LONG */
12825
12826.LOP_USHR_LONG_finish:
12827    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
12828    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12829    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12830    GOTO_OPCODE(ip)                     @ jump to next instruction
12831
12832/* continuation for OP_SHL_LONG_2ADDR */
12833
12834.LOP_SHL_LONG_2ADDR_finish:
12835    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12836    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12837    GOTO_OPCODE(ip)                     @ jump to next instruction
12838
12839/* continuation for OP_SHR_LONG_2ADDR */
12840
12841.LOP_SHR_LONG_2ADDR_finish:
12842    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12843    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12844    GOTO_OPCODE(ip)                     @ jump to next instruction
12845
12846/* continuation for OP_USHR_LONG_2ADDR */
12847
12848.LOP_USHR_LONG_2ADDR_finish:
12849    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12850    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12851    GOTO_OPCODE(ip)                     @ jump to next instruction
12852
12853/* continuation for OP_IGET_VOLATILE */
12854
12855    /*
12856     * Currently:
12857     *  r0 holds resolved field
12858     *  r9 holds object
12859     */
12860.LOP_IGET_VOLATILE_finish:
12861    @bl      common_squeak0
12862    cmp     r9, #0                      @ check object for null
12863    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12864    beq     common_errNullObject        @ object was null
12865    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12866    SMP_DMB                            @ acquiring load
12867    mov     r2, rINST, lsr #8           @ r2<- A+
12868    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12869    and     r2, r2, #15                 @ r2<- A
12870    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12871    SET_VREG(r0, r2)                    @ fp[A]<- r0
12872    GOTO_OPCODE(ip)                     @ jump to next instruction
12873
12874/* continuation for OP_IPUT_VOLATILE */
12875
12876    /*
12877     * Currently:
12878     *  r0 holds resolved field
12879     *  r9 holds object
12880     */
12881.LOP_IPUT_VOLATILE_finish:
12882    @bl      common_squeak0
12883    mov     r1, rINST, lsr #8           @ r1<- A+
12884    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12885    and     r1, r1, #15                 @ r1<- A
12886    cmp     r9, #0                      @ check object for null
12887    GET_VREG(r0, r1)                    @ r0<- fp[A]
12888    beq     common_errNullObject        @ object was null
12889    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12890    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12891    SMP_DMB_ST                        @ releasing store
12892    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12893    SMP_DMB
12894    GOTO_OPCODE(ip)                     @ jump to next instruction
12895
12896/* continuation for OP_SGET_VOLATILE */
12897
12898    /*
12899     * Continuation if the field has not yet been resolved.
12900     *  r1:  BBBB field ref
12901     *  r10: dvmDex->pResFields
12902     */
12903.LOP_SGET_VOLATILE_resolve:
12904    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12905#if defined(WITH_JIT)
12906    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12907#endif
12908    EXPORT_PC()                         @ resolve() could throw, so export now
12909    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12910    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12911    cmp     r0, #0                      @ success?
12912    beq     common_exceptionThrown      @ no, handle exception
12913#if defined(WITH_JIT)
12914    /*
12915     * If the JIT is actively building a trace we need to make sure
12916     * that the field is fully resolved before including this instruction.
12917     */
12918    bl      common_verifyField
12919#endif
12920    b       .LOP_SGET_VOLATILE_finish
12921
12922/* continuation for OP_SPUT_VOLATILE */
12923
12924    /*
12925     * Continuation if the field has not yet been resolved.
12926     *  r1:  BBBB field ref
12927     *  r10: dvmDex->pResFields
12928     */
12929.LOP_SPUT_VOLATILE_resolve:
12930    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12931#if defined(WITH_JIT)
12932    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12933#endif
12934    EXPORT_PC()                         @ resolve() could throw, so export now
12935    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12936    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12937    cmp     r0, #0                      @ success?
12938    beq     common_exceptionThrown      @ no, handle exception
12939#if defined(WITH_JIT)
12940    /*
12941     * If the JIT is actively building a trace we need to make sure
12942     * that the field is fully resolved before including this instruction.
12943     */
12944    bl      common_verifyField
12945#endif
12946    b       .LOP_SPUT_VOLATILE_finish          @ resume
12947
12948/* continuation for OP_IGET_OBJECT_VOLATILE */
12949
12950    /*
12951     * Currently:
12952     *  r0 holds resolved field
12953     *  r9 holds object
12954     */
12955.LOP_IGET_OBJECT_VOLATILE_finish:
12956    @bl      common_squeak0
12957    cmp     r9, #0                      @ check object for null
12958    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12959    beq     common_errNullObject        @ object was null
12960    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12961    SMP_DMB                            @ acquiring load
12962    mov     r2, rINST, lsr #8           @ r2<- A+
12963    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12964    and     r2, r2, #15                 @ r2<- A
12965    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12966    SET_VREG(r0, r2)                    @ fp[A]<- r0
12967    GOTO_OPCODE(ip)                     @ jump to next instruction
12968
12969/* continuation for OP_IGET_WIDE_VOLATILE */
12970
12971    /*
12972     * Currently:
12973     *  r0 holds resolved field
12974     *  r9 holds object
12975     */
12976.LOP_IGET_WIDE_VOLATILE_finish:
12977    cmp     r9, #0                      @ check object for null
12978    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12979    beq     common_errNullObject        @ object was null
12980    .if     1
12981    add     r0, r9, r3                  @ r0<- address of field
12982    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
12983    .else
12984    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
12985    .endif
12986    mov     r2, rINST, lsr #8           @ r2<- A+
12987    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12988    and     r2, r2, #15                 @ r2<- A
12989    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
12990    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12991    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
12992    GOTO_OPCODE(ip)                     @ jump to next instruction
12993
12994/* continuation for OP_IPUT_WIDE_VOLATILE */
12995
12996    /*
12997     * Currently:
12998     *  r0 holds resolved field
12999     *  r9 holds object
13000     */
13001.LOP_IPUT_WIDE_VOLATILE_finish:
13002    mov     r2, rINST, lsr #8           @ r2<- A+
13003    cmp     r9, #0                      @ check object for null
13004    and     r2, r2, #15                 @ r2<- A
13005    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13006    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
13007    beq     common_errNullObject        @ object was null
13008    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
13009    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
13010    GET_INST_OPCODE(r10)                @ extract opcode from rINST
13011    .if     1
13012    add     r2, r9, r3                  @ r2<- target address
13013    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
13014    .else
13015    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
13016    .endif
13017    GOTO_OPCODE(r10)                    @ jump to next instruction
13018
13019/* continuation for OP_SGET_WIDE_VOLATILE */
13020
13021    /*
13022     * Continuation if the field has not yet been resolved.
13023     *  r1:  BBBB field ref
13024     *  r10: dvmDex->pResFields
13025     *
13026     * Returns StaticField pointer in r0.
13027     */
13028.LOP_SGET_WIDE_VOLATILE_resolve:
13029    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13030#if defined(WITH_JIT)
13031    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
13032#endif
13033    EXPORT_PC()                         @ resolve() could throw, so export now
13034    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13035    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13036    cmp     r0, #0                      @ success?
13037    beq     common_exceptionThrown      @ no, handle exception
13038#if defined(WITH_JIT)
13039    /*
13040     * If the JIT is actively building a trace we need to make sure
13041     * that the field is fully resolved before including this instruction.
13042     */
13043    bl      common_verifyField
13044#endif
13045    b       .LOP_SGET_WIDE_VOLATILE_finish          @ resume
13046
13047/* continuation for OP_SPUT_WIDE_VOLATILE */
13048
13049    /*
13050     * Continuation if the field has not yet been resolved.
13051     *  r1:  BBBB field ref
13052     *  r9:  &fp[AA]
13053     *  r10: dvmDex->pResFields
13054     *
13055     * Returns StaticField pointer in r2.
13056     */
13057.LOP_SPUT_WIDE_VOLATILE_resolve:
13058    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13059#if defined(WITH_JIT)
13060    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13061#endif
13062    EXPORT_PC()                         @ resolve() could throw, so export now
13063    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13064    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13065    cmp     r0, #0                      @ success?
13066    mov     r2, r0                      @ copy to r2
13067    beq     common_exceptionThrown      @ no, handle exception
13068#if defined(WITH_JIT)
13069    /*
13070     * If the JIT is actively building a trace we need to make sure
13071     * that the field is fully resolved before including this instruction.
13072     */
13073    bl      common_verifyField
13074#endif
13075    b       .LOP_SPUT_WIDE_VOLATILE_finish          @ resume
13076
13077/* continuation for OP_EXECUTE_INLINE */
13078
13079    /*
13080     * Extract args, call function.
13081     *  r0 = #of args (0-4)
13082     *  r10 = call index
13083     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
13084     *
13085     * Other ideas:
13086     * - Use a jump table from the main piece to jump directly into the
13087     *   AND/LDR pairs.  Costs a data load, saves a branch.
13088     * - Have five separate pieces that do the loading, so we can work the
13089     *   interleave a little better.  Increases code size.
13090     */
13091.LOP_EXECUTE_INLINE_continue:
13092    rsb     r0, r0, #4                  @ r0<- 4-r0
13093    FETCH(rINST, 2)                     @ rINST<- FEDC
13094    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
13095    bl      common_abort                @ (skipped due to ARM prefetch)
130964:  and     ip, rINST, #0xf000          @ isolate F
13097    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
130983:  and     ip, rINST, #0x0f00          @ isolate E
13099    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
131002:  and     ip, rINST, #0x00f0          @ isolate D
13101    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
131021:  and     ip, rINST, #0x000f          @ isolate C
13103    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
131040:
13105    ldr     rINST, .LOP_EXECUTE_INLINE_table    @ table of InlineOperation
13106    ldr     pc, [rINST, r10, lsl #4]    @ sizeof=16, "func" is first entry
13107    @ (not reached)
13108
13109    /*
13110     * We're debugging or profiling.
13111     * r10: opIndex
13112     */
13113.LOP_EXECUTE_INLINE_debugmode:
13114    mov     r0, r10
13115    bl      dvmResolveInlineNative
13116    cmp     r0, #0                      @ did it resolve?
13117    beq     .LOP_EXECUTE_INLINE_resume          @ no, just move on
13118    mov     r9, r0                      @ remember method
13119    mov     r1, rSELF
13120    bl      dvmFastMethodTraceEnter     @ (method, self)
13121    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
13122    sub     sp, sp, #8                  @ make room for arg, +64 bit align
13123    mov     r0, rINST, lsr #12          @ r0<- B
13124    str     r1, [sp]                    @ push &self->retval
13125    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
13126    mov     rINST, r0                   @ save result of inline
13127    add     sp, sp, #8                  @ pop stack
13128    mov     r0, r9                      @ r0<- method
13129    mov     r1, rSELF
13130    bl      dvmFastNativeMethodTraceExit @ (method, self)
13131    cmp     rINST, #0                   @ test boolean result of inline
13132    beq     common_exceptionThrown      @ returned false, handle exception
13133    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
13134    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13135    GOTO_OPCODE(ip)                     @ jump to next instruction
13136
13137
13138
13139
13140.LOP_EXECUTE_INLINE_table:
13141    .word   gDvmInlineOpsTable
13142
13143/* continuation for OP_EXECUTE_INLINE_RANGE */
13144
13145    /*
13146     * Extract args, call function.
13147     *  r0 = #of args (0-4)
13148     *  r10 = call index
13149     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
13150     */
13151.LOP_EXECUTE_INLINE_RANGE_continue:
13152    rsb     r0, r0, #4                  @ r0<- 4-r0
13153    FETCH(r9, 2)                        @ r9<- CCCC
13154    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
13155    bl      common_abort                @ (skipped due to ARM prefetch)
131564:  add     ip, r9, #3                  @ base+3
13157    GET_VREG(r3, ip)                    @ r3<- vBase[3]
131583:  add     ip, r9, #2                  @ base+2
13159    GET_VREG(r2, ip)                    @ r2<- vBase[2]
131602:  add     ip, r9, #1                  @ base+1
13161    GET_VREG(r1, ip)                    @ r1<- vBase[1]
131621:  add     ip, r9, #0                  @ (nop)
13163    GET_VREG(r0, ip)                    @ r0<- vBase[0]
131640:
13165    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
13166    ldr     pc, [r9, r10, lsl #4]       @ sizeof=16, "func" is first entry
13167    @ (not reached)
13168
13169
13170    /*
13171     * We're debugging or profiling.
13172     * r10: opIndex
13173     */
13174.LOP_EXECUTE_INLINE_RANGE_debugmode:
13175    mov     r0, r10
13176    bl      dvmResolveInlineNative
13177    cmp     r0, #0                      @ did it resolve?
13178    beq     .LOP_EXECUTE_INLINE_RANGE_resume          @ no, just move on
13179    mov     r9, r0                      @ remember method
13180    mov     r1, rSELF
13181    bl      dvmFastMethodTraceEnter     @ (method, self)
13182    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
13183    sub     sp, sp, #8                  @ make room for arg, +64 bit align
13184    mov     r0, rINST, lsr #8           @ r0<- B
13185    mov     rINST, r9                   @ rINST<- method
13186    str     r1, [sp]                    @ push &self->retval
13187    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
13188    mov     r9, r0                      @ save result of inline
13189    add     sp, sp, #8                  @ pop stack
13190    mov     r0, rINST                   @ r0<- method
13191    mov     r1, rSELF
13192    bl      dvmFastNativeMethodTraceExit  @ (method, self)
13193    cmp     r9, #0                      @ test boolean result of inline
13194    beq     common_exceptionThrown      @ returned false, handle exception
13195    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
13196    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13197    GOTO_OPCODE(ip)                     @ jump to next instruction
13198
13199
13200
13201
13202.LOP_EXECUTE_INLINE_RANGE_table:
13203    .word   gDvmInlineOpsTable
13204
13205
13206/* continuation for OP_INVOKE_OBJECT_INIT_RANGE */
13207
13208.LOP_INVOKE_OBJECT_INIT_RANGE_setFinal:
13209    EXPORT_PC()                         @ can throw
13210    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
13211    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
13212    cmp     r0, #0                      @ exception pending?
13213    bne     common_exceptionThrown      @ yes, handle it
13214    b       .LOP_INVOKE_OBJECT_INIT_RANGE_finish
13215
13216    /*
13217     * A debugger is attached, so we need to go ahead and do
13218     * this.  For simplicity, we'll just jump directly to the
13219     * corresponding handler.  Note that we can't use
13220     * rIBASE here because it may be in single-step mode.
13221     * Load the primary table base directly.
13222     */
13223.LOP_INVOKE_OBJECT_INIT_RANGE_debugger:
13224    ldr     r1, [rSELF, #offThread_mainHandlerTable]
13225    .if 0
13226    mov     ip, #OP_INVOKE_DIRECT_JUMBO
13227    .else
13228    mov     ip, #OP_INVOKE_DIRECT_RANGE
13229    .endif
13230    GOTO_OPCODE_BASE(r1,ip)             @ execute it
13231
13232/* continuation for OP_IPUT_OBJECT_VOLATILE */
13233
13234    /*
13235     * Currently:
13236     *  r0 holds resolved field
13237     *  r9 holds object
13238     */
13239.LOP_IPUT_OBJECT_VOLATILE_finish:
13240    @bl      common_squeak0
13241    mov     r1, rINST, lsr #8           @ r1<- A+
13242    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13243    and     r1, r1, #15                 @ r1<- A
13244    cmp     r9, #0                      @ check object for null
13245    GET_VREG(r0, r1)                    @ r0<- fp[A]
13246    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13247    beq     common_errNullObject        @ object was null
13248    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
13249    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13250    SMP_DMB_ST                        @ releasing store
13251    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
13252    SMP_DMB
13253    cmp     r0, #0                      @ stored a null reference?
13254    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
13255    GOTO_OPCODE(ip)                     @ jump to next instruction
13256
13257/* continuation for OP_SGET_OBJECT_VOLATILE */
13258
13259    /*
13260     * Continuation if the field has not yet been resolved.
13261     *  r1:  BBBB field ref
13262     *  r10: dvmDex->pResFields
13263     */
13264.LOP_SGET_OBJECT_VOLATILE_resolve:
13265    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13266#if defined(WITH_JIT)
13267    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13268#endif
13269    EXPORT_PC()                         @ resolve() could throw, so export now
13270    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13271    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13272    cmp     r0, #0                      @ success?
13273    beq     common_exceptionThrown      @ no, handle exception
13274#if defined(WITH_JIT)
13275    /*
13276     * If the JIT is actively building a trace we need to make sure
13277     * that the field is fully resolved before including this instruction.
13278     */
13279    bl      common_verifyField
13280#endif
13281    b       .LOP_SGET_OBJECT_VOLATILE_finish
13282
13283/* continuation for OP_SPUT_OBJECT_VOLATILE */
13284
13285
13286.LOP_SPUT_OBJECT_VOLATILE_end:
13287    str     r1, [r0, #offStaticField_value]  @ field<- vAA
13288    SMP_DMB
13289    cmp     r1, #0                      @ stored a null object?
13290    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
13291    GOTO_OPCODE(ip)                     @ jump to next instruction
13292
13293    /* Continuation if the field has not yet been resolved.
13294     * r1:  BBBB field ref
13295     * r10: dvmDex->pResFields
13296     */
13297.LOP_SPUT_OBJECT_VOLATILE_resolve:
13298    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13299#if defined(WITH_JIT)
13300    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13301#endif
13302    EXPORT_PC()                         @ resolve() could throw, so export now
13303    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13304    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13305    cmp     r0, #0                      @ success?
13306    beq     common_exceptionThrown      @ no, handle exception
13307#if defined(WITH_JIT)
13308    /*
13309     * If the JIT is actively building a trace we need to make sure
13310     * that the field is fully resolved before including this instruction.
13311     */
13312    bl      common_verifyField
13313#endif
13314    b       .LOP_SPUT_OBJECT_VOLATILE_finish          @ resume
13315
13316
13317/* continuation for OP_CONST_CLASS_JUMBO */
13318
13319    /*
13320     * Continuation if the Class has not yet been resolved.
13321     *  r1: AAAAAAAA (Class ref)
13322     *  r9: target register
13323     */
13324.LOP_CONST_CLASS_JUMBO_resolve:
13325    EXPORT_PC()
13326    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
13327    mov     r2, #1                      @ r2<- true
13328    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
13329    bl      dvmResolveClass             @ r0<- Class reference
13330    cmp     r0, #0                      @ failed?
13331    beq     common_exceptionThrown      @ yup, handle the exception
13332    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
13333    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13334    SET_VREG(r0, r9)                    @ vBBBB<- r0
13335    GOTO_OPCODE(ip)                     @ jump to next instruction
13336
13337/* continuation for OP_CHECK_CAST_JUMBO */
13338
13339    /*
13340     * Trivial test failed, need to perform full check.  This is common.
13341     *  r0 holds obj->clazz
13342     *  r1 holds desired class resolved from AAAAAAAA
13343     *  r9 holds object
13344     */
13345.LOP_CHECK_CAST_JUMBO_fullcheck:
13346    mov     r10, r1                     @ avoid ClassObject getting clobbered
13347    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
13348    cmp     r0, #0                      @ failed?
13349    bne     .LOP_CHECK_CAST_JUMBO_okay            @ no, success
13350
13351    @ A cast has failed.  We need to throw a ClassCastException.
13352    EXPORT_PC()                         @ about to throw
13353    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
13354    mov     r1, r10                     @ r1<- desired class
13355    bl      dvmThrowClassCastException
13356    b       common_exceptionThrown
13357
13358    /*
13359     * Advance PC and get the next opcode.
13360     */
13361.LOP_CHECK_CAST_JUMBO_okay:
13362    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
13363    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13364    GOTO_OPCODE(ip)                     @ jump to next instruction
13365
13366    /*
13367     * Resolution required.  This is the least-likely path.
13368     *
13369     *  r2 holds AAAAAAAA
13370     *  r9 holds object
13371     */
13372.LOP_CHECK_CAST_JUMBO_resolve:
13373    EXPORT_PC()                         @ resolve() could throw
13374    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13375    mov     r1, r2                      @ r1<- AAAAAAAA
13376    mov     r2, #0                      @ r2<- false
13377    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13378    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
13379    cmp     r0, #0                      @ got null?
13380    beq     common_exceptionThrown      @ yes, handle exception
13381    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
13382    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
13383    b       .LOP_CHECK_CAST_JUMBO_resolved        @ pick up where we left off
13384
13385/* continuation for OP_INSTANCE_OF_JUMBO */
13386
13387    /*
13388     * Class resolved, determine type of check necessary.  This is common.
13389     *  r0 holds obj->clazz
13390     *  r1 holds class resolved from AAAAAAAA
13391     *  r9 holds BBBB
13392     */
13393.LOP_INSTANCE_OF_JUMBO_resolved:
13394    cmp     r0, r1                      @ same class (trivial success)?
13395    beq     .LOP_INSTANCE_OF_JUMBO_trivial         @ yes, trivial finish
13396    @ fall through to OP_INSTANCE_OF_JUMBO_fullcheck
13397
13398    /*
13399     * Trivial test failed, need to perform full check.  This is common.
13400     *  r0 holds obj->clazz
13401     *  r1 holds class resolved from AAAAAAAA
13402     *  r9 holds BBBB
13403     */
13404.LOP_INSTANCE_OF_JUMBO_fullcheck:
13405    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
13406    @ fall through to OP_INSTANCE_OF_JUMBO_store
13407
13408    /*
13409     * r0 holds boolean result
13410     * r9 holds BBBB
13411     */
13412.LOP_INSTANCE_OF_JUMBO_store:
13413    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13414    SET_VREG(r0, r9)                    @ vBBBB<- r0
13415    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13416    GOTO_OPCODE(ip)                     @ jump to next instruction
13417
13418    /*
13419     * Trivial test succeeded, save and bail.
13420     *  r9 holds BBBB
13421     */
13422.LOP_INSTANCE_OF_JUMBO_trivial:
13423    mov     r0, #1                      @ indicate success
13424    @ could b OP_INSTANCE_OF_JUMBO_store, but copying is faster and cheaper
13425    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13426    SET_VREG(r0, r9)                    @ vBBBB<- r0
13427    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13428    GOTO_OPCODE(ip)                     @ jump to next instruction
13429
13430    /*
13431     * Resolution required.  This is the least-likely path.
13432     *
13433     *  r3 holds AAAAAAAA
13434     *  r9 holds BBBB
13435     */
13436
13437.LOP_INSTANCE_OF_JUMBO_resolve:
13438    EXPORT_PC()                         @ resolve() could throw
13439    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
13440    mov     r1, r3                      @ r1<- AAAAAAAA
13441    mov     r2, #1                      @ r2<- true
13442    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
13443    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
13444    cmp     r0, #0                      @ got null?
13445    beq     common_exceptionThrown      @ yes, handle exception
13446    FETCH(r3, 4)                        @ r3<- vCCCC
13447    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
13448    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
13449    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
13450    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ pick up where we left off
13451
13452/* continuation for OP_NEW_INSTANCE_JUMBO */
13453
13454    .balign 32                          @ minimize cache lines
13455.LOP_NEW_INSTANCE_JUMBO_finish: @ r0=new object
13456    FETCH(r3, 3)                        @ r3<- BBBB
13457    cmp     r0, #0                      @ failed?
13458#if defined(WITH_JIT)
13459    /*
13460     * The JIT needs the class to be fully resolved before it can
13461     * include this instruction in a trace.
13462     */
13463    ldrh    r1, [rSELF, #offThread_subMode]
13464    beq     common_exceptionThrown      @ yes, handle the exception
13465    ands    r1, #kSubModeJitTraceBuild  @ under construction?
13466    bne     .LOP_NEW_INSTANCE_JUMBO_jitCheck
13467#else
13468    beq     common_exceptionThrown      @ yes, handle the exception
13469#endif
13470.LOP_NEW_INSTANCE_JUMBO_end:
13471    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
13472    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13473    SET_VREG(r0, r3)                    @ vBBBB<- r0
13474    GOTO_OPCODE(ip)                     @ jump to next instruction
13475
13476#if defined(WITH_JIT)
13477    /*
13478     * Check to see if we need to stop the trace building early.
13479     * r0: new object
13480     * r3: vAA
13481     */
13482.LOP_NEW_INSTANCE_JUMBO_jitCheck:
13483    ldr     r1, [r10]                   @ reload resolved class
13484    cmp     r1, #0                      @ okay?
13485    bne     .LOP_NEW_INSTANCE_JUMBO_end             @ yes, finish
13486    mov     r9, r0                      @ preserve new object
13487    mov     r10, r3                     @ preserve vAA
13488    mov     r0, rSELF
13489    mov     r1, rPC
13490    bl      dvmJitEndTraceSelect        @ (self, pc)
13491    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
13492    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13493    SET_VREG(r9, r10)                   @ vAA<- new object
13494    GOTO_OPCODE(ip)                     @ jump to next instruction
13495#endif
13496
13497    /*
13498     * Class initialization required.
13499     *
13500     *  r0 holds class object
13501     */
13502.LOP_NEW_INSTANCE_JUMBO_needinit:
13503    mov     r9, r0                      @ save r0
13504    bl      dvmInitClass                @ initialize class
13505    cmp     r0, #0                      @ check boolean result
13506    mov     r0, r9                      @ restore r0
13507    bne     .LOP_NEW_INSTANCE_JUMBO_initialized     @ success, continue
13508    b       common_exceptionThrown      @ failed, deal with init exception
13509
13510    /*
13511     * Resolution required.  This is the least-likely path.
13512     *
13513     *  r1 holds AAAAAAAA
13514     */
13515.LOP_NEW_INSTANCE_JUMBO_resolve:
13516    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13517    mov     r2, #0                      @ r2<- false
13518    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13519    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
13520    cmp     r0, #0                      @ got null?
13521    bne     .LOP_NEW_INSTANCE_JUMBO_resolved        @ no, continue
13522    b       common_exceptionThrown      @ yes, handle exception
13523
13524/* continuation for OP_NEW_ARRAY_JUMBO */
13525
13526
13527    /*
13528     * Resolve class.  (This is an uncommon case.)
13529     *
13530     *  r1 holds array length
13531     *  r2 holds class ref AAAAAAAA
13532     */
13533.LOP_NEW_ARRAY_JUMBO_resolve:
13534    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13535    mov     r9, r1                      @ r9<- length (save)
13536    mov     r1, r2                      @ r1<- AAAAAAAA
13537    mov     r2, #0                      @ r2<- false
13538    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13539    bl      dvmResolveClass             @ r0<- call(clazz, ref)
13540    cmp     r0, #0                      @ got null?
13541    mov     r1, r9                      @ r1<- length (restore)
13542    beq     common_exceptionThrown      @ yes, handle exception
13543    @ fall through to OP_NEW_ARRAY_JUMBO_finish
13544
13545    /*
13546     * Finish allocation.
13547     *
13548     *  r0 holds class
13549     *  r1 holds array length
13550     */
13551.LOP_NEW_ARRAY_JUMBO_finish:
13552    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
13553    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
13554    cmp     r0, #0                      @ failed?
13555    FETCH(r2, 3)                        @ r2<- vBBBB
13556    beq     common_exceptionThrown      @ yes, handle the exception
13557    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13558    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13559    SET_VREG(r0, r2)                    @ vBBBB<- r0
13560    GOTO_OPCODE(ip)                     @ jump to next instruction
13561
13562/* continuation for OP_FILLED_NEW_ARRAY_JUMBO */
13563
13564    /*
13565     * On entry:
13566     *  r0 holds array class
13567     */
13568.LOP_FILLED_NEW_ARRAY_JUMBO_continue:
13569    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
13570    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
13571    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
13572    FETCH(r1, 3)                        @ r1<- BBBB (length)
13573    cmp     rINST, #'I'                 @ array of ints?
13574    cmpne   rINST, #'L'                 @ array of objects?
13575    cmpne   rINST, #'['                 @ array of arrays?
13576    mov     r9, r1                      @ save length in r9
13577    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_notimpl         @ no, not handled yet
13578    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
13579    cmp     r0, #0                      @ null return?
13580    beq     common_exceptionThrown      @ alloc failed, handle exception
13581
13582    FETCH(r1, 4)                        @ r1<- CCCC
13583    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
13584    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
13585    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
13586    subs    r9, r9, #1                  @ length--, check for neg
13587    FETCH_ADVANCE_INST(5)               @ advance to next instr, load rINST
13588    bmi     2f                          @ was zero, bail
13589
13590    @ copy values from registers into the array
13591    @ r0=array, r1=CCCC, r9=BBBB (length)
13592    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
135931:  ldr     r3, [r2], #4                @ r3<- *r2++
13594    subs    r9, r9, #1                  @ count--
13595    str     r3, [r0], #4                @ *contents++ = vX
13596    bpl     1b
13597
135982:  ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
13599    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
13600    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13601    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
13602    cmp     r1, #'I'                         @ Is int array?
13603    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
13604    GOTO_OPCODE(ip)                          @ execute it
13605
13606    /*
13607     * Throw an exception indicating that we have not implemented this
13608     * mode of filled-new-array.
13609     */
13610.LOP_FILLED_NEW_ARRAY_JUMBO_notimpl:
13611    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO
13612    bl      dvmThrowInternalError
13613    b       common_exceptionThrown
13614
13615    /*
13616     * Ideally we'd only define this once, but depending on layout we can
13617     * exceed the range of the load above.
13618     */
13619
13620.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO:
13621    .word   .LstrFilledNewArrayNotImpl
13622
13623/* continuation for OP_IGET_JUMBO */
13624
13625    /*
13626     * Currently:
13627     *  r0 holds resolved field
13628     *  r9 holds object
13629     */
13630.LOP_IGET_JUMBO_resolved:
13631    cmp     r0, #0                      @ resolution unsuccessful?
13632    beq     common_exceptionThrown      @ yes, throw exception
13633    @ fall through to OP_IGET_JUMBO_finish
13634
13635    /*
13636     * Currently:
13637     *  r0 holds resolved field
13638     *  r9 holds object
13639     */
13640.LOP_IGET_JUMBO_finish:
13641    @bl      common_squeak0
13642    cmp     r9, #0                      @ check object for null
13643    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13644    beq     common_errNullObject        @ object was null
13645    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13646    @ no-op                             @ acquiring load
13647    FETCH(r2, 3)                        @ r2<- BBBB
13648    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13649    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13650    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13651    GOTO_OPCODE(ip)                     @ jump to next instruction
13652
13653/* continuation for OP_IGET_WIDE_JUMBO */
13654
13655    /*
13656     * Currently:
13657     *  r0 holds resolved field
13658     *  r9 holds object
13659     */
13660.LOP_IGET_WIDE_JUMBO_resolved:
13661    cmp     r0, #0                      @ resolution unsuccessful?
13662    beq     common_exceptionThrown      @ yes, throw exception
13663    @ fall through to OP_IGET_WIDE_JUMBO_finish
13664
13665    /*
13666     * Currently:
13667     *  r0 holds resolved field
13668     *  r9 holds object
13669     */
13670.LOP_IGET_WIDE_JUMBO_finish:
13671    cmp     r9, #0                      @ check object for null
13672    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13673    beq     common_errNullObject        @ object was null
13674    .if     0
13675    add     r0, r9, r3                  @ r0<- address of field
13676    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
13677    .else
13678    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
13679    .endif
13680    FETCH(r2, 3)                        @ r2<- BBBB
13681    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13682    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13683    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13684    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
13685    GOTO_OPCODE(ip)                     @ jump to next instruction
13686
13687/* continuation for OP_IGET_OBJECT_JUMBO */
13688
13689    /*
13690     * Currently:
13691     *  r0 holds resolved field
13692     *  r9 holds object
13693     */
13694.LOP_IGET_OBJECT_JUMBO_resolved:
13695    cmp     r0, #0                      @ resolution unsuccessful?
13696    beq     common_exceptionThrown      @ yes, throw exception
13697    @ fall through to OP_IGET_OBJECT_JUMBO_finish
13698
13699    /*
13700     * Currently:
13701     *  r0 holds resolved field
13702     *  r9 holds object
13703     */
13704.LOP_IGET_OBJECT_JUMBO_finish:
13705    @bl      common_squeak0
13706    cmp     r9, #0                      @ check object for null
13707    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13708    beq     common_errNullObject        @ object was null
13709    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13710    @ no-op                             @ acquiring load
13711    FETCH(r2, 3)                        @ r2<- BBBB
13712    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13713    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13714    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13715    GOTO_OPCODE(ip)                     @ jump to next instruction
13716
13717/* continuation for OP_IGET_BOOLEAN_JUMBO */
13718
13719    /*
13720     * Currently:
13721     *  r0 holds resolved field
13722     *  r9 holds object
13723     */
13724.LOP_IGET_BOOLEAN_JUMBO_resolved:
13725    cmp     r0, #0                      @ resolution unsuccessful?
13726    beq     common_exceptionThrown      @ yes, throw exception
13727    @ fall through to OP_IGET_BOOLEAN_JUMBO_finish
13728
13729    /*
13730     * Currently:
13731     *  r0 holds resolved field
13732     *  r9 holds object
13733     */
13734.LOP_IGET_BOOLEAN_JUMBO_finish:
13735    @bl      common_squeak1
13736    cmp     r9, #0                      @ check object for null
13737    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13738    beq     common_errNullObject        @ object was null
13739    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13740    @ no-op                             @ acquiring load
13741    FETCH(r2, 3)                        @ r2<- BBBB
13742    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13743    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13744    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13745    GOTO_OPCODE(ip)                     @ jump to next instruction
13746
13747/* continuation for OP_IGET_BYTE_JUMBO */
13748
13749    /*
13750     * Currently:
13751     *  r0 holds resolved field
13752     *  r9 holds object
13753     */
13754.LOP_IGET_BYTE_JUMBO_resolved:
13755    cmp     r0, #0                      @ resolution unsuccessful?
13756    beq     common_exceptionThrown      @ yes, throw exception
13757    @ fall through to OP_IGET_BYTE_JUMBO_finish
13758
13759    /*
13760     * Currently:
13761     *  r0 holds resolved field
13762     *  r9 holds object
13763     */
13764.LOP_IGET_BYTE_JUMBO_finish:
13765    @bl      common_squeak2
13766    cmp     r9, #0                      @ check object for null
13767    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13768    beq     common_errNullObject        @ object was null
13769    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13770    @ no-op                             @ acquiring load
13771    FETCH(r2, 3)                        @ r2<- BBBB
13772    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13773    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13774    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13775    GOTO_OPCODE(ip)                     @ jump to next instruction
13776
13777/* continuation for OP_IGET_CHAR_JUMBO */
13778
13779    /*
13780     * Currently:
13781     *  r0 holds resolved field
13782     *  r9 holds object
13783     */
13784.LOP_IGET_CHAR_JUMBO_resolved:
13785    cmp     r0, #0                      @ resolution unsuccessful?
13786    beq     common_exceptionThrown      @ yes, throw exception
13787    @ fall through to OP_IGET_CHAR_JUMBO_finish
13788
13789    /*
13790     * Currently:
13791     *  r0 holds resolved field
13792     *  r9 holds object
13793     */
13794.LOP_IGET_CHAR_JUMBO_finish:
13795    @bl      common_squeak3
13796    cmp     r9, #0                      @ check object for null
13797    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13798    beq     common_errNullObject        @ object was null
13799    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13800    @ no-op                             @ acquiring load
13801    FETCH(r2, 3)                        @ r2<- BBBB
13802    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13803    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13804    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13805    GOTO_OPCODE(ip)                     @ jump to next instruction
13806
13807/* continuation for OP_IGET_SHORT_JUMBO */
13808
13809    /*
13810     * Currently:
13811     *  r0 holds resolved field
13812     *  r9 holds object
13813     */
13814.LOP_IGET_SHORT_JUMBO_resolved:
13815    cmp     r0, #0                      @ resolution unsuccessful?
13816    beq     common_exceptionThrown      @ yes, throw exception
13817    @ fall through to OP_IGET_SHORT_JUMBO_finish
13818
13819    /*
13820     * Currently:
13821     *  r0 holds resolved field
13822     *  r9 holds object
13823     */
13824.LOP_IGET_SHORT_JUMBO_finish:
13825    @bl      common_squeak4
13826    cmp     r9, #0                      @ check object for null
13827    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13828    beq     common_errNullObject        @ object was null
13829    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13830    @ no-op                             @ acquiring load
13831    FETCH(r2, 3)                        @ r2<- BBBB
13832    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13833    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13834    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13835    GOTO_OPCODE(ip)                     @ jump to next instruction
13836
13837/* continuation for OP_IPUT_JUMBO */
13838
13839    /*
13840     * Currently:
13841     *  r0 holds resolved field
13842     *  r9 holds object
13843     */
13844.LOP_IPUT_JUMBO_resolved:
13845     cmp     r0, #0                     @ resolution unsuccessful?
13846     beq     common_exceptionThrown     @ yes, throw exception
13847     @ fall through to OP_IPUT_JUMBO_finish
13848
13849    /*
13850     * Currently:
13851     *  r0 holds resolved field
13852     *  r9 holds object
13853     */
13854.LOP_IPUT_JUMBO_finish:
13855    @bl      common_squeak0
13856    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13857    FETCH(r1, 3)                        @ r1<- BBBB
13858    cmp     r9, #0                      @ check object for null
13859    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13860    beq     common_errNullObject        @ object was null
13861    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13862    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13863    @ no-op                          @ releasing store
13864    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13865    @ no-op
13866    GOTO_OPCODE(ip)                     @ jump to next instruction
13867
13868/* continuation for OP_IPUT_WIDE_JUMBO */
13869
13870    /*
13871     * Currently:
13872     *  r0 holds resolved field
13873     *  r9 holds object
13874     */
13875.LOP_IPUT_WIDE_JUMBO_resolved:
13876     cmp     r0, #0                     @ resolution unsuccessful?
13877     beq     common_exceptionThrown     @ yes, throw exception
13878     @ fall through to OP_IPUT_WIDE_JUMBO_finish
13879
13880    /*
13881     * Currently:
13882     *  r0 holds resolved field
13883     *  r9 holds object
13884     */
13885.LOP_IPUT_WIDE_JUMBO_finish:
13886    cmp     r9, #0                      @ check object for null
13887    FETCH(r2, 3)                        @ r1<- BBBB
13888    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13889    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13890    beq     common_errNullObject        @ object was null
13891    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13892    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
13893    GET_INST_OPCODE(r10)                @ extract opcode from rINST
13894    .if     0
13895    add     r2, r9, r3                  @ r2<- target address
13896    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
13897    .else
13898    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
13899    .endif
13900    GOTO_OPCODE(r10)                    @ jump to next instruction
13901
13902/* continuation for OP_IPUT_OBJECT_JUMBO */
13903
13904    /*
13905     * Currently:
13906     *  r0 holds resolved field
13907     *  r9 holds object
13908     */
13909.LOP_IPUT_OBJECT_JUMBO_resolved:
13910     cmp     r0, #0                     @ resolution unsuccessful?
13911     beq     common_exceptionThrown     @ yes, throw exception
13912     @ fall through to OP_IPUT_OBJECT_JUMBO_finish
13913
13914    /*
13915     * Currently:
13916     *  r0 holds resolved field
13917     *  r9 holds object
13918     */
13919.LOP_IPUT_OBJECT_JUMBO_finish:
13920    @bl      common_squeak0
13921    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13922    FETCH(r1, 3)                        @ r1<- BBBB
13923    cmp     r9, #0                      @ check object for null
13924    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13925    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13926    beq     common_errNullObject        @ object was null
13927    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13928    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13929    @ no-op                         @ releasing store
13930    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
13931    @ no-op
13932    cmp     r0, #0                      @ stored a null reference?
13933    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
13934    GOTO_OPCODE(ip)                     @ jump to next instruction
13935
13936/* continuation for OP_IPUT_BOOLEAN_JUMBO */
13937
13938    /*
13939     * Currently:
13940     *  r0 holds resolved field
13941     *  r9 holds object
13942     */
13943.LOP_IPUT_BOOLEAN_JUMBO_resolved:
13944     cmp     r0, #0                     @ resolution unsuccessful?
13945     beq     common_exceptionThrown     @ yes, throw exception
13946     @ fall through to OP_IPUT_BOOLEAN_JUMBO_finish
13947
13948    /*
13949     * Currently:
13950     *  r0 holds resolved field
13951     *  r9 holds object
13952     */
13953.LOP_IPUT_BOOLEAN_JUMBO_finish:
13954    @bl      common_squeak1
13955    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13956    FETCH(r1, 3)                        @ r1<- BBBB
13957    cmp     r9, #0                      @ check object for null
13958    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13959    beq     common_errNullObject        @ object was null
13960    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13961    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13962    @ no-op                          @ releasing store
13963    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13964    @ no-op
13965    GOTO_OPCODE(ip)                     @ jump to next instruction
13966
13967/* continuation for OP_IPUT_BYTE_JUMBO */
13968
13969    /*
13970     * Currently:
13971     *  r0 holds resolved field
13972     *  r9 holds object
13973     */
13974.LOP_IPUT_BYTE_JUMBO_resolved:
13975     cmp     r0, #0                     @ resolution unsuccessful?
13976     beq     common_exceptionThrown     @ yes, throw exception
13977     @ fall through to OP_IPUT_BYTE_JUMBO_finish
13978
13979    /*
13980     * Currently:
13981     *  r0 holds resolved field
13982     *  r9 holds object
13983     */
13984.LOP_IPUT_BYTE_JUMBO_finish:
13985    @bl      common_squeak2
13986    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13987    FETCH(r1, 3)                        @ r1<- BBBB
13988    cmp     r9, #0                      @ check object for null
13989    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13990    beq     common_errNullObject        @ object was null
13991    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13992    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13993    @ no-op                          @ releasing store
13994    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13995    @ no-op
13996    GOTO_OPCODE(ip)                     @ jump to next instruction
13997
13998/* continuation for OP_IPUT_CHAR_JUMBO */
13999
14000    /*
14001     * Currently:
14002     *  r0 holds resolved field
14003     *  r9 holds object
14004     */
14005.LOP_IPUT_CHAR_JUMBO_resolved:
14006     cmp     r0, #0                     @ resolution unsuccessful?
14007     beq     common_exceptionThrown     @ yes, throw exception
14008     @ fall through to OP_IPUT_CHAR_JUMBO_finish
14009
14010    /*
14011     * Currently:
14012     *  r0 holds resolved field
14013     *  r9 holds object
14014     */
14015.LOP_IPUT_CHAR_JUMBO_finish:
14016    @bl      common_squeak3
14017    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14018    FETCH(r1, 3)                        @ r1<- BBBB
14019    cmp     r9, #0                      @ check object for null
14020    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14021    beq     common_errNullObject        @ object was null
14022    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14023    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14024    @ no-op                          @ releasing store
14025    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14026    @ no-op
14027    GOTO_OPCODE(ip)                     @ jump to next instruction
14028
14029/* continuation for OP_IPUT_SHORT_JUMBO */
14030
14031    /*
14032     * Currently:
14033     *  r0 holds resolved field
14034     *  r9 holds object
14035     */
14036.LOP_IPUT_SHORT_JUMBO_resolved:
14037     cmp     r0, #0                     @ resolution unsuccessful?
14038     beq     common_exceptionThrown     @ yes, throw exception
14039     @ fall through to OP_IPUT_SHORT_JUMBO_finish
14040
14041    /*
14042     * Currently:
14043     *  r0 holds resolved field
14044     *  r9 holds object
14045     */
14046.LOP_IPUT_SHORT_JUMBO_finish:
14047    @bl      common_squeak4
14048    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14049    FETCH(r1, 3)                        @ r1<- BBBB
14050    cmp     r9, #0                      @ check object for null
14051    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14052    beq     common_errNullObject        @ object was null
14053    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14054    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14055    @ no-op                          @ releasing store
14056    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14057    @ no-op
14058    GOTO_OPCODE(ip)                     @ jump to next instruction
14059
14060/* continuation for OP_SGET_JUMBO */
14061
14062    /*
14063     * Continuation if the field has not yet been resolved.
14064     *  r1:  AAAAAAAA field ref
14065     *  r10: dvmDex->pResFields
14066     */
14067.LOP_SGET_JUMBO_resolve:
14068    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14069#if defined(WITH_JIT)
14070    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14071#endif
14072    EXPORT_PC()                         @ resolve() could throw, so export now
14073    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14074    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14075    cmp     r0, #0                      @ success?
14076    beq     common_exceptionThrown      @ no, handle exception
14077#if defined(WITH_JIT)
14078    /*
14079     * If the JIT is actively building a trace we need to make sure
14080     * that the field is fully resolved before including this instruction.
14081     */
14082    bl      common_verifyField
14083#endif
14084    b       .LOP_SGET_JUMBO_finish          @ resume
14085
14086/* continuation for OP_SGET_WIDE_JUMBO */
14087
14088    /*
14089     * Continuation if the field has not yet been resolved.
14090     *  r1: AAAAAAAA field ref
14091     *
14092     * Returns StaticField pointer in r0.
14093     */
14094.LOP_SGET_WIDE_JUMBO_resolve:
14095    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14096    EXPORT_PC()                         @ resolve() could throw, so export now
14097    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14098    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14099    cmp     r0, #0                      @ success?
14100    bne     .LOP_SGET_WIDE_JUMBO_finish          @ yes, finish
14101    b       common_exceptionThrown      @ no, handle exception
14102
14103/* continuation for OP_SGET_OBJECT_JUMBO */
14104
14105    /*
14106     * Continuation if the field has not yet been resolved.
14107     *  r1:  AAAAAAAA field ref
14108     *  r10: dvmDex->pResFields
14109     */
14110.LOP_SGET_OBJECT_JUMBO_resolve:
14111    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14112#if defined(WITH_JIT)
14113    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14114#endif
14115    EXPORT_PC()                         @ resolve() could throw, so export now
14116    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14117    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14118    cmp     r0, #0                      @ success?
14119    beq     common_exceptionThrown      @ no, handle exception
14120#if defined(WITH_JIT)
14121    /*
14122     * If the JIT is actively building a trace we need to make sure
14123     * that the field is fully resolved before including this instruction.
14124     */
14125    bl      common_verifyField
14126#endif
14127    b       .LOP_SGET_OBJECT_JUMBO_finish          @ resume
14128
14129/* continuation for OP_SGET_BOOLEAN_JUMBO */
14130
14131    /*
14132     * Continuation if the field has not yet been resolved.
14133     *  r1:  AAAAAAAA field ref
14134     *  r10: dvmDex->pResFields
14135     */
14136.LOP_SGET_BOOLEAN_JUMBO_resolve:
14137    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14138#if defined(WITH_JIT)
14139    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14140#endif
14141    EXPORT_PC()                         @ resolve() could throw, so export now
14142    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14143    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14144    cmp     r0, #0                      @ success?
14145    beq     common_exceptionThrown      @ no, handle exception
14146#if defined(WITH_JIT)
14147    /*
14148     * If the JIT is actively building a trace we need to make sure
14149     * that the field is fully resolved before including this instruction.
14150     */
14151    bl      common_verifyField
14152#endif
14153    b       .LOP_SGET_BOOLEAN_JUMBO_finish          @ resume
14154
14155/* continuation for OP_SGET_BYTE_JUMBO */
14156
14157    /*
14158     * Continuation if the field has not yet been resolved.
14159     *  r1:  AAAAAAAA field ref
14160     *  r10: dvmDex->pResFields
14161     */
14162.LOP_SGET_BYTE_JUMBO_resolve:
14163    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14164#if defined(WITH_JIT)
14165    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14166#endif
14167    EXPORT_PC()                         @ resolve() could throw, so export now
14168    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14169    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14170    cmp     r0, #0                      @ success?
14171    beq     common_exceptionThrown      @ no, handle exception
14172#if defined(WITH_JIT)
14173    /*
14174     * If the JIT is actively building a trace we need to make sure
14175     * that the field is fully resolved before including this instruction.
14176     */
14177    bl      common_verifyField
14178#endif
14179    b       .LOP_SGET_BYTE_JUMBO_finish          @ resume
14180
14181/* continuation for OP_SGET_CHAR_JUMBO */
14182
14183    /*
14184     * Continuation if the field has not yet been resolved.
14185     *  r1:  AAAAAAAA field ref
14186     *  r10: dvmDex->pResFields
14187     */
14188.LOP_SGET_CHAR_JUMBO_resolve:
14189    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14190#if defined(WITH_JIT)
14191    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14192#endif
14193    EXPORT_PC()                         @ resolve() could throw, so export now
14194    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14195    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14196    cmp     r0, #0                      @ success?
14197    beq     common_exceptionThrown      @ no, handle exception
14198#if defined(WITH_JIT)
14199    /*
14200     * If the JIT is actively building a trace we need to make sure
14201     * that the field is fully resolved before including this instruction.
14202     */
14203    bl      common_verifyField
14204#endif
14205    b       .LOP_SGET_CHAR_JUMBO_finish          @ resume
14206
14207/* continuation for OP_SGET_SHORT_JUMBO */
14208
14209    /*
14210     * Continuation if the field has not yet been resolved.
14211     *  r1:  AAAAAAAA field ref
14212     *  r10: dvmDex->pResFields
14213     */
14214.LOP_SGET_SHORT_JUMBO_resolve:
14215    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14216#if defined(WITH_JIT)
14217    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14218#endif
14219    EXPORT_PC()                         @ resolve() could throw, so export now
14220    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14221    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14222    cmp     r0, #0                      @ success?
14223    beq     common_exceptionThrown      @ no, handle exception
14224#if defined(WITH_JIT)
14225    /*
14226     * If the JIT is actively building a trace we need to make sure
14227     * that the field is fully resolved before including this instruction.
14228     */
14229    bl      common_verifyField
14230#endif
14231    b       .LOP_SGET_SHORT_JUMBO_finish          @ resume
14232
14233/* continuation for OP_SPUT_JUMBO */
14234
14235    /*
14236     * Continuation if the field has not yet been resolved.
14237     *  r1:  AAAAAAAA field ref
14238     *  r10: dvmDex->pResFields
14239     */
14240.LOP_SPUT_JUMBO_resolve:
14241    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14242#if defined(WITH_JIT)
14243    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14244#endif
14245    EXPORT_PC()                         @ resolve() could throw, so export now
14246    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14247    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14248    cmp     r0, #0                      @ success?
14249    beq     common_exceptionThrown      @ no, handle exception
14250#if defined(WITH_JIT)
14251    /*
14252     * If the JIT is actively building a trace we need to make sure
14253     * that the field is fully resolved before including this instruction.
14254     */
14255    bl      common_verifyField
14256#endif
14257    b       .LOP_SPUT_JUMBO_finish          @ resume
14258
14259/* continuation for OP_SPUT_WIDE_JUMBO */
14260
14261    /*
14262     * Continuation if the field has not yet been resolved.
14263     *  r1:  AAAAAAAA field ref
14264     *  r9:  &fp[BBBB]
14265     *  r10: dvmDex->pResFields
14266     *
14267     * Returns StaticField pointer in r2.
14268     */
14269.LOP_SPUT_WIDE_JUMBO_resolve:
14270    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14271#if defined(WITH_JIT)
14272    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14273#endif
14274    EXPORT_PC()                         @ resolve() could throw, so export now
14275    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14276    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14277    cmp     r0, #0                      @ success?
14278    mov     r2, r0                      @ copy to r2
14279    beq     common_exceptionThrown      @ no, handle exception
14280#if defined(WITH_JIT)
14281    /*
14282     * If the JIT is actively building a trace we need to make sure
14283     * that the field is fully resolved before including this instruction.
14284     */
14285    bl      common_verifyField
14286#endif
14287    b       .LOP_SPUT_WIDE_JUMBO_finish          @ resume
14288
14289/* continuation for OP_SPUT_OBJECT_JUMBO */
14290
14291
14292.LOP_SPUT_OBJECT_JUMBO_end:
14293    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
14294    @ no-op
14295    cmp     r1, #0                      @ stored a null object?
14296    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
14297    GOTO_OPCODE(ip)                     @ jump to next instruction
14298
14299    /* Continuation if the field has not yet been resolved.
14300     * r1:  AAAAaaaa field ref
14301     * r10: dvmDex->pResFields
14302     */
14303.LOP_SPUT_OBJECT_JUMBO_resolve:
14304    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
14305#if defined(WITH_JIT)
14306    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14307#endif
14308    EXPORT_PC()                         @ resolve() could throw, so export now
14309    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14310    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14311    cmp     r0, #0                      @ success?
14312    beq     common_exceptionThrown      @ no, handle exception
14313#if defined(WITH_JIT)
14314    /*
14315     * If the JIT is actively building a trace we need to make sure
14316     * that the field is fully resolved before including this instruction.
14317     */
14318    bl      common_verifyField
14319#endif
14320    b       .LOP_SPUT_OBJECT_JUMBO_finish          @ resume
14321
14322
14323/* continuation for OP_SPUT_BOOLEAN_JUMBO */
14324
14325    /*
14326     * Continuation if the field has not yet been resolved.
14327     *  r1:  AAAAAAAA field ref
14328     *  r10: dvmDex->pResFields
14329     */
14330.LOP_SPUT_BOOLEAN_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    beq     common_exceptionThrown      @ no, handle exception
14340#if defined(WITH_JIT)
14341    /*
14342     * If the JIT is actively building a trace we need to make sure
14343     * that the field is fully resolved before including this instruction.
14344     */
14345    bl      common_verifyField
14346#endif
14347    b       .LOP_SPUT_BOOLEAN_JUMBO_finish          @ resume
14348
14349/* continuation for OP_SPUT_BYTE_JUMBO */
14350
14351    /*
14352     * Continuation if the field has not yet been resolved.
14353     *  r1:  AAAAAAAA field ref
14354     *  r10: dvmDex->pResFields
14355     */
14356.LOP_SPUT_BYTE_JUMBO_resolve:
14357    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14358#if defined(WITH_JIT)
14359    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14360#endif
14361    EXPORT_PC()                         @ resolve() could throw, so export now
14362    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14363    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14364    cmp     r0, #0                      @ success?
14365    beq     common_exceptionThrown      @ no, handle exception
14366#if defined(WITH_JIT)
14367    /*
14368     * If the JIT is actively building a trace we need to make sure
14369     * that the field is fully resolved before including this instruction.
14370     */
14371    bl      common_verifyField
14372#endif
14373    b       .LOP_SPUT_BYTE_JUMBO_finish          @ resume
14374
14375/* continuation for OP_SPUT_CHAR_JUMBO */
14376
14377    /*
14378     * Continuation if the field has not yet been resolved.
14379     *  r1:  AAAAAAAA field ref
14380     *  r10: dvmDex->pResFields
14381     */
14382.LOP_SPUT_CHAR_JUMBO_resolve:
14383    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14384#if defined(WITH_JIT)
14385    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14386#endif
14387    EXPORT_PC()                         @ resolve() could throw, so export now
14388    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14389    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14390    cmp     r0, #0                      @ success?
14391    beq     common_exceptionThrown      @ no, handle exception
14392#if defined(WITH_JIT)
14393    /*
14394     * If the JIT is actively building a trace we need to make sure
14395     * that the field is fully resolved before including this instruction.
14396     */
14397    bl      common_verifyField
14398#endif
14399    b       .LOP_SPUT_CHAR_JUMBO_finish          @ resume
14400
14401/* continuation for OP_SPUT_SHORT_JUMBO */
14402
14403    /*
14404     * Continuation if the field has not yet been resolved.
14405     *  r1:  AAAAAAAA field ref
14406     *  r10: dvmDex->pResFields
14407     */
14408.LOP_SPUT_SHORT_JUMBO_resolve:
14409    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14410#if defined(WITH_JIT)
14411    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14412#endif
14413    EXPORT_PC()                         @ resolve() could throw, so export now
14414    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14415    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14416    cmp     r0, #0                      @ success?
14417    beq     common_exceptionThrown      @ no, handle exception
14418#if defined(WITH_JIT)
14419    /*
14420     * If the JIT is actively building a trace we need to make sure
14421     * that the field is fully resolved before including this instruction.
14422     */
14423    bl      common_verifyField
14424#endif
14425    b       .LOP_SPUT_SHORT_JUMBO_finish          @ resume
14426
14427/* continuation for OP_INVOKE_VIRTUAL_JUMBO */
14428
14429    /*
14430     * At this point:
14431     *  r0 = resolved base method
14432     */
14433.LOP_INVOKE_VIRTUAL_JUMBO_continue:
14434    FETCH(r10, 4)                       @ r10<- CCCC
14435    GET_VREG(r9, r10)                   @ r9<- "this" ptr
14436    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
14437    cmp     r9, #0                      @ is "this" null?
14438    beq     common_errNullObject        @ null "this", throw exception
14439    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
14440    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
14441    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
14442    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
14443
14444/* continuation for OP_INVOKE_SUPER_JUMBO */
14445
14446    /*
14447     * At this point:
14448     *  r0 = resolved base method
14449     *  r10 = method->clazz
14450     */
14451.LOP_INVOKE_SUPER_JUMBO_continue:
14452    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
14453    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
14454    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
14455    EXPORT_PC()                         @ must export for invoke
14456    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
14457    bcs     .LOP_INVOKE_SUPER_JUMBO_nsm             @ method not present in superclass
14458    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
14459    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
14460    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
14461
14462.LOP_INVOKE_SUPER_JUMBO_resolve:
14463    mov     r0, r10                     @ r0<- method->clazz
14464    mov     r2, #METHOD_VIRTUAL         @ resolver method type
14465    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14466    cmp     r0, #0                      @ got null?
14467    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ no, continue
14468    b       common_exceptionThrown      @ yes, handle exception
14469
14470    /*
14471     * Throw a NoSuchMethodError with the method name as the message.
14472     *  r0 = resolved base method
14473     */
14474.LOP_INVOKE_SUPER_JUMBO_nsm:
14475    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
14476    b       common_errNoSuchMethod
14477
14478/* continuation for OP_INVOKE_DIRECT_JUMBO */
14479
14480    /*
14481     * On entry:
14482     *  r1 = reference (CCCC)
14483     *  r10 = "this" register
14484     */
14485.LOP_INVOKE_DIRECT_JUMBO_resolve:
14486    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
14487    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
14488    mov     r2, #METHOD_DIRECT          @ resolver method type
14489    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14490    cmp     r0, #0                      @ got null?
14491    bne     .LOP_INVOKE_DIRECT_JUMBO_finish          @ no, continue
14492    b       common_exceptionThrown      @ yes, handle exception
14493
14494/* continuation for OP_INVOKE_STATIC_JUMBO */
14495
14496
14497.LOP_INVOKE_STATIC_JUMBO_resolve:
14498    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
14499    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
14500    mov     r2, #METHOD_STATIC          @ resolver method type
14501    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14502    cmp     r0, #0                      @ got null?
14503#if defined(WITH_JIT)
14504    /*
14505     * Check to see if we're actively building a trace.  If so,
14506     * we need to keep this instruction out of it.
14507     * r10: &resolved_methodToCall
14508     */
14509    ldrh    r2, [rSELF, #offThread_subMode]
14510    beq     common_exceptionThrown            @ null, handle exception
14511    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
14512    beq     common_invokeMethodJumboNoThis    @ no (r0=method, r9="this")
14513    ldr     r1, [r10]                         @ reload resolved method
14514    cmp     r1, #0                            @ finished resolving?
14515    bne     common_invokeMethodJumboNoThis    @ yes (r0=method, r9="this")
14516    mov     r10, r0                           @ preserve method
14517    mov     r0, rSELF
14518    mov     r1, rPC
14519    bl      dvmJitEndTraceSelect              @ (self, pc)
14520    mov     r0, r10
14521    b       common_invokeMethodJumboNoThis    @ whew, finally!
14522#else
14523    bne     common_invokeMethodJumboNoThis    @ (r0=method, r9="this")
14524    b       common_exceptionThrown            @ yes, handle exception
14525#endif
14526
14527/* continuation for OP_INVOKE_OBJECT_INIT_JUMBO */
14528
14529.LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal:
14530    EXPORT_PC()                         @ can throw
14531    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
14532    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
14533    cmp     r0, #0                      @ exception pending?
14534    bne     common_exceptionThrown      @ yes, handle it
14535    b       .LOP_INVOKE_OBJECT_INIT_JUMBO_finish
14536
14537    /*
14538     * A debugger is attached, so we need to go ahead and do
14539     * this.  For simplicity, we'll just jump directly to the
14540     * corresponding handler.  Note that we can't use
14541     * rIBASE here because it may be in single-step mode.
14542     * Load the primary table base directly.
14543     */
14544.LOP_INVOKE_OBJECT_INIT_JUMBO_debugger:
14545    ldr     r1, [rSELF, #offThread_mainHandlerTable]
14546    .if 1
14547    mov     ip, #OP_INVOKE_DIRECT_JUMBO
14548    .else
14549    mov     ip, #OP_INVOKE_DIRECT_RANGE
14550    .endif
14551    GOTO_OPCODE_BASE(r1,ip)             @ execute it
14552
14553/* continuation for OP_IGET_VOLATILE_JUMBO */
14554
14555    /*
14556     * Currently:
14557     *  r0 holds resolved field
14558     *  r9 holds object
14559     */
14560.LOP_IGET_VOLATILE_JUMBO_resolved:
14561    cmp     r0, #0                      @ resolution unsuccessful?
14562    beq     common_exceptionThrown      @ yes, throw exception
14563    @ fall through to OP_IGET_VOLATILE_JUMBO_finish
14564
14565    /*
14566     * Currently:
14567     *  r0 holds resolved field
14568     *  r9 holds object
14569     */
14570.LOP_IGET_VOLATILE_JUMBO_finish:
14571    @bl      common_squeak0
14572    cmp     r9, #0                      @ check object for null
14573    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14574    beq     common_errNullObject        @ object was null
14575    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14576    SMP_DMB                            @ acquiring load
14577    FETCH(r2, 3)                        @ r2<- BBBB
14578    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14579    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14580    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14581    GOTO_OPCODE(ip)                     @ jump to next instruction
14582
14583/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
14584
14585    /*
14586     * Currently:
14587     *  r0 holds resolved field
14588     *  r9 holds object
14589     */
14590.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
14591    cmp     r0, #0                      @ resolution unsuccessful?
14592    beq     common_exceptionThrown      @ yes, throw exception
14593    @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
14594
14595    /*
14596     * Currently:
14597     *  r0 holds resolved field
14598     *  r9 holds object
14599     */
14600.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
14601    cmp     r9, #0                      @ check object for null
14602    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14603    beq     common_errNullObject        @ object was null
14604    .if     1
14605    add     r0, r9, r3                  @ r0<- address of field
14606    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
14607    .else
14608    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
14609    .endif
14610    FETCH(r2, 3)                        @ r2<- BBBB
14611    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14612    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14613    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14614    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
14615    GOTO_OPCODE(ip)                     @ jump to next instruction
14616
14617/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
14618
14619    /*
14620     * Currently:
14621     *  r0 holds resolved field
14622     *  r9 holds object
14623     */
14624.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
14625    cmp     r0, #0                      @ resolution unsuccessful?
14626    beq     common_exceptionThrown      @ yes, throw exception
14627    @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
14628
14629    /*
14630     * Currently:
14631     *  r0 holds resolved field
14632     *  r9 holds object
14633     */
14634.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
14635    @bl      common_squeak0
14636    cmp     r9, #0                      @ check object for null
14637    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14638    beq     common_errNullObject        @ object was null
14639    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14640    SMP_DMB                            @ acquiring load
14641    FETCH(r2, 3)                        @ r2<- BBBB
14642    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14643    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14644    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14645    GOTO_OPCODE(ip)                     @ jump to next instruction
14646
14647/* continuation for OP_IPUT_VOLATILE_JUMBO */
14648
14649    /*
14650     * Currently:
14651     *  r0 holds resolved field
14652     *  r9 holds object
14653     */
14654.LOP_IPUT_VOLATILE_JUMBO_resolved:
14655     cmp     r0, #0                     @ resolution unsuccessful?
14656     beq     common_exceptionThrown     @ yes, throw exception
14657     @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
14658
14659    /*
14660     * Currently:
14661     *  r0 holds resolved field
14662     *  r9 holds object
14663     */
14664.LOP_IPUT_VOLATILE_JUMBO_finish:
14665    @bl      common_squeak0
14666    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14667    FETCH(r1, 3)                        @ r1<- BBBB
14668    cmp     r9, #0                      @ check object for null
14669    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14670    beq     common_errNullObject        @ object was null
14671    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14672    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14673    SMP_DMB_ST                         @ releasing store
14674    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14675    SMP_DMB
14676    GOTO_OPCODE(ip)                     @ jump to next instruction
14677
14678/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
14679
14680    /*
14681     * Currently:
14682     *  r0 holds resolved field
14683     *  r9 holds object
14684     */
14685.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
14686     cmp     r0, #0                     @ resolution unsuccessful?
14687     beq     common_exceptionThrown     @ yes, throw exception
14688     @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
14689
14690    /*
14691     * Currently:
14692     *  r0 holds resolved field
14693     *  r9 holds object
14694     */
14695.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
14696    cmp     r9, #0                      @ check object for null
14697    FETCH(r2, 3)                        @ r1<- BBBB
14698    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14699    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14700    beq     common_errNullObject        @ object was null
14701    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14702    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
14703    GET_INST_OPCODE(r10)                @ extract opcode from rINST
14704    .if     1
14705    add     r2, r9, r3                  @ r2<- target address
14706    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
14707    .else
14708    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
14709    .endif
14710    GOTO_OPCODE(r10)                    @ jump to next instruction
14711
14712/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
14713
14714    /*
14715     * Currently:
14716     *  r0 holds resolved field
14717     *  r9 holds object
14718     */
14719.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
14720     cmp     r0, #0                     @ resolution unsuccessful?
14721     beq     common_exceptionThrown     @ yes, throw exception
14722     @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
14723
14724    /*
14725     * Currently:
14726     *  r0 holds resolved field
14727     *  r9 holds object
14728     */
14729.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
14730    @bl      common_squeak0
14731    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14732    FETCH(r1, 3)                        @ r1<- BBBB
14733    cmp     r9, #0                      @ check object for null
14734    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14735    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
14736    beq     common_errNullObject        @ object was null
14737    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14738    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14739    SMP_DMB_ST                        @ releasing store
14740    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
14741    SMP_DMB
14742    cmp     r0, #0                      @ stored a null reference?
14743    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
14744    GOTO_OPCODE(ip)                     @ jump to next instruction
14745
14746/* continuation for OP_SGET_VOLATILE_JUMBO */
14747
14748    /*
14749     * Continuation if the field has not yet been resolved.
14750     *  r1:  AAAAAAAA field ref
14751     *  r10: dvmDex->pResFields
14752     */
14753.LOP_SGET_VOLATILE_JUMBO_resolve:
14754    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14755#if defined(WITH_JIT)
14756    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14757#endif
14758    EXPORT_PC()                         @ resolve() could throw, so export now
14759    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14760    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14761    cmp     r0, #0                      @ success?
14762    beq     common_exceptionThrown      @ no, handle exception
14763#if defined(WITH_JIT)
14764    /*
14765     * If the JIT is actively building a trace we need to make sure
14766     * that the field is fully resolved before including this instruction.
14767     */
14768    bl      common_verifyField
14769#endif
14770    b       .LOP_SGET_VOLATILE_JUMBO_finish          @ resume
14771
14772/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
14773
14774    /*
14775     * Continuation if the field has not yet been resolved.
14776     *  r1: AAAAAAAA field ref
14777     *
14778     * Returns StaticField pointer in r0.
14779     */
14780.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
14781    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14782    EXPORT_PC()                         @ resolve() could throw, so export now
14783    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14784    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14785    cmp     r0, #0                      @ success?
14786    bne     .LOP_SGET_WIDE_VOLATILE_JUMBO_finish          @ yes, finish
14787    b       common_exceptionThrown      @ no, handle exception
14788
14789/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
14790
14791    /*
14792     * Continuation if the field has not yet been resolved.
14793     *  r1:  AAAAAAAA field ref
14794     *  r10: dvmDex->pResFields
14795     */
14796.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
14797    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14798#if defined(WITH_JIT)
14799    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14800#endif
14801    EXPORT_PC()                         @ resolve() could throw, so export now
14802    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14803    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14804    cmp     r0, #0                      @ success?
14805    beq     common_exceptionThrown      @ no, handle exception
14806#if defined(WITH_JIT)
14807    /*
14808     * If the JIT is actively building a trace we need to make sure
14809     * that the field is fully resolved before including this instruction.
14810     */
14811    bl      common_verifyField
14812#endif
14813    b       .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish          @ resume
14814
14815/* continuation for OP_SPUT_VOLATILE_JUMBO */
14816
14817    /*
14818     * Continuation if the field has not yet been resolved.
14819     *  r1:  AAAAAAAA field ref
14820     *  r10: dvmDex->pResFields
14821     */
14822.LOP_SPUT_VOLATILE_JUMBO_resolve:
14823    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14824#if defined(WITH_JIT)
14825    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14826#endif
14827    EXPORT_PC()                         @ resolve() could throw, so export now
14828    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14829    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14830    cmp     r0, #0                      @ success?
14831    beq     common_exceptionThrown      @ no, handle exception
14832#if defined(WITH_JIT)
14833    /*
14834     * If the JIT is actively building a trace we need to make sure
14835     * that the field is fully resolved before including this instruction.
14836     */
14837    bl      common_verifyField
14838#endif
14839    b       .LOP_SPUT_VOLATILE_JUMBO_finish          @ resume
14840
14841/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
14842
14843    /*
14844     * Continuation if the field has not yet been resolved.
14845     *  r1:  AAAAAAAA field ref
14846     *  r9:  &fp[BBBB]
14847     *  r10: dvmDex->pResFields
14848     *
14849     * Returns StaticField pointer in r2.
14850     */
14851.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
14852    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14853#if defined(WITH_JIT)
14854    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14855#endif
14856    EXPORT_PC()                         @ resolve() could throw, so export now
14857    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14858    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14859    cmp     r0, #0                      @ success?
14860    mov     r2, r0                      @ copy to r2
14861    beq     common_exceptionThrown      @ no, handle exception
14862#if defined(WITH_JIT)
14863    /*
14864     * If the JIT is actively building a trace we need to make sure
14865     * that the field is fully resolved before including this instruction.
14866     */
14867    bl      common_verifyField
14868#endif
14869    b       .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish          @ resume
14870
14871/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
14872
14873
14874.LOP_SPUT_OBJECT_VOLATILE_JUMBO_end:
14875    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
14876    SMP_DMB
14877    cmp     r1, #0                      @ stored a null object?
14878    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
14879    GOTO_OPCODE(ip)                     @ jump to next instruction
14880
14881    /* Continuation if the field has not yet been resolved.
14882     * r1:  AAAAaaaa field ref
14883     * r10: dvmDex->pResFields
14884     */
14885.LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve:
14886    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
14887#if defined(WITH_JIT)
14888    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14889#endif
14890    EXPORT_PC()                         @ resolve() could throw, so export now
14891    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14892    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14893    cmp     r0, #0                      @ success?
14894    beq     common_exceptionThrown      @ no, handle exception
14895#if defined(WITH_JIT)
14896    /*
14897     * If the JIT is actively building a trace we need to make sure
14898     * that the field is fully resolved before including this instruction.
14899     */
14900    bl      common_verifyField
14901#endif
14902    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish          @ resume
14903
14904
14905    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
14906    .global dvmAsmSisterEnd
14907dvmAsmSisterEnd:
14908
14909
14910    .global dvmAsmAltInstructionStart
14911    .type   dvmAsmAltInstructionStart, %function
14912    .text
14913
14914dvmAsmAltInstructionStart = .L_ALT_OP_NOP
14915/* ------------------------------ */
14916    .balign 64
14917.L_ALT_OP_NOP: /* 0x00 */
14918/* File: armv5te/alt_stub.S */
14919/*
14920 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14921 * any interesting requests and then jump to the real instruction
14922 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14923 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14924 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14925 * bail to the real handler if breakFlags==0.
14926 */
14927    ldrb   r3, [rSELF, #offThread_breakFlags]
14928    adrl   lr, dvmAsmInstructionStart + (0 * 64)
14929    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14930    cmp    r3, #0
14931    bxeq   lr                   @ nothing to do - jump to real handler
14932    EXPORT_PC()
14933    mov    r0, rPC              @ arg0
14934    mov    r1, rFP              @ arg1
14935    mov    r2, rSELF            @ arg2
14936    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14937
14938/* ------------------------------ */
14939    .balign 64
14940.L_ALT_OP_MOVE: /* 0x01 */
14941/* File: armv5te/alt_stub.S */
14942/*
14943 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14944 * any interesting requests and then jump to the real instruction
14945 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14946 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14947 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14948 * bail to the real handler if breakFlags==0.
14949 */
14950    ldrb   r3, [rSELF, #offThread_breakFlags]
14951    adrl   lr, dvmAsmInstructionStart + (1 * 64)
14952    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14953    cmp    r3, #0
14954    bxeq   lr                   @ nothing to do - jump to real handler
14955    EXPORT_PC()
14956    mov    r0, rPC              @ arg0
14957    mov    r1, rFP              @ arg1
14958    mov    r2, rSELF            @ arg2
14959    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14960
14961/* ------------------------------ */
14962    .balign 64
14963.L_ALT_OP_MOVE_FROM16: /* 0x02 */
14964/* File: armv5te/alt_stub.S */
14965/*
14966 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14967 * any interesting requests and then jump to the real instruction
14968 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14969 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14970 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14971 * bail to the real handler if breakFlags==0.
14972 */
14973    ldrb   r3, [rSELF, #offThread_breakFlags]
14974    adrl   lr, dvmAsmInstructionStart + (2 * 64)
14975    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14976    cmp    r3, #0
14977    bxeq   lr                   @ nothing to do - jump to real handler
14978    EXPORT_PC()
14979    mov    r0, rPC              @ arg0
14980    mov    r1, rFP              @ arg1
14981    mov    r2, rSELF            @ arg2
14982    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14983
14984/* ------------------------------ */
14985    .balign 64
14986.L_ALT_OP_MOVE_16: /* 0x03 */
14987/* File: armv5te/alt_stub.S */
14988/*
14989 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14990 * any interesting requests and then jump to the real instruction
14991 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14992 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14993 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14994 * bail to the real handler if breakFlags==0.
14995 */
14996    ldrb   r3, [rSELF, #offThread_breakFlags]
14997    adrl   lr, dvmAsmInstructionStart + (3 * 64)
14998    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14999    cmp    r3, #0
15000    bxeq   lr                   @ nothing to do - jump to real handler
15001    EXPORT_PC()
15002    mov    r0, rPC              @ arg0
15003    mov    r1, rFP              @ arg1
15004    mov    r2, rSELF            @ arg2
15005    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15006
15007/* ------------------------------ */
15008    .balign 64
15009.L_ALT_OP_MOVE_WIDE: /* 0x04 */
15010/* File: armv5te/alt_stub.S */
15011/*
15012 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15013 * any interesting requests and then jump to the real instruction
15014 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15015 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15016 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15017 * bail to the real handler if breakFlags==0.
15018 */
15019    ldrb   r3, [rSELF, #offThread_breakFlags]
15020    adrl   lr, dvmAsmInstructionStart + (4 * 64)
15021    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15022    cmp    r3, #0
15023    bxeq   lr                   @ nothing to do - jump to real handler
15024    EXPORT_PC()
15025    mov    r0, rPC              @ arg0
15026    mov    r1, rFP              @ arg1
15027    mov    r2, rSELF            @ arg2
15028    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15029
15030/* ------------------------------ */
15031    .balign 64
15032.L_ALT_OP_MOVE_WIDE_FROM16: /* 0x05 */
15033/* File: armv5te/alt_stub.S */
15034/*
15035 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15036 * any interesting requests and then jump to the real instruction
15037 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15038 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15039 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15040 * bail to the real handler if breakFlags==0.
15041 */
15042    ldrb   r3, [rSELF, #offThread_breakFlags]
15043    adrl   lr, dvmAsmInstructionStart + (5 * 64)
15044    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15045    cmp    r3, #0
15046    bxeq   lr                   @ nothing to do - jump to real handler
15047    EXPORT_PC()
15048    mov    r0, rPC              @ arg0
15049    mov    r1, rFP              @ arg1
15050    mov    r2, rSELF            @ arg2
15051    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15052
15053/* ------------------------------ */
15054    .balign 64
15055.L_ALT_OP_MOVE_WIDE_16: /* 0x06 */
15056/* File: armv5te/alt_stub.S */
15057/*
15058 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15059 * any interesting requests and then jump to the real instruction
15060 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15061 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15062 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15063 * bail to the real handler if breakFlags==0.
15064 */
15065    ldrb   r3, [rSELF, #offThread_breakFlags]
15066    adrl   lr, dvmAsmInstructionStart + (6 * 64)
15067    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15068    cmp    r3, #0
15069    bxeq   lr                   @ nothing to do - jump to real handler
15070    EXPORT_PC()
15071    mov    r0, rPC              @ arg0
15072    mov    r1, rFP              @ arg1
15073    mov    r2, rSELF            @ arg2
15074    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15075
15076/* ------------------------------ */
15077    .balign 64
15078.L_ALT_OP_MOVE_OBJECT: /* 0x07 */
15079/* File: armv5te/alt_stub.S */
15080/*
15081 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15082 * any interesting requests and then jump to the real instruction
15083 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15084 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15085 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15086 * bail to the real handler if breakFlags==0.
15087 */
15088    ldrb   r3, [rSELF, #offThread_breakFlags]
15089    adrl   lr, dvmAsmInstructionStart + (7 * 64)
15090    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15091    cmp    r3, #0
15092    bxeq   lr                   @ nothing to do - jump to real handler
15093    EXPORT_PC()
15094    mov    r0, rPC              @ arg0
15095    mov    r1, rFP              @ arg1
15096    mov    r2, rSELF            @ arg2
15097    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15098
15099/* ------------------------------ */
15100    .balign 64
15101.L_ALT_OP_MOVE_OBJECT_FROM16: /* 0x08 */
15102/* File: armv5te/alt_stub.S */
15103/*
15104 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15105 * any interesting requests and then jump to the real instruction
15106 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15107 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15108 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15109 * bail to the real handler if breakFlags==0.
15110 */
15111    ldrb   r3, [rSELF, #offThread_breakFlags]
15112    adrl   lr, dvmAsmInstructionStart + (8 * 64)
15113    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15114    cmp    r3, #0
15115    bxeq   lr                   @ nothing to do - jump to real handler
15116    EXPORT_PC()
15117    mov    r0, rPC              @ arg0
15118    mov    r1, rFP              @ arg1
15119    mov    r2, rSELF            @ arg2
15120    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15121
15122/* ------------------------------ */
15123    .balign 64
15124.L_ALT_OP_MOVE_OBJECT_16: /* 0x09 */
15125/* File: armv5te/alt_stub.S */
15126/*
15127 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15128 * any interesting requests and then jump to the real instruction
15129 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15130 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15131 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15132 * bail to the real handler if breakFlags==0.
15133 */
15134    ldrb   r3, [rSELF, #offThread_breakFlags]
15135    adrl   lr, dvmAsmInstructionStart + (9 * 64)
15136    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15137    cmp    r3, #0
15138    bxeq   lr                   @ nothing to do - jump to real handler
15139    EXPORT_PC()
15140    mov    r0, rPC              @ arg0
15141    mov    r1, rFP              @ arg1
15142    mov    r2, rSELF            @ arg2
15143    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15144
15145/* ------------------------------ */
15146    .balign 64
15147.L_ALT_OP_MOVE_RESULT: /* 0x0a */
15148/* File: armv5te/alt_stub.S */
15149/*
15150 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15151 * any interesting requests and then jump to the real instruction
15152 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15153 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15154 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15155 * bail to the real handler if breakFlags==0.
15156 */
15157    ldrb   r3, [rSELF, #offThread_breakFlags]
15158    adrl   lr, dvmAsmInstructionStart + (10 * 64)
15159    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15160    cmp    r3, #0
15161    bxeq   lr                   @ nothing to do - jump to real handler
15162    EXPORT_PC()
15163    mov    r0, rPC              @ arg0
15164    mov    r1, rFP              @ arg1
15165    mov    r2, rSELF            @ arg2
15166    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15167
15168/* ------------------------------ */
15169    .balign 64
15170.L_ALT_OP_MOVE_RESULT_WIDE: /* 0x0b */
15171/* File: armv5te/alt_stub.S */
15172/*
15173 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15174 * any interesting requests and then jump to the real instruction
15175 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15176 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15177 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15178 * bail to the real handler if breakFlags==0.
15179 */
15180    ldrb   r3, [rSELF, #offThread_breakFlags]
15181    adrl   lr, dvmAsmInstructionStart + (11 * 64)
15182    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15183    cmp    r3, #0
15184    bxeq   lr                   @ nothing to do - jump to real handler
15185    EXPORT_PC()
15186    mov    r0, rPC              @ arg0
15187    mov    r1, rFP              @ arg1
15188    mov    r2, rSELF            @ arg2
15189    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15190
15191/* ------------------------------ */
15192    .balign 64
15193.L_ALT_OP_MOVE_RESULT_OBJECT: /* 0x0c */
15194/* File: armv5te/alt_stub.S */
15195/*
15196 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15197 * any interesting requests and then jump to the real instruction
15198 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15199 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15200 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15201 * bail to the real handler if breakFlags==0.
15202 */
15203    ldrb   r3, [rSELF, #offThread_breakFlags]
15204    adrl   lr, dvmAsmInstructionStart + (12 * 64)
15205    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15206    cmp    r3, #0
15207    bxeq   lr                   @ nothing to do - jump to real handler
15208    EXPORT_PC()
15209    mov    r0, rPC              @ arg0
15210    mov    r1, rFP              @ arg1
15211    mov    r2, rSELF            @ arg2
15212    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15213
15214/* ------------------------------ */
15215    .balign 64
15216.L_ALT_OP_MOVE_EXCEPTION: /* 0x0d */
15217/* File: armv5te/alt_stub.S */
15218/*
15219 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15220 * any interesting requests and then jump to the real instruction
15221 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15222 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15223 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15224 * bail to the real handler if breakFlags==0.
15225 */
15226    ldrb   r3, [rSELF, #offThread_breakFlags]
15227    adrl   lr, dvmAsmInstructionStart + (13 * 64)
15228    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15229    cmp    r3, #0
15230    bxeq   lr                   @ nothing to do - jump to real handler
15231    EXPORT_PC()
15232    mov    r0, rPC              @ arg0
15233    mov    r1, rFP              @ arg1
15234    mov    r2, rSELF            @ arg2
15235    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15236
15237/* ------------------------------ */
15238    .balign 64
15239.L_ALT_OP_RETURN_VOID: /* 0x0e */
15240/* File: armv5te/alt_stub.S */
15241/*
15242 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15243 * any interesting requests and then jump to the real instruction
15244 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15245 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15246 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15247 * bail to the real handler if breakFlags==0.
15248 */
15249    ldrb   r3, [rSELF, #offThread_breakFlags]
15250    adrl   lr, dvmAsmInstructionStart + (14 * 64)
15251    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15252    cmp    r3, #0
15253    bxeq   lr                   @ nothing to do - jump to real handler
15254    EXPORT_PC()
15255    mov    r0, rPC              @ arg0
15256    mov    r1, rFP              @ arg1
15257    mov    r2, rSELF            @ arg2
15258    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15259
15260/* ------------------------------ */
15261    .balign 64
15262.L_ALT_OP_RETURN: /* 0x0f */
15263/* File: armv5te/alt_stub.S */
15264/*
15265 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15266 * any interesting requests and then jump to the real instruction
15267 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15268 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15269 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15270 * bail to the real handler if breakFlags==0.
15271 */
15272    ldrb   r3, [rSELF, #offThread_breakFlags]
15273    adrl   lr, dvmAsmInstructionStart + (15 * 64)
15274    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15275    cmp    r3, #0
15276    bxeq   lr                   @ nothing to do - jump to real handler
15277    EXPORT_PC()
15278    mov    r0, rPC              @ arg0
15279    mov    r1, rFP              @ arg1
15280    mov    r2, rSELF            @ arg2
15281    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15282
15283/* ------------------------------ */
15284    .balign 64
15285.L_ALT_OP_RETURN_WIDE: /* 0x10 */
15286/* File: armv5te/alt_stub.S */
15287/*
15288 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15289 * any interesting requests and then jump to the real instruction
15290 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15291 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15292 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15293 * bail to the real handler if breakFlags==0.
15294 */
15295    ldrb   r3, [rSELF, #offThread_breakFlags]
15296    adrl   lr, dvmAsmInstructionStart + (16 * 64)
15297    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15298    cmp    r3, #0
15299    bxeq   lr                   @ nothing to do - jump to real handler
15300    EXPORT_PC()
15301    mov    r0, rPC              @ arg0
15302    mov    r1, rFP              @ arg1
15303    mov    r2, rSELF            @ arg2
15304    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15305
15306/* ------------------------------ */
15307    .balign 64
15308.L_ALT_OP_RETURN_OBJECT: /* 0x11 */
15309/* File: armv5te/alt_stub.S */
15310/*
15311 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15312 * any interesting requests and then jump to the real instruction
15313 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15314 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15315 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15316 * bail to the real handler if breakFlags==0.
15317 */
15318    ldrb   r3, [rSELF, #offThread_breakFlags]
15319    adrl   lr, dvmAsmInstructionStart + (17 * 64)
15320    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15321    cmp    r3, #0
15322    bxeq   lr                   @ nothing to do - jump to real handler
15323    EXPORT_PC()
15324    mov    r0, rPC              @ arg0
15325    mov    r1, rFP              @ arg1
15326    mov    r2, rSELF            @ arg2
15327    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15328
15329/* ------------------------------ */
15330    .balign 64
15331.L_ALT_OP_CONST_4: /* 0x12 */
15332/* File: armv5te/alt_stub.S */
15333/*
15334 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15335 * any interesting requests and then jump to the real instruction
15336 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15337 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15338 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15339 * bail to the real handler if breakFlags==0.
15340 */
15341    ldrb   r3, [rSELF, #offThread_breakFlags]
15342    adrl   lr, dvmAsmInstructionStart + (18 * 64)
15343    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15344    cmp    r3, #0
15345    bxeq   lr                   @ nothing to do - jump to real handler
15346    EXPORT_PC()
15347    mov    r0, rPC              @ arg0
15348    mov    r1, rFP              @ arg1
15349    mov    r2, rSELF            @ arg2
15350    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15351
15352/* ------------------------------ */
15353    .balign 64
15354.L_ALT_OP_CONST_16: /* 0x13 */
15355/* File: armv5te/alt_stub.S */
15356/*
15357 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15358 * any interesting requests and then jump to the real instruction
15359 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15360 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15361 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15362 * bail to the real handler if breakFlags==0.
15363 */
15364    ldrb   r3, [rSELF, #offThread_breakFlags]
15365    adrl   lr, dvmAsmInstructionStart + (19 * 64)
15366    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15367    cmp    r3, #0
15368    bxeq   lr                   @ nothing to do - jump to real handler
15369    EXPORT_PC()
15370    mov    r0, rPC              @ arg0
15371    mov    r1, rFP              @ arg1
15372    mov    r2, rSELF            @ arg2
15373    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15374
15375/* ------------------------------ */
15376    .balign 64
15377.L_ALT_OP_CONST: /* 0x14 */
15378/* File: armv5te/alt_stub.S */
15379/*
15380 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15381 * any interesting requests and then jump to the real instruction
15382 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15383 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15384 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15385 * bail to the real handler if breakFlags==0.
15386 */
15387    ldrb   r3, [rSELF, #offThread_breakFlags]
15388    adrl   lr, dvmAsmInstructionStart + (20 * 64)
15389    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15390    cmp    r3, #0
15391    bxeq   lr                   @ nothing to do - jump to real handler
15392    EXPORT_PC()
15393    mov    r0, rPC              @ arg0
15394    mov    r1, rFP              @ arg1
15395    mov    r2, rSELF            @ arg2
15396    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15397
15398/* ------------------------------ */
15399    .balign 64
15400.L_ALT_OP_CONST_HIGH16: /* 0x15 */
15401/* File: armv5te/alt_stub.S */
15402/*
15403 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15404 * any interesting requests and then jump to the real instruction
15405 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15406 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15407 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15408 * bail to the real handler if breakFlags==0.
15409 */
15410    ldrb   r3, [rSELF, #offThread_breakFlags]
15411    adrl   lr, dvmAsmInstructionStart + (21 * 64)
15412    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15413    cmp    r3, #0
15414    bxeq   lr                   @ nothing to do - jump to real handler
15415    EXPORT_PC()
15416    mov    r0, rPC              @ arg0
15417    mov    r1, rFP              @ arg1
15418    mov    r2, rSELF            @ arg2
15419    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15420
15421/* ------------------------------ */
15422    .balign 64
15423.L_ALT_OP_CONST_WIDE_16: /* 0x16 */
15424/* File: armv5te/alt_stub.S */
15425/*
15426 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15427 * any interesting requests and then jump to the real instruction
15428 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15429 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15430 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15431 * bail to the real handler if breakFlags==0.
15432 */
15433    ldrb   r3, [rSELF, #offThread_breakFlags]
15434    adrl   lr, dvmAsmInstructionStart + (22 * 64)
15435    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15436    cmp    r3, #0
15437    bxeq   lr                   @ nothing to do - jump to real handler
15438    EXPORT_PC()
15439    mov    r0, rPC              @ arg0
15440    mov    r1, rFP              @ arg1
15441    mov    r2, rSELF            @ arg2
15442    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15443
15444/* ------------------------------ */
15445    .balign 64
15446.L_ALT_OP_CONST_WIDE_32: /* 0x17 */
15447/* File: armv5te/alt_stub.S */
15448/*
15449 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15450 * any interesting requests and then jump to the real instruction
15451 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15452 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15453 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15454 * bail to the real handler if breakFlags==0.
15455 */
15456    ldrb   r3, [rSELF, #offThread_breakFlags]
15457    adrl   lr, dvmAsmInstructionStart + (23 * 64)
15458    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15459    cmp    r3, #0
15460    bxeq   lr                   @ nothing to do - jump to real handler
15461    EXPORT_PC()
15462    mov    r0, rPC              @ arg0
15463    mov    r1, rFP              @ arg1
15464    mov    r2, rSELF            @ arg2
15465    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15466
15467/* ------------------------------ */
15468    .balign 64
15469.L_ALT_OP_CONST_WIDE: /* 0x18 */
15470/* File: armv5te/alt_stub.S */
15471/*
15472 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15473 * any interesting requests and then jump to the real instruction
15474 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15475 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15476 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15477 * bail to the real handler if breakFlags==0.
15478 */
15479    ldrb   r3, [rSELF, #offThread_breakFlags]
15480    adrl   lr, dvmAsmInstructionStart + (24 * 64)
15481    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15482    cmp    r3, #0
15483    bxeq   lr                   @ nothing to do - jump to real handler
15484    EXPORT_PC()
15485    mov    r0, rPC              @ arg0
15486    mov    r1, rFP              @ arg1
15487    mov    r2, rSELF            @ arg2
15488    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15489
15490/* ------------------------------ */
15491    .balign 64
15492.L_ALT_OP_CONST_WIDE_HIGH16: /* 0x19 */
15493/* File: armv5te/alt_stub.S */
15494/*
15495 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15496 * any interesting requests and then jump to the real instruction
15497 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15498 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15499 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15500 * bail to the real handler if breakFlags==0.
15501 */
15502    ldrb   r3, [rSELF, #offThread_breakFlags]
15503    adrl   lr, dvmAsmInstructionStart + (25 * 64)
15504    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15505    cmp    r3, #0
15506    bxeq   lr                   @ nothing to do - jump to real handler
15507    EXPORT_PC()
15508    mov    r0, rPC              @ arg0
15509    mov    r1, rFP              @ arg1
15510    mov    r2, rSELF            @ arg2
15511    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15512
15513/* ------------------------------ */
15514    .balign 64
15515.L_ALT_OP_CONST_STRING: /* 0x1a */
15516/* File: armv5te/alt_stub.S */
15517/*
15518 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15519 * any interesting requests and then jump to the real instruction
15520 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15521 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15522 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15523 * bail to the real handler if breakFlags==0.
15524 */
15525    ldrb   r3, [rSELF, #offThread_breakFlags]
15526    adrl   lr, dvmAsmInstructionStart + (26 * 64)
15527    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15528    cmp    r3, #0
15529    bxeq   lr                   @ nothing to do - jump to real handler
15530    EXPORT_PC()
15531    mov    r0, rPC              @ arg0
15532    mov    r1, rFP              @ arg1
15533    mov    r2, rSELF            @ arg2
15534    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15535
15536/* ------------------------------ */
15537    .balign 64
15538.L_ALT_OP_CONST_STRING_JUMBO: /* 0x1b */
15539/* File: armv5te/alt_stub.S */
15540/*
15541 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15542 * any interesting requests and then jump to the real instruction
15543 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15544 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15545 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15546 * bail to the real handler if breakFlags==0.
15547 */
15548    ldrb   r3, [rSELF, #offThread_breakFlags]
15549    adrl   lr, dvmAsmInstructionStart + (27 * 64)
15550    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15551    cmp    r3, #0
15552    bxeq   lr                   @ nothing to do - jump to real handler
15553    EXPORT_PC()
15554    mov    r0, rPC              @ arg0
15555    mov    r1, rFP              @ arg1
15556    mov    r2, rSELF            @ arg2
15557    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15558
15559/* ------------------------------ */
15560    .balign 64
15561.L_ALT_OP_CONST_CLASS: /* 0x1c */
15562/* File: armv5te/alt_stub.S */
15563/*
15564 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15565 * any interesting requests and then jump to the real instruction
15566 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15567 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15568 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15569 * bail to the real handler if breakFlags==0.
15570 */
15571    ldrb   r3, [rSELF, #offThread_breakFlags]
15572    adrl   lr, dvmAsmInstructionStart + (28 * 64)
15573    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15574    cmp    r3, #0
15575    bxeq   lr                   @ nothing to do - jump to real handler
15576    EXPORT_PC()
15577    mov    r0, rPC              @ arg0
15578    mov    r1, rFP              @ arg1
15579    mov    r2, rSELF            @ arg2
15580    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15581
15582/* ------------------------------ */
15583    .balign 64
15584.L_ALT_OP_MONITOR_ENTER: /* 0x1d */
15585/* File: armv5te/alt_stub.S */
15586/*
15587 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15588 * any interesting requests and then jump to the real instruction
15589 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15590 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15591 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15592 * bail to the real handler if breakFlags==0.
15593 */
15594    ldrb   r3, [rSELF, #offThread_breakFlags]
15595    adrl   lr, dvmAsmInstructionStart + (29 * 64)
15596    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15597    cmp    r3, #0
15598    bxeq   lr                   @ nothing to do - jump to real handler
15599    EXPORT_PC()
15600    mov    r0, rPC              @ arg0
15601    mov    r1, rFP              @ arg1
15602    mov    r2, rSELF            @ arg2
15603    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15604
15605/* ------------------------------ */
15606    .balign 64
15607.L_ALT_OP_MONITOR_EXIT: /* 0x1e */
15608/* File: armv5te/alt_stub.S */
15609/*
15610 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15611 * any interesting requests and then jump to the real instruction
15612 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15613 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15614 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15615 * bail to the real handler if breakFlags==0.
15616 */
15617    ldrb   r3, [rSELF, #offThread_breakFlags]
15618    adrl   lr, dvmAsmInstructionStart + (30 * 64)
15619    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15620    cmp    r3, #0
15621    bxeq   lr                   @ nothing to do - jump to real handler
15622    EXPORT_PC()
15623    mov    r0, rPC              @ arg0
15624    mov    r1, rFP              @ arg1
15625    mov    r2, rSELF            @ arg2
15626    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15627
15628/* ------------------------------ */
15629    .balign 64
15630.L_ALT_OP_CHECK_CAST: /* 0x1f */
15631/* File: armv5te/alt_stub.S */
15632/*
15633 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15634 * any interesting requests and then jump to the real instruction
15635 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15636 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15637 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15638 * bail to the real handler if breakFlags==0.
15639 */
15640    ldrb   r3, [rSELF, #offThread_breakFlags]
15641    adrl   lr, dvmAsmInstructionStart + (31 * 64)
15642    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15643    cmp    r3, #0
15644    bxeq   lr                   @ nothing to do - jump to real handler
15645    EXPORT_PC()
15646    mov    r0, rPC              @ arg0
15647    mov    r1, rFP              @ arg1
15648    mov    r2, rSELF            @ arg2
15649    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15650
15651/* ------------------------------ */
15652    .balign 64
15653.L_ALT_OP_INSTANCE_OF: /* 0x20 */
15654/* File: armv5te/alt_stub.S */
15655/*
15656 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15657 * any interesting requests and then jump to the real instruction
15658 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15659 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15660 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15661 * bail to the real handler if breakFlags==0.
15662 */
15663    ldrb   r3, [rSELF, #offThread_breakFlags]
15664    adrl   lr, dvmAsmInstructionStart + (32 * 64)
15665    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15666    cmp    r3, #0
15667    bxeq   lr                   @ nothing to do - jump to real handler
15668    EXPORT_PC()
15669    mov    r0, rPC              @ arg0
15670    mov    r1, rFP              @ arg1
15671    mov    r2, rSELF            @ arg2
15672    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15673
15674/* ------------------------------ */
15675    .balign 64
15676.L_ALT_OP_ARRAY_LENGTH: /* 0x21 */
15677/* File: armv5te/alt_stub.S */
15678/*
15679 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15680 * any interesting requests and then jump to the real instruction
15681 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15682 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15683 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15684 * bail to the real handler if breakFlags==0.
15685 */
15686    ldrb   r3, [rSELF, #offThread_breakFlags]
15687    adrl   lr, dvmAsmInstructionStart + (33 * 64)
15688    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15689    cmp    r3, #0
15690    bxeq   lr                   @ nothing to do - jump to real handler
15691    EXPORT_PC()
15692    mov    r0, rPC              @ arg0
15693    mov    r1, rFP              @ arg1
15694    mov    r2, rSELF            @ arg2
15695    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15696
15697/* ------------------------------ */
15698    .balign 64
15699.L_ALT_OP_NEW_INSTANCE: /* 0x22 */
15700/* File: armv5te/alt_stub.S */
15701/*
15702 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15703 * any interesting requests and then jump to the real instruction
15704 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15705 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15706 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15707 * bail to the real handler if breakFlags==0.
15708 */
15709    ldrb   r3, [rSELF, #offThread_breakFlags]
15710    adrl   lr, dvmAsmInstructionStart + (34 * 64)
15711    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15712    cmp    r3, #0
15713    bxeq   lr                   @ nothing to do - jump to real handler
15714    EXPORT_PC()
15715    mov    r0, rPC              @ arg0
15716    mov    r1, rFP              @ arg1
15717    mov    r2, rSELF            @ arg2
15718    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15719
15720/* ------------------------------ */
15721    .balign 64
15722.L_ALT_OP_NEW_ARRAY: /* 0x23 */
15723/* File: armv5te/alt_stub.S */
15724/*
15725 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15726 * any interesting requests and then jump to the real instruction
15727 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15728 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15729 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15730 * bail to the real handler if breakFlags==0.
15731 */
15732    ldrb   r3, [rSELF, #offThread_breakFlags]
15733    adrl   lr, dvmAsmInstructionStart + (35 * 64)
15734    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15735    cmp    r3, #0
15736    bxeq   lr                   @ nothing to do - jump to real handler
15737    EXPORT_PC()
15738    mov    r0, rPC              @ arg0
15739    mov    r1, rFP              @ arg1
15740    mov    r2, rSELF            @ arg2
15741    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15742
15743/* ------------------------------ */
15744    .balign 64
15745.L_ALT_OP_FILLED_NEW_ARRAY: /* 0x24 */
15746/* File: armv5te/alt_stub.S */
15747/*
15748 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15749 * any interesting requests and then jump to the real instruction
15750 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15751 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15752 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15753 * bail to the real handler if breakFlags==0.
15754 */
15755    ldrb   r3, [rSELF, #offThread_breakFlags]
15756    adrl   lr, dvmAsmInstructionStart + (36 * 64)
15757    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15758    cmp    r3, #0
15759    bxeq   lr                   @ nothing to do - jump to real handler
15760    EXPORT_PC()
15761    mov    r0, rPC              @ arg0
15762    mov    r1, rFP              @ arg1
15763    mov    r2, rSELF            @ arg2
15764    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15765
15766/* ------------------------------ */
15767    .balign 64
15768.L_ALT_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
15769/* File: armv5te/alt_stub.S */
15770/*
15771 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15772 * any interesting requests and then jump to the real instruction
15773 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15774 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15775 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15776 * bail to the real handler if breakFlags==0.
15777 */
15778    ldrb   r3, [rSELF, #offThread_breakFlags]
15779    adrl   lr, dvmAsmInstructionStart + (37 * 64)
15780    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15781    cmp    r3, #0
15782    bxeq   lr                   @ nothing to do - jump to real handler
15783    EXPORT_PC()
15784    mov    r0, rPC              @ arg0
15785    mov    r1, rFP              @ arg1
15786    mov    r2, rSELF            @ arg2
15787    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15788
15789/* ------------------------------ */
15790    .balign 64
15791.L_ALT_OP_FILL_ARRAY_DATA: /* 0x26 */
15792/* File: armv5te/alt_stub.S */
15793/*
15794 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15795 * any interesting requests and then jump to the real instruction
15796 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15797 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15798 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15799 * bail to the real handler if breakFlags==0.
15800 */
15801    ldrb   r3, [rSELF, #offThread_breakFlags]
15802    adrl   lr, dvmAsmInstructionStart + (38 * 64)
15803    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15804    cmp    r3, #0
15805    bxeq   lr                   @ nothing to do - jump to real handler
15806    EXPORT_PC()
15807    mov    r0, rPC              @ arg0
15808    mov    r1, rFP              @ arg1
15809    mov    r2, rSELF            @ arg2
15810    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15811
15812/* ------------------------------ */
15813    .balign 64
15814.L_ALT_OP_THROW: /* 0x27 */
15815/* File: armv5te/alt_stub.S */
15816/*
15817 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15818 * any interesting requests and then jump to the real instruction
15819 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15820 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15821 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15822 * bail to the real handler if breakFlags==0.
15823 */
15824    ldrb   r3, [rSELF, #offThread_breakFlags]
15825    adrl   lr, dvmAsmInstructionStart + (39 * 64)
15826    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15827    cmp    r3, #0
15828    bxeq   lr                   @ nothing to do - jump to real handler
15829    EXPORT_PC()
15830    mov    r0, rPC              @ arg0
15831    mov    r1, rFP              @ arg1
15832    mov    r2, rSELF            @ arg2
15833    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15834
15835/* ------------------------------ */
15836    .balign 64
15837.L_ALT_OP_GOTO: /* 0x28 */
15838/* File: armv5te/alt_stub.S */
15839/*
15840 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15841 * any interesting requests and then jump to the real instruction
15842 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15843 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15844 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15845 * bail to the real handler if breakFlags==0.
15846 */
15847    ldrb   r3, [rSELF, #offThread_breakFlags]
15848    adrl   lr, dvmAsmInstructionStart + (40 * 64)
15849    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15850    cmp    r3, #0
15851    bxeq   lr                   @ nothing to do - jump to real handler
15852    EXPORT_PC()
15853    mov    r0, rPC              @ arg0
15854    mov    r1, rFP              @ arg1
15855    mov    r2, rSELF            @ arg2
15856    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15857
15858/* ------------------------------ */
15859    .balign 64
15860.L_ALT_OP_GOTO_16: /* 0x29 */
15861/* File: armv5te/alt_stub.S */
15862/*
15863 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15864 * any interesting requests and then jump to the real instruction
15865 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15866 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15867 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15868 * bail to the real handler if breakFlags==0.
15869 */
15870    ldrb   r3, [rSELF, #offThread_breakFlags]
15871    adrl   lr, dvmAsmInstructionStart + (41 * 64)
15872    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15873    cmp    r3, #0
15874    bxeq   lr                   @ nothing to do - jump to real handler
15875    EXPORT_PC()
15876    mov    r0, rPC              @ arg0
15877    mov    r1, rFP              @ arg1
15878    mov    r2, rSELF            @ arg2
15879    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15880
15881/* ------------------------------ */
15882    .balign 64
15883.L_ALT_OP_GOTO_32: /* 0x2a */
15884/* File: armv5te/alt_stub.S */
15885/*
15886 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15887 * any interesting requests and then jump to the real instruction
15888 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15889 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15890 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15891 * bail to the real handler if breakFlags==0.
15892 */
15893    ldrb   r3, [rSELF, #offThread_breakFlags]
15894    adrl   lr, dvmAsmInstructionStart + (42 * 64)
15895    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15896    cmp    r3, #0
15897    bxeq   lr                   @ nothing to do - jump to real handler
15898    EXPORT_PC()
15899    mov    r0, rPC              @ arg0
15900    mov    r1, rFP              @ arg1
15901    mov    r2, rSELF            @ arg2
15902    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15903
15904/* ------------------------------ */
15905    .balign 64
15906.L_ALT_OP_PACKED_SWITCH: /* 0x2b */
15907/* File: armv5te/alt_stub.S */
15908/*
15909 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15910 * any interesting requests and then jump to the real instruction
15911 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15912 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15913 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15914 * bail to the real handler if breakFlags==0.
15915 */
15916    ldrb   r3, [rSELF, #offThread_breakFlags]
15917    adrl   lr, dvmAsmInstructionStart + (43 * 64)
15918    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15919    cmp    r3, #0
15920    bxeq   lr                   @ nothing to do - jump to real handler
15921    EXPORT_PC()
15922    mov    r0, rPC              @ arg0
15923    mov    r1, rFP              @ arg1
15924    mov    r2, rSELF            @ arg2
15925    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15926
15927/* ------------------------------ */
15928    .balign 64
15929.L_ALT_OP_SPARSE_SWITCH: /* 0x2c */
15930/* File: armv5te/alt_stub.S */
15931/*
15932 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15933 * any interesting requests and then jump to the real instruction
15934 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15935 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15936 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15937 * bail to the real handler if breakFlags==0.
15938 */
15939    ldrb   r3, [rSELF, #offThread_breakFlags]
15940    adrl   lr, dvmAsmInstructionStart + (44 * 64)
15941    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15942    cmp    r3, #0
15943    bxeq   lr                   @ nothing to do - jump to real handler
15944    EXPORT_PC()
15945    mov    r0, rPC              @ arg0
15946    mov    r1, rFP              @ arg1
15947    mov    r2, rSELF            @ arg2
15948    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15949
15950/* ------------------------------ */
15951    .balign 64
15952.L_ALT_OP_CMPL_FLOAT: /* 0x2d */
15953/* File: armv5te/alt_stub.S */
15954/*
15955 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15956 * any interesting requests and then jump to the real instruction
15957 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15958 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15959 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15960 * bail to the real handler if breakFlags==0.
15961 */
15962    ldrb   r3, [rSELF, #offThread_breakFlags]
15963    adrl   lr, dvmAsmInstructionStart + (45 * 64)
15964    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15965    cmp    r3, #0
15966    bxeq   lr                   @ nothing to do - jump to real handler
15967    EXPORT_PC()
15968    mov    r0, rPC              @ arg0
15969    mov    r1, rFP              @ arg1
15970    mov    r2, rSELF            @ arg2
15971    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15972
15973/* ------------------------------ */
15974    .balign 64
15975.L_ALT_OP_CMPG_FLOAT: /* 0x2e */
15976/* File: armv5te/alt_stub.S */
15977/*
15978 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15979 * any interesting requests and then jump to the real instruction
15980 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15981 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15982 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15983 * bail to the real handler if breakFlags==0.
15984 */
15985    ldrb   r3, [rSELF, #offThread_breakFlags]
15986    adrl   lr, dvmAsmInstructionStart + (46 * 64)
15987    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15988    cmp    r3, #0
15989    bxeq   lr                   @ nothing to do - jump to real handler
15990    EXPORT_PC()
15991    mov    r0, rPC              @ arg0
15992    mov    r1, rFP              @ arg1
15993    mov    r2, rSELF            @ arg2
15994    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15995
15996/* ------------------------------ */
15997    .balign 64
15998.L_ALT_OP_CMPL_DOUBLE: /* 0x2f */
15999/* File: armv5te/alt_stub.S */
16000/*
16001 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16002 * any interesting requests and then jump to the real instruction
16003 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16004 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16005 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16006 * bail to the real handler if breakFlags==0.
16007 */
16008    ldrb   r3, [rSELF, #offThread_breakFlags]
16009    adrl   lr, dvmAsmInstructionStart + (47 * 64)
16010    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16011    cmp    r3, #0
16012    bxeq   lr                   @ nothing to do - jump to real handler
16013    EXPORT_PC()
16014    mov    r0, rPC              @ arg0
16015    mov    r1, rFP              @ arg1
16016    mov    r2, rSELF            @ arg2
16017    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16018
16019/* ------------------------------ */
16020    .balign 64
16021.L_ALT_OP_CMPG_DOUBLE: /* 0x30 */
16022/* File: armv5te/alt_stub.S */
16023/*
16024 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16025 * any interesting requests and then jump to the real instruction
16026 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16027 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16028 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16029 * bail to the real handler if breakFlags==0.
16030 */
16031    ldrb   r3, [rSELF, #offThread_breakFlags]
16032    adrl   lr, dvmAsmInstructionStart + (48 * 64)
16033    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16034    cmp    r3, #0
16035    bxeq   lr                   @ nothing to do - jump to real handler
16036    EXPORT_PC()
16037    mov    r0, rPC              @ arg0
16038    mov    r1, rFP              @ arg1
16039    mov    r2, rSELF            @ arg2
16040    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16041
16042/* ------------------------------ */
16043    .balign 64
16044.L_ALT_OP_CMP_LONG: /* 0x31 */
16045/* File: armv5te/alt_stub.S */
16046/*
16047 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16048 * any interesting requests and then jump to the real instruction
16049 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16050 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16051 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16052 * bail to the real handler if breakFlags==0.
16053 */
16054    ldrb   r3, [rSELF, #offThread_breakFlags]
16055    adrl   lr, dvmAsmInstructionStart + (49 * 64)
16056    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16057    cmp    r3, #0
16058    bxeq   lr                   @ nothing to do - jump to real handler
16059    EXPORT_PC()
16060    mov    r0, rPC              @ arg0
16061    mov    r1, rFP              @ arg1
16062    mov    r2, rSELF            @ arg2
16063    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16064
16065/* ------------------------------ */
16066    .balign 64
16067.L_ALT_OP_IF_EQ: /* 0x32 */
16068/* File: armv5te/alt_stub.S */
16069/*
16070 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16071 * any interesting requests and then jump to the real instruction
16072 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16073 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16074 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16075 * bail to the real handler if breakFlags==0.
16076 */
16077    ldrb   r3, [rSELF, #offThread_breakFlags]
16078    adrl   lr, dvmAsmInstructionStart + (50 * 64)
16079    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16080    cmp    r3, #0
16081    bxeq   lr                   @ nothing to do - jump to real handler
16082    EXPORT_PC()
16083    mov    r0, rPC              @ arg0
16084    mov    r1, rFP              @ arg1
16085    mov    r2, rSELF            @ arg2
16086    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16087
16088/* ------------------------------ */
16089    .balign 64
16090.L_ALT_OP_IF_NE: /* 0x33 */
16091/* File: armv5te/alt_stub.S */
16092/*
16093 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16094 * any interesting requests and then jump to the real instruction
16095 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16096 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16097 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16098 * bail to the real handler if breakFlags==0.
16099 */
16100    ldrb   r3, [rSELF, #offThread_breakFlags]
16101    adrl   lr, dvmAsmInstructionStart + (51 * 64)
16102    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16103    cmp    r3, #0
16104    bxeq   lr                   @ nothing to do - jump to real handler
16105    EXPORT_PC()
16106    mov    r0, rPC              @ arg0
16107    mov    r1, rFP              @ arg1
16108    mov    r2, rSELF            @ arg2
16109    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16110
16111/* ------------------------------ */
16112    .balign 64
16113.L_ALT_OP_IF_LT: /* 0x34 */
16114/* File: armv5te/alt_stub.S */
16115/*
16116 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16117 * any interesting requests and then jump to the real instruction
16118 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16119 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16120 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16121 * bail to the real handler if breakFlags==0.
16122 */
16123    ldrb   r3, [rSELF, #offThread_breakFlags]
16124    adrl   lr, dvmAsmInstructionStart + (52 * 64)
16125    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16126    cmp    r3, #0
16127    bxeq   lr                   @ nothing to do - jump to real handler
16128    EXPORT_PC()
16129    mov    r0, rPC              @ arg0
16130    mov    r1, rFP              @ arg1
16131    mov    r2, rSELF            @ arg2
16132    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16133
16134/* ------------------------------ */
16135    .balign 64
16136.L_ALT_OP_IF_GE: /* 0x35 */
16137/* File: armv5te/alt_stub.S */
16138/*
16139 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16140 * any interesting requests and then jump to the real instruction
16141 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16142 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16143 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16144 * bail to the real handler if breakFlags==0.
16145 */
16146    ldrb   r3, [rSELF, #offThread_breakFlags]
16147    adrl   lr, dvmAsmInstructionStart + (53 * 64)
16148    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16149    cmp    r3, #0
16150    bxeq   lr                   @ nothing to do - jump to real handler
16151    EXPORT_PC()
16152    mov    r0, rPC              @ arg0
16153    mov    r1, rFP              @ arg1
16154    mov    r2, rSELF            @ arg2
16155    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16156
16157/* ------------------------------ */
16158    .balign 64
16159.L_ALT_OP_IF_GT: /* 0x36 */
16160/* File: armv5te/alt_stub.S */
16161/*
16162 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16163 * any interesting requests and then jump to the real instruction
16164 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16165 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16166 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16167 * bail to the real handler if breakFlags==0.
16168 */
16169    ldrb   r3, [rSELF, #offThread_breakFlags]
16170    adrl   lr, dvmAsmInstructionStart + (54 * 64)
16171    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16172    cmp    r3, #0
16173    bxeq   lr                   @ nothing to do - jump to real handler
16174    EXPORT_PC()
16175    mov    r0, rPC              @ arg0
16176    mov    r1, rFP              @ arg1
16177    mov    r2, rSELF            @ arg2
16178    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16179
16180/* ------------------------------ */
16181    .balign 64
16182.L_ALT_OP_IF_LE: /* 0x37 */
16183/* File: armv5te/alt_stub.S */
16184/*
16185 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16186 * any interesting requests and then jump to the real instruction
16187 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16188 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16189 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16190 * bail to the real handler if breakFlags==0.
16191 */
16192    ldrb   r3, [rSELF, #offThread_breakFlags]
16193    adrl   lr, dvmAsmInstructionStart + (55 * 64)
16194    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16195    cmp    r3, #0
16196    bxeq   lr                   @ nothing to do - jump to real handler
16197    EXPORT_PC()
16198    mov    r0, rPC              @ arg0
16199    mov    r1, rFP              @ arg1
16200    mov    r2, rSELF            @ arg2
16201    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16202
16203/* ------------------------------ */
16204    .balign 64
16205.L_ALT_OP_IF_EQZ: /* 0x38 */
16206/* File: armv5te/alt_stub.S */
16207/*
16208 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16209 * any interesting requests and then jump to the real instruction
16210 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16211 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16212 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16213 * bail to the real handler if breakFlags==0.
16214 */
16215    ldrb   r3, [rSELF, #offThread_breakFlags]
16216    adrl   lr, dvmAsmInstructionStart + (56 * 64)
16217    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16218    cmp    r3, #0
16219    bxeq   lr                   @ nothing to do - jump to real handler
16220    EXPORT_PC()
16221    mov    r0, rPC              @ arg0
16222    mov    r1, rFP              @ arg1
16223    mov    r2, rSELF            @ arg2
16224    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16225
16226/* ------------------------------ */
16227    .balign 64
16228.L_ALT_OP_IF_NEZ: /* 0x39 */
16229/* File: armv5te/alt_stub.S */
16230/*
16231 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16232 * any interesting requests and then jump to the real instruction
16233 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16234 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16235 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16236 * bail to the real handler if breakFlags==0.
16237 */
16238    ldrb   r3, [rSELF, #offThread_breakFlags]
16239    adrl   lr, dvmAsmInstructionStart + (57 * 64)
16240    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16241    cmp    r3, #0
16242    bxeq   lr                   @ nothing to do - jump to real handler
16243    EXPORT_PC()
16244    mov    r0, rPC              @ arg0
16245    mov    r1, rFP              @ arg1
16246    mov    r2, rSELF            @ arg2
16247    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16248
16249/* ------------------------------ */
16250    .balign 64
16251.L_ALT_OP_IF_LTZ: /* 0x3a */
16252/* File: armv5te/alt_stub.S */
16253/*
16254 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16255 * any interesting requests and then jump to the real instruction
16256 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16257 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16258 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16259 * bail to the real handler if breakFlags==0.
16260 */
16261    ldrb   r3, [rSELF, #offThread_breakFlags]
16262    adrl   lr, dvmAsmInstructionStart + (58 * 64)
16263    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16264    cmp    r3, #0
16265    bxeq   lr                   @ nothing to do - jump to real handler
16266    EXPORT_PC()
16267    mov    r0, rPC              @ arg0
16268    mov    r1, rFP              @ arg1
16269    mov    r2, rSELF            @ arg2
16270    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16271
16272/* ------------------------------ */
16273    .balign 64
16274.L_ALT_OP_IF_GEZ: /* 0x3b */
16275/* File: armv5te/alt_stub.S */
16276/*
16277 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16278 * any interesting requests and then jump to the real instruction
16279 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16280 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16281 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16282 * bail to the real handler if breakFlags==0.
16283 */
16284    ldrb   r3, [rSELF, #offThread_breakFlags]
16285    adrl   lr, dvmAsmInstructionStart + (59 * 64)
16286    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16287    cmp    r3, #0
16288    bxeq   lr                   @ nothing to do - jump to real handler
16289    EXPORT_PC()
16290    mov    r0, rPC              @ arg0
16291    mov    r1, rFP              @ arg1
16292    mov    r2, rSELF            @ arg2
16293    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16294
16295/* ------------------------------ */
16296    .balign 64
16297.L_ALT_OP_IF_GTZ: /* 0x3c */
16298/* File: armv5te/alt_stub.S */
16299/*
16300 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16301 * any interesting requests and then jump to the real instruction
16302 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16303 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16304 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16305 * bail to the real handler if breakFlags==0.
16306 */
16307    ldrb   r3, [rSELF, #offThread_breakFlags]
16308    adrl   lr, dvmAsmInstructionStart + (60 * 64)
16309    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16310    cmp    r3, #0
16311    bxeq   lr                   @ nothing to do - jump to real handler
16312    EXPORT_PC()
16313    mov    r0, rPC              @ arg0
16314    mov    r1, rFP              @ arg1
16315    mov    r2, rSELF            @ arg2
16316    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16317
16318/* ------------------------------ */
16319    .balign 64
16320.L_ALT_OP_IF_LEZ: /* 0x3d */
16321/* File: armv5te/alt_stub.S */
16322/*
16323 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16324 * any interesting requests and then jump to the real instruction
16325 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16326 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16327 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16328 * bail to the real handler if breakFlags==0.
16329 */
16330    ldrb   r3, [rSELF, #offThread_breakFlags]
16331    adrl   lr, dvmAsmInstructionStart + (61 * 64)
16332    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16333    cmp    r3, #0
16334    bxeq   lr                   @ nothing to do - jump to real handler
16335    EXPORT_PC()
16336    mov    r0, rPC              @ arg0
16337    mov    r1, rFP              @ arg1
16338    mov    r2, rSELF            @ arg2
16339    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16340
16341/* ------------------------------ */
16342    .balign 64
16343.L_ALT_OP_UNUSED_3E: /* 0x3e */
16344/* File: armv5te/alt_stub.S */
16345/*
16346 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16347 * any interesting requests and then jump to the real instruction
16348 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16349 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16350 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16351 * bail to the real handler if breakFlags==0.
16352 */
16353    ldrb   r3, [rSELF, #offThread_breakFlags]
16354    adrl   lr, dvmAsmInstructionStart + (62 * 64)
16355    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16356    cmp    r3, #0
16357    bxeq   lr                   @ nothing to do - jump to real handler
16358    EXPORT_PC()
16359    mov    r0, rPC              @ arg0
16360    mov    r1, rFP              @ arg1
16361    mov    r2, rSELF            @ arg2
16362    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16363
16364/* ------------------------------ */
16365    .balign 64
16366.L_ALT_OP_UNUSED_3F: /* 0x3f */
16367/* File: armv5te/alt_stub.S */
16368/*
16369 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16370 * any interesting requests and then jump to the real instruction
16371 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16372 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16373 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16374 * bail to the real handler if breakFlags==0.
16375 */
16376    ldrb   r3, [rSELF, #offThread_breakFlags]
16377    adrl   lr, dvmAsmInstructionStart + (63 * 64)
16378    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16379    cmp    r3, #0
16380    bxeq   lr                   @ nothing to do - jump to real handler
16381    EXPORT_PC()
16382    mov    r0, rPC              @ arg0
16383    mov    r1, rFP              @ arg1
16384    mov    r2, rSELF            @ arg2
16385    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16386
16387/* ------------------------------ */
16388    .balign 64
16389.L_ALT_OP_UNUSED_40: /* 0x40 */
16390/* File: armv5te/alt_stub.S */
16391/*
16392 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16393 * any interesting requests and then jump to the real instruction
16394 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16395 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16396 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16397 * bail to the real handler if breakFlags==0.
16398 */
16399    ldrb   r3, [rSELF, #offThread_breakFlags]
16400    adrl   lr, dvmAsmInstructionStart + (64 * 64)
16401    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16402    cmp    r3, #0
16403    bxeq   lr                   @ nothing to do - jump to real handler
16404    EXPORT_PC()
16405    mov    r0, rPC              @ arg0
16406    mov    r1, rFP              @ arg1
16407    mov    r2, rSELF            @ arg2
16408    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16409
16410/* ------------------------------ */
16411    .balign 64
16412.L_ALT_OP_UNUSED_41: /* 0x41 */
16413/* File: armv5te/alt_stub.S */
16414/*
16415 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16416 * any interesting requests and then jump to the real instruction
16417 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16418 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16419 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16420 * bail to the real handler if breakFlags==0.
16421 */
16422    ldrb   r3, [rSELF, #offThread_breakFlags]
16423    adrl   lr, dvmAsmInstructionStart + (65 * 64)
16424    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16425    cmp    r3, #0
16426    bxeq   lr                   @ nothing to do - jump to real handler
16427    EXPORT_PC()
16428    mov    r0, rPC              @ arg0
16429    mov    r1, rFP              @ arg1
16430    mov    r2, rSELF            @ arg2
16431    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16432
16433/* ------------------------------ */
16434    .balign 64
16435.L_ALT_OP_UNUSED_42: /* 0x42 */
16436/* File: armv5te/alt_stub.S */
16437/*
16438 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16439 * any interesting requests and then jump to the real instruction
16440 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16441 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16442 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16443 * bail to the real handler if breakFlags==0.
16444 */
16445    ldrb   r3, [rSELF, #offThread_breakFlags]
16446    adrl   lr, dvmAsmInstructionStart + (66 * 64)
16447    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16448    cmp    r3, #0
16449    bxeq   lr                   @ nothing to do - jump to real handler
16450    EXPORT_PC()
16451    mov    r0, rPC              @ arg0
16452    mov    r1, rFP              @ arg1
16453    mov    r2, rSELF            @ arg2
16454    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16455
16456/* ------------------------------ */
16457    .balign 64
16458.L_ALT_OP_UNUSED_43: /* 0x43 */
16459/* File: armv5te/alt_stub.S */
16460/*
16461 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16462 * any interesting requests and then jump to the real instruction
16463 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16464 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16465 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16466 * bail to the real handler if breakFlags==0.
16467 */
16468    ldrb   r3, [rSELF, #offThread_breakFlags]
16469    adrl   lr, dvmAsmInstructionStart + (67 * 64)
16470    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16471    cmp    r3, #0
16472    bxeq   lr                   @ nothing to do - jump to real handler
16473    EXPORT_PC()
16474    mov    r0, rPC              @ arg0
16475    mov    r1, rFP              @ arg1
16476    mov    r2, rSELF            @ arg2
16477    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16478
16479/* ------------------------------ */
16480    .balign 64
16481.L_ALT_OP_AGET: /* 0x44 */
16482/* File: armv5te/alt_stub.S */
16483/*
16484 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16485 * any interesting requests and then jump to the real instruction
16486 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16487 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16488 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16489 * bail to the real handler if breakFlags==0.
16490 */
16491    ldrb   r3, [rSELF, #offThread_breakFlags]
16492    adrl   lr, dvmAsmInstructionStart + (68 * 64)
16493    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16494    cmp    r3, #0
16495    bxeq   lr                   @ nothing to do - jump to real handler
16496    EXPORT_PC()
16497    mov    r0, rPC              @ arg0
16498    mov    r1, rFP              @ arg1
16499    mov    r2, rSELF            @ arg2
16500    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16501
16502/* ------------------------------ */
16503    .balign 64
16504.L_ALT_OP_AGET_WIDE: /* 0x45 */
16505/* File: armv5te/alt_stub.S */
16506/*
16507 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16508 * any interesting requests and then jump to the real instruction
16509 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16510 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16511 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16512 * bail to the real handler if breakFlags==0.
16513 */
16514    ldrb   r3, [rSELF, #offThread_breakFlags]
16515    adrl   lr, dvmAsmInstructionStart + (69 * 64)
16516    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16517    cmp    r3, #0
16518    bxeq   lr                   @ nothing to do - jump to real handler
16519    EXPORT_PC()
16520    mov    r0, rPC              @ arg0
16521    mov    r1, rFP              @ arg1
16522    mov    r2, rSELF            @ arg2
16523    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16524
16525/* ------------------------------ */
16526    .balign 64
16527.L_ALT_OP_AGET_OBJECT: /* 0x46 */
16528/* File: armv5te/alt_stub.S */
16529/*
16530 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16531 * any interesting requests and then jump to the real instruction
16532 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16533 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16534 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16535 * bail to the real handler if breakFlags==0.
16536 */
16537    ldrb   r3, [rSELF, #offThread_breakFlags]
16538    adrl   lr, dvmAsmInstructionStart + (70 * 64)
16539    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16540    cmp    r3, #0
16541    bxeq   lr                   @ nothing to do - jump to real handler
16542    EXPORT_PC()
16543    mov    r0, rPC              @ arg0
16544    mov    r1, rFP              @ arg1
16545    mov    r2, rSELF            @ arg2
16546    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16547
16548/* ------------------------------ */
16549    .balign 64
16550.L_ALT_OP_AGET_BOOLEAN: /* 0x47 */
16551/* File: armv5te/alt_stub.S */
16552/*
16553 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16554 * any interesting requests and then jump to the real instruction
16555 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16556 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16557 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16558 * bail to the real handler if breakFlags==0.
16559 */
16560    ldrb   r3, [rSELF, #offThread_breakFlags]
16561    adrl   lr, dvmAsmInstructionStart + (71 * 64)
16562    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16563    cmp    r3, #0
16564    bxeq   lr                   @ nothing to do - jump to real handler
16565    EXPORT_PC()
16566    mov    r0, rPC              @ arg0
16567    mov    r1, rFP              @ arg1
16568    mov    r2, rSELF            @ arg2
16569    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16570
16571/* ------------------------------ */
16572    .balign 64
16573.L_ALT_OP_AGET_BYTE: /* 0x48 */
16574/* File: armv5te/alt_stub.S */
16575/*
16576 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16577 * any interesting requests and then jump to the real instruction
16578 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16579 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16580 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16581 * bail to the real handler if breakFlags==0.
16582 */
16583    ldrb   r3, [rSELF, #offThread_breakFlags]
16584    adrl   lr, dvmAsmInstructionStart + (72 * 64)
16585    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16586    cmp    r3, #0
16587    bxeq   lr                   @ nothing to do - jump to real handler
16588    EXPORT_PC()
16589    mov    r0, rPC              @ arg0
16590    mov    r1, rFP              @ arg1
16591    mov    r2, rSELF            @ arg2
16592    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16593
16594/* ------------------------------ */
16595    .balign 64
16596.L_ALT_OP_AGET_CHAR: /* 0x49 */
16597/* File: armv5te/alt_stub.S */
16598/*
16599 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16600 * any interesting requests and then jump to the real instruction
16601 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16602 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16603 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16604 * bail to the real handler if breakFlags==0.
16605 */
16606    ldrb   r3, [rSELF, #offThread_breakFlags]
16607    adrl   lr, dvmAsmInstructionStart + (73 * 64)
16608    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16609    cmp    r3, #0
16610    bxeq   lr                   @ nothing to do - jump to real handler
16611    EXPORT_PC()
16612    mov    r0, rPC              @ arg0
16613    mov    r1, rFP              @ arg1
16614    mov    r2, rSELF            @ arg2
16615    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16616
16617/* ------------------------------ */
16618    .balign 64
16619.L_ALT_OP_AGET_SHORT: /* 0x4a */
16620/* File: armv5te/alt_stub.S */
16621/*
16622 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16623 * any interesting requests and then jump to the real instruction
16624 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16625 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16626 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16627 * bail to the real handler if breakFlags==0.
16628 */
16629    ldrb   r3, [rSELF, #offThread_breakFlags]
16630    adrl   lr, dvmAsmInstructionStart + (74 * 64)
16631    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16632    cmp    r3, #0
16633    bxeq   lr                   @ nothing to do - jump to real handler
16634    EXPORT_PC()
16635    mov    r0, rPC              @ arg0
16636    mov    r1, rFP              @ arg1
16637    mov    r2, rSELF            @ arg2
16638    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16639
16640/* ------------------------------ */
16641    .balign 64
16642.L_ALT_OP_APUT: /* 0x4b */
16643/* File: armv5te/alt_stub.S */
16644/*
16645 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16646 * any interesting requests and then jump to the real instruction
16647 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16648 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16649 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16650 * bail to the real handler if breakFlags==0.
16651 */
16652    ldrb   r3, [rSELF, #offThread_breakFlags]
16653    adrl   lr, dvmAsmInstructionStart + (75 * 64)
16654    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16655    cmp    r3, #0
16656    bxeq   lr                   @ nothing to do - jump to real handler
16657    EXPORT_PC()
16658    mov    r0, rPC              @ arg0
16659    mov    r1, rFP              @ arg1
16660    mov    r2, rSELF            @ arg2
16661    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16662
16663/* ------------------------------ */
16664    .balign 64
16665.L_ALT_OP_APUT_WIDE: /* 0x4c */
16666/* File: armv5te/alt_stub.S */
16667/*
16668 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16669 * any interesting requests and then jump to the real instruction
16670 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16671 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16672 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16673 * bail to the real handler if breakFlags==0.
16674 */
16675    ldrb   r3, [rSELF, #offThread_breakFlags]
16676    adrl   lr, dvmAsmInstructionStart + (76 * 64)
16677    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16678    cmp    r3, #0
16679    bxeq   lr                   @ nothing to do - jump to real handler
16680    EXPORT_PC()
16681    mov    r0, rPC              @ arg0
16682    mov    r1, rFP              @ arg1
16683    mov    r2, rSELF            @ arg2
16684    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16685
16686/* ------------------------------ */
16687    .balign 64
16688.L_ALT_OP_APUT_OBJECT: /* 0x4d */
16689/* File: armv5te/alt_stub.S */
16690/*
16691 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16692 * any interesting requests and then jump to the real instruction
16693 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16694 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16695 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16696 * bail to the real handler if breakFlags==0.
16697 */
16698    ldrb   r3, [rSELF, #offThread_breakFlags]
16699    adrl   lr, dvmAsmInstructionStart + (77 * 64)
16700    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16701    cmp    r3, #0
16702    bxeq   lr                   @ nothing to do - jump to real handler
16703    EXPORT_PC()
16704    mov    r0, rPC              @ arg0
16705    mov    r1, rFP              @ arg1
16706    mov    r2, rSELF            @ arg2
16707    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16708
16709/* ------------------------------ */
16710    .balign 64
16711.L_ALT_OP_APUT_BOOLEAN: /* 0x4e */
16712/* File: armv5te/alt_stub.S */
16713/*
16714 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16715 * any interesting requests and then jump to the real instruction
16716 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16717 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16718 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16719 * bail to the real handler if breakFlags==0.
16720 */
16721    ldrb   r3, [rSELF, #offThread_breakFlags]
16722    adrl   lr, dvmAsmInstructionStart + (78 * 64)
16723    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16724    cmp    r3, #0
16725    bxeq   lr                   @ nothing to do - jump to real handler
16726    EXPORT_PC()
16727    mov    r0, rPC              @ arg0
16728    mov    r1, rFP              @ arg1
16729    mov    r2, rSELF            @ arg2
16730    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16731
16732/* ------------------------------ */
16733    .balign 64
16734.L_ALT_OP_APUT_BYTE: /* 0x4f */
16735/* File: armv5te/alt_stub.S */
16736/*
16737 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16738 * any interesting requests and then jump to the real instruction
16739 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16740 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16741 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16742 * bail to the real handler if breakFlags==0.
16743 */
16744    ldrb   r3, [rSELF, #offThread_breakFlags]
16745    adrl   lr, dvmAsmInstructionStart + (79 * 64)
16746    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16747    cmp    r3, #0
16748    bxeq   lr                   @ nothing to do - jump to real handler
16749    EXPORT_PC()
16750    mov    r0, rPC              @ arg0
16751    mov    r1, rFP              @ arg1
16752    mov    r2, rSELF            @ arg2
16753    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16754
16755/* ------------------------------ */
16756    .balign 64
16757.L_ALT_OP_APUT_CHAR: /* 0x50 */
16758/* File: armv5te/alt_stub.S */
16759/*
16760 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16761 * any interesting requests and then jump to the real instruction
16762 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16763 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16764 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16765 * bail to the real handler if breakFlags==0.
16766 */
16767    ldrb   r3, [rSELF, #offThread_breakFlags]
16768    adrl   lr, dvmAsmInstructionStart + (80 * 64)
16769    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16770    cmp    r3, #0
16771    bxeq   lr                   @ nothing to do - jump to real handler
16772    EXPORT_PC()
16773    mov    r0, rPC              @ arg0
16774    mov    r1, rFP              @ arg1
16775    mov    r2, rSELF            @ arg2
16776    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16777
16778/* ------------------------------ */
16779    .balign 64
16780.L_ALT_OP_APUT_SHORT: /* 0x51 */
16781/* File: armv5te/alt_stub.S */
16782/*
16783 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16784 * any interesting requests and then jump to the real instruction
16785 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16786 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16787 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16788 * bail to the real handler if breakFlags==0.
16789 */
16790    ldrb   r3, [rSELF, #offThread_breakFlags]
16791    adrl   lr, dvmAsmInstructionStart + (81 * 64)
16792    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16793    cmp    r3, #0
16794    bxeq   lr                   @ nothing to do - jump to real handler
16795    EXPORT_PC()
16796    mov    r0, rPC              @ arg0
16797    mov    r1, rFP              @ arg1
16798    mov    r2, rSELF            @ arg2
16799    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16800
16801/* ------------------------------ */
16802    .balign 64
16803.L_ALT_OP_IGET: /* 0x52 */
16804/* File: armv5te/alt_stub.S */
16805/*
16806 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16807 * any interesting requests and then jump to the real instruction
16808 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16809 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16810 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16811 * bail to the real handler if breakFlags==0.
16812 */
16813    ldrb   r3, [rSELF, #offThread_breakFlags]
16814    adrl   lr, dvmAsmInstructionStart + (82 * 64)
16815    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16816    cmp    r3, #0
16817    bxeq   lr                   @ nothing to do - jump to real handler
16818    EXPORT_PC()
16819    mov    r0, rPC              @ arg0
16820    mov    r1, rFP              @ arg1
16821    mov    r2, rSELF            @ arg2
16822    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16823
16824/* ------------------------------ */
16825    .balign 64
16826.L_ALT_OP_IGET_WIDE: /* 0x53 */
16827/* File: armv5te/alt_stub.S */
16828/*
16829 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16830 * any interesting requests and then jump to the real instruction
16831 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16832 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16833 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16834 * bail to the real handler if breakFlags==0.
16835 */
16836    ldrb   r3, [rSELF, #offThread_breakFlags]
16837    adrl   lr, dvmAsmInstructionStart + (83 * 64)
16838    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16839    cmp    r3, #0
16840    bxeq   lr                   @ nothing to do - jump to real handler
16841    EXPORT_PC()
16842    mov    r0, rPC              @ arg0
16843    mov    r1, rFP              @ arg1
16844    mov    r2, rSELF            @ arg2
16845    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16846
16847/* ------------------------------ */
16848    .balign 64
16849.L_ALT_OP_IGET_OBJECT: /* 0x54 */
16850/* File: armv5te/alt_stub.S */
16851/*
16852 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16853 * any interesting requests and then jump to the real instruction
16854 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16855 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16856 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16857 * bail to the real handler if breakFlags==0.
16858 */
16859    ldrb   r3, [rSELF, #offThread_breakFlags]
16860    adrl   lr, dvmAsmInstructionStart + (84 * 64)
16861    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16862    cmp    r3, #0
16863    bxeq   lr                   @ nothing to do - jump to real handler
16864    EXPORT_PC()
16865    mov    r0, rPC              @ arg0
16866    mov    r1, rFP              @ arg1
16867    mov    r2, rSELF            @ arg2
16868    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16869
16870/* ------------------------------ */
16871    .balign 64
16872.L_ALT_OP_IGET_BOOLEAN: /* 0x55 */
16873/* File: armv5te/alt_stub.S */
16874/*
16875 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16876 * any interesting requests and then jump to the real instruction
16877 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16878 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16879 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16880 * bail to the real handler if breakFlags==0.
16881 */
16882    ldrb   r3, [rSELF, #offThread_breakFlags]
16883    adrl   lr, dvmAsmInstructionStart + (85 * 64)
16884    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16885    cmp    r3, #0
16886    bxeq   lr                   @ nothing to do - jump to real handler
16887    EXPORT_PC()
16888    mov    r0, rPC              @ arg0
16889    mov    r1, rFP              @ arg1
16890    mov    r2, rSELF            @ arg2
16891    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16892
16893/* ------------------------------ */
16894    .balign 64
16895.L_ALT_OP_IGET_BYTE: /* 0x56 */
16896/* File: armv5te/alt_stub.S */
16897/*
16898 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16899 * any interesting requests and then jump to the real instruction
16900 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16901 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16902 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16903 * bail to the real handler if breakFlags==0.
16904 */
16905    ldrb   r3, [rSELF, #offThread_breakFlags]
16906    adrl   lr, dvmAsmInstructionStart + (86 * 64)
16907    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16908    cmp    r3, #0
16909    bxeq   lr                   @ nothing to do - jump to real handler
16910    EXPORT_PC()
16911    mov    r0, rPC              @ arg0
16912    mov    r1, rFP              @ arg1
16913    mov    r2, rSELF            @ arg2
16914    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16915
16916/* ------------------------------ */
16917    .balign 64
16918.L_ALT_OP_IGET_CHAR: /* 0x57 */
16919/* File: armv5te/alt_stub.S */
16920/*
16921 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16922 * any interesting requests and then jump to the real instruction
16923 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16924 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16925 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16926 * bail to the real handler if breakFlags==0.
16927 */
16928    ldrb   r3, [rSELF, #offThread_breakFlags]
16929    adrl   lr, dvmAsmInstructionStart + (87 * 64)
16930    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16931    cmp    r3, #0
16932    bxeq   lr                   @ nothing to do - jump to real handler
16933    EXPORT_PC()
16934    mov    r0, rPC              @ arg0
16935    mov    r1, rFP              @ arg1
16936    mov    r2, rSELF            @ arg2
16937    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16938
16939/* ------------------------------ */
16940    .balign 64
16941.L_ALT_OP_IGET_SHORT: /* 0x58 */
16942/* File: armv5te/alt_stub.S */
16943/*
16944 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16945 * any interesting requests and then jump to the real instruction
16946 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16947 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16948 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16949 * bail to the real handler if breakFlags==0.
16950 */
16951    ldrb   r3, [rSELF, #offThread_breakFlags]
16952    adrl   lr, dvmAsmInstructionStart + (88 * 64)
16953    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16954    cmp    r3, #0
16955    bxeq   lr                   @ nothing to do - jump to real handler
16956    EXPORT_PC()
16957    mov    r0, rPC              @ arg0
16958    mov    r1, rFP              @ arg1
16959    mov    r2, rSELF            @ arg2
16960    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16961
16962/* ------------------------------ */
16963    .balign 64
16964.L_ALT_OP_IPUT: /* 0x59 */
16965/* File: armv5te/alt_stub.S */
16966/*
16967 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16968 * any interesting requests and then jump to the real instruction
16969 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16970 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16971 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16972 * bail to the real handler if breakFlags==0.
16973 */
16974    ldrb   r3, [rSELF, #offThread_breakFlags]
16975    adrl   lr, dvmAsmInstructionStart + (89 * 64)
16976    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16977    cmp    r3, #0
16978    bxeq   lr                   @ nothing to do - jump to real handler
16979    EXPORT_PC()
16980    mov    r0, rPC              @ arg0
16981    mov    r1, rFP              @ arg1
16982    mov    r2, rSELF            @ arg2
16983    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16984
16985/* ------------------------------ */
16986    .balign 64
16987.L_ALT_OP_IPUT_WIDE: /* 0x5a */
16988/* File: armv5te/alt_stub.S */
16989/*
16990 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16991 * any interesting requests and then jump to the real instruction
16992 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16993 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16994 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16995 * bail to the real handler if breakFlags==0.
16996 */
16997    ldrb   r3, [rSELF, #offThread_breakFlags]
16998    adrl   lr, dvmAsmInstructionStart + (90 * 64)
16999    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17000    cmp    r3, #0
17001    bxeq   lr                   @ nothing to do - jump to real handler
17002    EXPORT_PC()
17003    mov    r0, rPC              @ arg0
17004    mov    r1, rFP              @ arg1
17005    mov    r2, rSELF            @ arg2
17006    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17007
17008/* ------------------------------ */
17009    .balign 64
17010.L_ALT_OP_IPUT_OBJECT: /* 0x5b */
17011/* File: armv5te/alt_stub.S */
17012/*
17013 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17014 * any interesting requests and then jump to the real instruction
17015 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17016 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17017 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17018 * bail to the real handler if breakFlags==0.
17019 */
17020    ldrb   r3, [rSELF, #offThread_breakFlags]
17021    adrl   lr, dvmAsmInstructionStart + (91 * 64)
17022    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17023    cmp    r3, #0
17024    bxeq   lr                   @ nothing to do - jump to real handler
17025    EXPORT_PC()
17026    mov    r0, rPC              @ arg0
17027    mov    r1, rFP              @ arg1
17028    mov    r2, rSELF            @ arg2
17029    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17030
17031/* ------------------------------ */
17032    .balign 64
17033.L_ALT_OP_IPUT_BOOLEAN: /* 0x5c */
17034/* File: armv5te/alt_stub.S */
17035/*
17036 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17037 * any interesting requests and then jump to the real instruction
17038 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17039 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17040 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17041 * bail to the real handler if breakFlags==0.
17042 */
17043    ldrb   r3, [rSELF, #offThread_breakFlags]
17044    adrl   lr, dvmAsmInstructionStart + (92 * 64)
17045    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17046    cmp    r3, #0
17047    bxeq   lr                   @ nothing to do - jump to real handler
17048    EXPORT_PC()
17049    mov    r0, rPC              @ arg0
17050    mov    r1, rFP              @ arg1
17051    mov    r2, rSELF            @ arg2
17052    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17053
17054/* ------------------------------ */
17055    .balign 64
17056.L_ALT_OP_IPUT_BYTE: /* 0x5d */
17057/* File: armv5te/alt_stub.S */
17058/*
17059 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17060 * any interesting requests and then jump to the real instruction
17061 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17062 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17063 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17064 * bail to the real handler if breakFlags==0.
17065 */
17066    ldrb   r3, [rSELF, #offThread_breakFlags]
17067    adrl   lr, dvmAsmInstructionStart + (93 * 64)
17068    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17069    cmp    r3, #0
17070    bxeq   lr                   @ nothing to do - jump to real handler
17071    EXPORT_PC()
17072    mov    r0, rPC              @ arg0
17073    mov    r1, rFP              @ arg1
17074    mov    r2, rSELF            @ arg2
17075    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17076
17077/* ------------------------------ */
17078    .balign 64
17079.L_ALT_OP_IPUT_CHAR: /* 0x5e */
17080/* File: armv5te/alt_stub.S */
17081/*
17082 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17083 * any interesting requests and then jump to the real instruction
17084 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17085 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17086 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17087 * bail to the real handler if breakFlags==0.
17088 */
17089    ldrb   r3, [rSELF, #offThread_breakFlags]
17090    adrl   lr, dvmAsmInstructionStart + (94 * 64)
17091    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17092    cmp    r3, #0
17093    bxeq   lr                   @ nothing to do - jump to real handler
17094    EXPORT_PC()
17095    mov    r0, rPC              @ arg0
17096    mov    r1, rFP              @ arg1
17097    mov    r2, rSELF            @ arg2
17098    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17099
17100/* ------------------------------ */
17101    .balign 64
17102.L_ALT_OP_IPUT_SHORT: /* 0x5f */
17103/* File: armv5te/alt_stub.S */
17104/*
17105 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17106 * any interesting requests and then jump to the real instruction
17107 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17108 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17109 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17110 * bail to the real handler if breakFlags==0.
17111 */
17112    ldrb   r3, [rSELF, #offThread_breakFlags]
17113    adrl   lr, dvmAsmInstructionStart + (95 * 64)
17114    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17115    cmp    r3, #0
17116    bxeq   lr                   @ nothing to do - jump to real handler
17117    EXPORT_PC()
17118    mov    r0, rPC              @ arg0
17119    mov    r1, rFP              @ arg1
17120    mov    r2, rSELF            @ arg2
17121    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17122
17123/* ------------------------------ */
17124    .balign 64
17125.L_ALT_OP_SGET: /* 0x60 */
17126/* File: armv5te/alt_stub.S */
17127/*
17128 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17129 * any interesting requests and then jump to the real instruction
17130 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17131 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17132 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17133 * bail to the real handler if breakFlags==0.
17134 */
17135    ldrb   r3, [rSELF, #offThread_breakFlags]
17136    adrl   lr, dvmAsmInstructionStart + (96 * 64)
17137    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17138    cmp    r3, #0
17139    bxeq   lr                   @ nothing to do - jump to real handler
17140    EXPORT_PC()
17141    mov    r0, rPC              @ arg0
17142    mov    r1, rFP              @ arg1
17143    mov    r2, rSELF            @ arg2
17144    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17145
17146/* ------------------------------ */
17147    .balign 64
17148.L_ALT_OP_SGET_WIDE: /* 0x61 */
17149/* File: armv5te/alt_stub.S */
17150/*
17151 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17152 * any interesting requests and then jump to the real instruction
17153 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17154 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17155 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17156 * bail to the real handler if breakFlags==0.
17157 */
17158    ldrb   r3, [rSELF, #offThread_breakFlags]
17159    adrl   lr, dvmAsmInstructionStart + (97 * 64)
17160    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17161    cmp    r3, #0
17162    bxeq   lr                   @ nothing to do - jump to real handler
17163    EXPORT_PC()
17164    mov    r0, rPC              @ arg0
17165    mov    r1, rFP              @ arg1
17166    mov    r2, rSELF            @ arg2
17167    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17168
17169/* ------------------------------ */
17170    .balign 64
17171.L_ALT_OP_SGET_OBJECT: /* 0x62 */
17172/* File: armv5te/alt_stub.S */
17173/*
17174 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17175 * any interesting requests and then jump to the real instruction
17176 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17177 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17178 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17179 * bail to the real handler if breakFlags==0.
17180 */
17181    ldrb   r3, [rSELF, #offThread_breakFlags]
17182    adrl   lr, dvmAsmInstructionStart + (98 * 64)
17183    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17184    cmp    r3, #0
17185    bxeq   lr                   @ nothing to do - jump to real handler
17186    EXPORT_PC()
17187    mov    r0, rPC              @ arg0
17188    mov    r1, rFP              @ arg1
17189    mov    r2, rSELF            @ arg2
17190    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17191
17192/* ------------------------------ */
17193    .balign 64
17194.L_ALT_OP_SGET_BOOLEAN: /* 0x63 */
17195/* File: armv5te/alt_stub.S */
17196/*
17197 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17198 * any interesting requests and then jump to the real instruction
17199 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17200 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17201 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17202 * bail to the real handler if breakFlags==0.
17203 */
17204    ldrb   r3, [rSELF, #offThread_breakFlags]
17205    adrl   lr, dvmAsmInstructionStart + (99 * 64)
17206    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17207    cmp    r3, #0
17208    bxeq   lr                   @ nothing to do - jump to real handler
17209    EXPORT_PC()
17210    mov    r0, rPC              @ arg0
17211    mov    r1, rFP              @ arg1
17212    mov    r2, rSELF            @ arg2
17213    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17214
17215/* ------------------------------ */
17216    .balign 64
17217.L_ALT_OP_SGET_BYTE: /* 0x64 */
17218/* File: armv5te/alt_stub.S */
17219/*
17220 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17221 * any interesting requests and then jump to the real instruction
17222 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17223 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17224 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17225 * bail to the real handler if breakFlags==0.
17226 */
17227    ldrb   r3, [rSELF, #offThread_breakFlags]
17228    adrl   lr, dvmAsmInstructionStart + (100 * 64)
17229    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17230    cmp    r3, #0
17231    bxeq   lr                   @ nothing to do - jump to real handler
17232    EXPORT_PC()
17233    mov    r0, rPC              @ arg0
17234    mov    r1, rFP              @ arg1
17235    mov    r2, rSELF            @ arg2
17236    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17237
17238/* ------------------------------ */
17239    .balign 64
17240.L_ALT_OP_SGET_CHAR: /* 0x65 */
17241/* File: armv5te/alt_stub.S */
17242/*
17243 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17244 * any interesting requests and then jump to the real instruction
17245 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17246 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17247 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17248 * bail to the real handler if breakFlags==0.
17249 */
17250    ldrb   r3, [rSELF, #offThread_breakFlags]
17251    adrl   lr, dvmAsmInstructionStart + (101 * 64)
17252    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17253    cmp    r3, #0
17254    bxeq   lr                   @ nothing to do - jump to real handler
17255    EXPORT_PC()
17256    mov    r0, rPC              @ arg0
17257    mov    r1, rFP              @ arg1
17258    mov    r2, rSELF            @ arg2
17259    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17260
17261/* ------------------------------ */
17262    .balign 64
17263.L_ALT_OP_SGET_SHORT: /* 0x66 */
17264/* File: armv5te/alt_stub.S */
17265/*
17266 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17267 * any interesting requests and then jump to the real instruction
17268 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17269 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17270 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17271 * bail to the real handler if breakFlags==0.
17272 */
17273    ldrb   r3, [rSELF, #offThread_breakFlags]
17274    adrl   lr, dvmAsmInstructionStart + (102 * 64)
17275    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17276    cmp    r3, #0
17277    bxeq   lr                   @ nothing to do - jump to real handler
17278    EXPORT_PC()
17279    mov    r0, rPC              @ arg0
17280    mov    r1, rFP              @ arg1
17281    mov    r2, rSELF            @ arg2
17282    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17283
17284/* ------------------------------ */
17285    .balign 64
17286.L_ALT_OP_SPUT: /* 0x67 */
17287/* File: armv5te/alt_stub.S */
17288/*
17289 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17290 * any interesting requests and then jump to the real instruction
17291 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17292 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17293 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17294 * bail to the real handler if breakFlags==0.
17295 */
17296    ldrb   r3, [rSELF, #offThread_breakFlags]
17297    adrl   lr, dvmAsmInstructionStart + (103 * 64)
17298    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17299    cmp    r3, #0
17300    bxeq   lr                   @ nothing to do - jump to real handler
17301    EXPORT_PC()
17302    mov    r0, rPC              @ arg0
17303    mov    r1, rFP              @ arg1
17304    mov    r2, rSELF            @ arg2
17305    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17306
17307/* ------------------------------ */
17308    .balign 64
17309.L_ALT_OP_SPUT_WIDE: /* 0x68 */
17310/* File: armv5te/alt_stub.S */
17311/*
17312 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17313 * any interesting requests and then jump to the real instruction
17314 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17315 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17316 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17317 * bail to the real handler if breakFlags==0.
17318 */
17319    ldrb   r3, [rSELF, #offThread_breakFlags]
17320    adrl   lr, dvmAsmInstructionStart + (104 * 64)
17321    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17322    cmp    r3, #0
17323    bxeq   lr                   @ nothing to do - jump to real handler
17324    EXPORT_PC()
17325    mov    r0, rPC              @ arg0
17326    mov    r1, rFP              @ arg1
17327    mov    r2, rSELF            @ arg2
17328    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17329
17330/* ------------------------------ */
17331    .balign 64
17332.L_ALT_OP_SPUT_OBJECT: /* 0x69 */
17333/* File: armv5te/alt_stub.S */
17334/*
17335 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17336 * any interesting requests and then jump to the real instruction
17337 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17338 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17339 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17340 * bail to the real handler if breakFlags==0.
17341 */
17342    ldrb   r3, [rSELF, #offThread_breakFlags]
17343    adrl   lr, dvmAsmInstructionStart + (105 * 64)
17344    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17345    cmp    r3, #0
17346    bxeq   lr                   @ nothing to do - jump to real handler
17347    EXPORT_PC()
17348    mov    r0, rPC              @ arg0
17349    mov    r1, rFP              @ arg1
17350    mov    r2, rSELF            @ arg2
17351    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17352
17353/* ------------------------------ */
17354    .balign 64
17355.L_ALT_OP_SPUT_BOOLEAN: /* 0x6a */
17356/* File: armv5te/alt_stub.S */
17357/*
17358 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17359 * any interesting requests and then jump to the real instruction
17360 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17361 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17362 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17363 * bail to the real handler if breakFlags==0.
17364 */
17365    ldrb   r3, [rSELF, #offThread_breakFlags]
17366    adrl   lr, dvmAsmInstructionStart + (106 * 64)
17367    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17368    cmp    r3, #0
17369    bxeq   lr                   @ nothing to do - jump to real handler
17370    EXPORT_PC()
17371    mov    r0, rPC              @ arg0
17372    mov    r1, rFP              @ arg1
17373    mov    r2, rSELF            @ arg2
17374    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17375
17376/* ------------------------------ */
17377    .balign 64
17378.L_ALT_OP_SPUT_BYTE: /* 0x6b */
17379/* File: armv5te/alt_stub.S */
17380/*
17381 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17382 * any interesting requests and then jump to the real instruction
17383 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17384 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17385 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17386 * bail to the real handler if breakFlags==0.
17387 */
17388    ldrb   r3, [rSELF, #offThread_breakFlags]
17389    adrl   lr, dvmAsmInstructionStart + (107 * 64)
17390    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17391    cmp    r3, #0
17392    bxeq   lr                   @ nothing to do - jump to real handler
17393    EXPORT_PC()
17394    mov    r0, rPC              @ arg0
17395    mov    r1, rFP              @ arg1
17396    mov    r2, rSELF            @ arg2
17397    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17398
17399/* ------------------------------ */
17400    .balign 64
17401.L_ALT_OP_SPUT_CHAR: /* 0x6c */
17402/* File: armv5te/alt_stub.S */
17403/*
17404 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17405 * any interesting requests and then jump to the real instruction
17406 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17407 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17408 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17409 * bail to the real handler if breakFlags==0.
17410 */
17411    ldrb   r3, [rSELF, #offThread_breakFlags]
17412    adrl   lr, dvmAsmInstructionStart + (108 * 64)
17413    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17414    cmp    r3, #0
17415    bxeq   lr                   @ nothing to do - jump to real handler
17416    EXPORT_PC()
17417    mov    r0, rPC              @ arg0
17418    mov    r1, rFP              @ arg1
17419    mov    r2, rSELF            @ arg2
17420    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17421
17422/* ------------------------------ */
17423    .balign 64
17424.L_ALT_OP_SPUT_SHORT: /* 0x6d */
17425/* File: armv5te/alt_stub.S */
17426/*
17427 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17428 * any interesting requests and then jump to the real instruction
17429 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17430 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17431 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17432 * bail to the real handler if breakFlags==0.
17433 */
17434    ldrb   r3, [rSELF, #offThread_breakFlags]
17435    adrl   lr, dvmAsmInstructionStart + (109 * 64)
17436    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17437    cmp    r3, #0
17438    bxeq   lr                   @ nothing to do - jump to real handler
17439    EXPORT_PC()
17440    mov    r0, rPC              @ arg0
17441    mov    r1, rFP              @ arg1
17442    mov    r2, rSELF            @ arg2
17443    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17444
17445/* ------------------------------ */
17446    .balign 64
17447.L_ALT_OP_INVOKE_VIRTUAL: /* 0x6e */
17448/* File: armv5te/alt_stub.S */
17449/*
17450 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17451 * any interesting requests and then jump to the real instruction
17452 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17453 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17454 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17455 * bail to the real handler if breakFlags==0.
17456 */
17457    ldrb   r3, [rSELF, #offThread_breakFlags]
17458    adrl   lr, dvmAsmInstructionStart + (110 * 64)
17459    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17460    cmp    r3, #0
17461    bxeq   lr                   @ nothing to do - jump to real handler
17462    EXPORT_PC()
17463    mov    r0, rPC              @ arg0
17464    mov    r1, rFP              @ arg1
17465    mov    r2, rSELF            @ arg2
17466    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17467
17468/* ------------------------------ */
17469    .balign 64
17470.L_ALT_OP_INVOKE_SUPER: /* 0x6f */
17471/* File: armv5te/alt_stub.S */
17472/*
17473 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17474 * any interesting requests and then jump to the real instruction
17475 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17476 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17477 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17478 * bail to the real handler if breakFlags==0.
17479 */
17480    ldrb   r3, [rSELF, #offThread_breakFlags]
17481    adrl   lr, dvmAsmInstructionStart + (111 * 64)
17482    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17483    cmp    r3, #0
17484    bxeq   lr                   @ nothing to do - jump to real handler
17485    EXPORT_PC()
17486    mov    r0, rPC              @ arg0
17487    mov    r1, rFP              @ arg1
17488    mov    r2, rSELF            @ arg2
17489    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17490
17491/* ------------------------------ */
17492    .balign 64
17493.L_ALT_OP_INVOKE_DIRECT: /* 0x70 */
17494/* File: armv5te/alt_stub.S */
17495/*
17496 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17497 * any interesting requests and then jump to the real instruction
17498 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17499 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17500 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17501 * bail to the real handler if breakFlags==0.
17502 */
17503    ldrb   r3, [rSELF, #offThread_breakFlags]
17504    adrl   lr, dvmAsmInstructionStart + (112 * 64)
17505    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17506    cmp    r3, #0
17507    bxeq   lr                   @ nothing to do - jump to real handler
17508    EXPORT_PC()
17509    mov    r0, rPC              @ arg0
17510    mov    r1, rFP              @ arg1
17511    mov    r2, rSELF            @ arg2
17512    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17513
17514/* ------------------------------ */
17515    .balign 64
17516.L_ALT_OP_INVOKE_STATIC: /* 0x71 */
17517/* File: armv5te/alt_stub.S */
17518/*
17519 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17520 * any interesting requests and then jump to the real instruction
17521 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17522 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17523 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17524 * bail to the real handler if breakFlags==0.
17525 */
17526    ldrb   r3, [rSELF, #offThread_breakFlags]
17527    adrl   lr, dvmAsmInstructionStart + (113 * 64)
17528    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17529    cmp    r3, #0
17530    bxeq   lr                   @ nothing to do - jump to real handler
17531    EXPORT_PC()
17532    mov    r0, rPC              @ arg0
17533    mov    r1, rFP              @ arg1
17534    mov    r2, rSELF            @ arg2
17535    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17536
17537/* ------------------------------ */
17538    .balign 64
17539.L_ALT_OP_INVOKE_INTERFACE: /* 0x72 */
17540/* File: armv5te/alt_stub.S */
17541/*
17542 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17543 * any interesting requests and then jump to the real instruction
17544 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17545 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17546 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17547 * bail to the real handler if breakFlags==0.
17548 */
17549    ldrb   r3, [rSELF, #offThread_breakFlags]
17550    adrl   lr, dvmAsmInstructionStart + (114 * 64)
17551    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17552    cmp    r3, #0
17553    bxeq   lr                   @ nothing to do - jump to real handler
17554    EXPORT_PC()
17555    mov    r0, rPC              @ arg0
17556    mov    r1, rFP              @ arg1
17557    mov    r2, rSELF            @ arg2
17558    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17559
17560/* ------------------------------ */
17561    .balign 64
17562.L_ALT_OP_UNUSED_73: /* 0x73 */
17563/* File: armv5te/alt_stub.S */
17564/*
17565 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17566 * any interesting requests and then jump to the real instruction
17567 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17568 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17569 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17570 * bail to the real handler if breakFlags==0.
17571 */
17572    ldrb   r3, [rSELF, #offThread_breakFlags]
17573    adrl   lr, dvmAsmInstructionStart + (115 * 64)
17574    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17575    cmp    r3, #0
17576    bxeq   lr                   @ nothing to do - jump to real handler
17577    EXPORT_PC()
17578    mov    r0, rPC              @ arg0
17579    mov    r1, rFP              @ arg1
17580    mov    r2, rSELF            @ arg2
17581    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17582
17583/* ------------------------------ */
17584    .balign 64
17585.L_ALT_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
17586/* File: armv5te/alt_stub.S */
17587/*
17588 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17589 * any interesting requests and then jump to the real instruction
17590 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17591 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17592 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17593 * bail to the real handler if breakFlags==0.
17594 */
17595    ldrb   r3, [rSELF, #offThread_breakFlags]
17596    adrl   lr, dvmAsmInstructionStart + (116 * 64)
17597    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17598    cmp    r3, #0
17599    bxeq   lr                   @ nothing to do - jump to real handler
17600    EXPORT_PC()
17601    mov    r0, rPC              @ arg0
17602    mov    r1, rFP              @ arg1
17603    mov    r2, rSELF            @ arg2
17604    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17605
17606/* ------------------------------ */
17607    .balign 64
17608.L_ALT_OP_INVOKE_SUPER_RANGE: /* 0x75 */
17609/* File: armv5te/alt_stub.S */
17610/*
17611 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17612 * any interesting requests and then jump to the real instruction
17613 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17614 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17615 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17616 * bail to the real handler if breakFlags==0.
17617 */
17618    ldrb   r3, [rSELF, #offThread_breakFlags]
17619    adrl   lr, dvmAsmInstructionStart + (117 * 64)
17620    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17621    cmp    r3, #0
17622    bxeq   lr                   @ nothing to do - jump to real handler
17623    EXPORT_PC()
17624    mov    r0, rPC              @ arg0
17625    mov    r1, rFP              @ arg1
17626    mov    r2, rSELF            @ arg2
17627    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17628
17629/* ------------------------------ */
17630    .balign 64
17631.L_ALT_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
17632/* File: armv5te/alt_stub.S */
17633/*
17634 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17635 * any interesting requests and then jump to the real instruction
17636 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17637 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17638 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17639 * bail to the real handler if breakFlags==0.
17640 */
17641    ldrb   r3, [rSELF, #offThread_breakFlags]
17642    adrl   lr, dvmAsmInstructionStart + (118 * 64)
17643    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17644    cmp    r3, #0
17645    bxeq   lr                   @ nothing to do - jump to real handler
17646    EXPORT_PC()
17647    mov    r0, rPC              @ arg0
17648    mov    r1, rFP              @ arg1
17649    mov    r2, rSELF            @ arg2
17650    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17651
17652/* ------------------------------ */
17653    .balign 64
17654.L_ALT_OP_INVOKE_STATIC_RANGE: /* 0x77 */
17655/* File: armv5te/alt_stub.S */
17656/*
17657 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17658 * any interesting requests and then jump to the real instruction
17659 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17660 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17661 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17662 * bail to the real handler if breakFlags==0.
17663 */
17664    ldrb   r3, [rSELF, #offThread_breakFlags]
17665    adrl   lr, dvmAsmInstructionStart + (119 * 64)
17666    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17667    cmp    r3, #0
17668    bxeq   lr                   @ nothing to do - jump to real handler
17669    EXPORT_PC()
17670    mov    r0, rPC              @ arg0
17671    mov    r1, rFP              @ arg1
17672    mov    r2, rSELF            @ arg2
17673    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17674
17675/* ------------------------------ */
17676    .balign 64
17677.L_ALT_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
17678/* File: armv5te/alt_stub.S */
17679/*
17680 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17681 * any interesting requests and then jump to the real instruction
17682 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17683 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17684 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17685 * bail to the real handler if breakFlags==0.
17686 */
17687    ldrb   r3, [rSELF, #offThread_breakFlags]
17688    adrl   lr, dvmAsmInstructionStart + (120 * 64)
17689    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17690    cmp    r3, #0
17691    bxeq   lr                   @ nothing to do - jump to real handler
17692    EXPORT_PC()
17693    mov    r0, rPC              @ arg0
17694    mov    r1, rFP              @ arg1
17695    mov    r2, rSELF            @ arg2
17696    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17697
17698/* ------------------------------ */
17699    .balign 64
17700.L_ALT_OP_UNUSED_79: /* 0x79 */
17701/* File: armv5te/alt_stub.S */
17702/*
17703 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17704 * any interesting requests and then jump to the real instruction
17705 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17706 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17707 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17708 * bail to the real handler if breakFlags==0.
17709 */
17710    ldrb   r3, [rSELF, #offThread_breakFlags]
17711    adrl   lr, dvmAsmInstructionStart + (121 * 64)
17712    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17713    cmp    r3, #0
17714    bxeq   lr                   @ nothing to do - jump to real handler
17715    EXPORT_PC()
17716    mov    r0, rPC              @ arg0
17717    mov    r1, rFP              @ arg1
17718    mov    r2, rSELF            @ arg2
17719    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17720
17721/* ------------------------------ */
17722    .balign 64
17723.L_ALT_OP_UNUSED_7A: /* 0x7a */
17724/* File: armv5te/alt_stub.S */
17725/*
17726 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17727 * any interesting requests and then jump to the real instruction
17728 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17729 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17730 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17731 * bail to the real handler if breakFlags==0.
17732 */
17733    ldrb   r3, [rSELF, #offThread_breakFlags]
17734    adrl   lr, dvmAsmInstructionStart + (122 * 64)
17735    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17736    cmp    r3, #0
17737    bxeq   lr                   @ nothing to do - jump to real handler
17738    EXPORT_PC()
17739    mov    r0, rPC              @ arg0
17740    mov    r1, rFP              @ arg1
17741    mov    r2, rSELF            @ arg2
17742    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17743
17744/* ------------------------------ */
17745    .balign 64
17746.L_ALT_OP_NEG_INT: /* 0x7b */
17747/* File: armv5te/alt_stub.S */
17748/*
17749 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17750 * any interesting requests and then jump to the real instruction
17751 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17752 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17753 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17754 * bail to the real handler if breakFlags==0.
17755 */
17756    ldrb   r3, [rSELF, #offThread_breakFlags]
17757    adrl   lr, dvmAsmInstructionStart + (123 * 64)
17758    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17759    cmp    r3, #0
17760    bxeq   lr                   @ nothing to do - jump to real handler
17761    EXPORT_PC()
17762    mov    r0, rPC              @ arg0
17763    mov    r1, rFP              @ arg1
17764    mov    r2, rSELF            @ arg2
17765    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17766
17767/* ------------------------------ */
17768    .balign 64
17769.L_ALT_OP_NOT_INT: /* 0x7c */
17770/* File: armv5te/alt_stub.S */
17771/*
17772 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17773 * any interesting requests and then jump to the real instruction
17774 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17775 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17776 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17777 * bail to the real handler if breakFlags==0.
17778 */
17779    ldrb   r3, [rSELF, #offThread_breakFlags]
17780    adrl   lr, dvmAsmInstructionStart + (124 * 64)
17781    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17782    cmp    r3, #0
17783    bxeq   lr                   @ nothing to do - jump to real handler
17784    EXPORT_PC()
17785    mov    r0, rPC              @ arg0
17786    mov    r1, rFP              @ arg1
17787    mov    r2, rSELF            @ arg2
17788    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17789
17790/* ------------------------------ */
17791    .balign 64
17792.L_ALT_OP_NEG_LONG: /* 0x7d */
17793/* File: armv5te/alt_stub.S */
17794/*
17795 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17796 * any interesting requests and then jump to the real instruction
17797 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17798 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17799 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17800 * bail to the real handler if breakFlags==0.
17801 */
17802    ldrb   r3, [rSELF, #offThread_breakFlags]
17803    adrl   lr, dvmAsmInstructionStart + (125 * 64)
17804    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17805    cmp    r3, #0
17806    bxeq   lr                   @ nothing to do - jump to real handler
17807    EXPORT_PC()
17808    mov    r0, rPC              @ arg0
17809    mov    r1, rFP              @ arg1
17810    mov    r2, rSELF            @ arg2
17811    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17812
17813/* ------------------------------ */
17814    .balign 64
17815.L_ALT_OP_NOT_LONG: /* 0x7e */
17816/* File: armv5te/alt_stub.S */
17817/*
17818 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17819 * any interesting requests and then jump to the real instruction
17820 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17821 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17822 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17823 * bail to the real handler if breakFlags==0.
17824 */
17825    ldrb   r3, [rSELF, #offThread_breakFlags]
17826    adrl   lr, dvmAsmInstructionStart + (126 * 64)
17827    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17828    cmp    r3, #0
17829    bxeq   lr                   @ nothing to do - jump to real handler
17830    EXPORT_PC()
17831    mov    r0, rPC              @ arg0
17832    mov    r1, rFP              @ arg1
17833    mov    r2, rSELF            @ arg2
17834    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17835
17836/* ------------------------------ */
17837    .balign 64
17838.L_ALT_OP_NEG_FLOAT: /* 0x7f */
17839/* File: armv5te/alt_stub.S */
17840/*
17841 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17842 * any interesting requests and then jump to the real instruction
17843 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17844 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17845 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17846 * bail to the real handler if breakFlags==0.
17847 */
17848    ldrb   r3, [rSELF, #offThread_breakFlags]
17849    adrl   lr, dvmAsmInstructionStart + (127 * 64)
17850    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17851    cmp    r3, #0
17852    bxeq   lr                   @ nothing to do - jump to real handler
17853    EXPORT_PC()
17854    mov    r0, rPC              @ arg0
17855    mov    r1, rFP              @ arg1
17856    mov    r2, rSELF            @ arg2
17857    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17858
17859/* ------------------------------ */
17860    .balign 64
17861.L_ALT_OP_NEG_DOUBLE: /* 0x80 */
17862/* File: armv5te/alt_stub.S */
17863/*
17864 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17865 * any interesting requests and then jump to the real instruction
17866 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17867 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17868 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17869 * bail to the real handler if breakFlags==0.
17870 */
17871    ldrb   r3, [rSELF, #offThread_breakFlags]
17872    adrl   lr, dvmAsmInstructionStart + (128 * 64)
17873    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17874    cmp    r3, #0
17875    bxeq   lr                   @ nothing to do - jump to real handler
17876    EXPORT_PC()
17877    mov    r0, rPC              @ arg0
17878    mov    r1, rFP              @ arg1
17879    mov    r2, rSELF            @ arg2
17880    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17881
17882/* ------------------------------ */
17883    .balign 64
17884.L_ALT_OP_INT_TO_LONG: /* 0x81 */
17885/* File: armv5te/alt_stub.S */
17886/*
17887 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17888 * any interesting requests and then jump to the real instruction
17889 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17890 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17891 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17892 * bail to the real handler if breakFlags==0.
17893 */
17894    ldrb   r3, [rSELF, #offThread_breakFlags]
17895    adrl   lr, dvmAsmInstructionStart + (129 * 64)
17896    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17897    cmp    r3, #0
17898    bxeq   lr                   @ nothing to do - jump to real handler
17899    EXPORT_PC()
17900    mov    r0, rPC              @ arg0
17901    mov    r1, rFP              @ arg1
17902    mov    r2, rSELF            @ arg2
17903    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17904
17905/* ------------------------------ */
17906    .balign 64
17907.L_ALT_OP_INT_TO_FLOAT: /* 0x82 */
17908/* File: armv5te/alt_stub.S */
17909/*
17910 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17911 * any interesting requests and then jump to the real instruction
17912 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17913 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17914 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17915 * bail to the real handler if breakFlags==0.
17916 */
17917    ldrb   r3, [rSELF, #offThread_breakFlags]
17918    adrl   lr, dvmAsmInstructionStart + (130 * 64)
17919    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17920    cmp    r3, #0
17921    bxeq   lr                   @ nothing to do - jump to real handler
17922    EXPORT_PC()
17923    mov    r0, rPC              @ arg0
17924    mov    r1, rFP              @ arg1
17925    mov    r2, rSELF            @ arg2
17926    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17927
17928/* ------------------------------ */
17929    .balign 64
17930.L_ALT_OP_INT_TO_DOUBLE: /* 0x83 */
17931/* File: armv5te/alt_stub.S */
17932/*
17933 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17934 * any interesting requests and then jump to the real instruction
17935 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17936 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17937 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17938 * bail to the real handler if breakFlags==0.
17939 */
17940    ldrb   r3, [rSELF, #offThread_breakFlags]
17941    adrl   lr, dvmAsmInstructionStart + (131 * 64)
17942    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17943    cmp    r3, #0
17944    bxeq   lr                   @ nothing to do - jump to real handler
17945    EXPORT_PC()
17946    mov    r0, rPC              @ arg0
17947    mov    r1, rFP              @ arg1
17948    mov    r2, rSELF            @ arg2
17949    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17950
17951/* ------------------------------ */
17952    .balign 64
17953.L_ALT_OP_LONG_TO_INT: /* 0x84 */
17954/* File: armv5te/alt_stub.S */
17955/*
17956 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17957 * any interesting requests and then jump to the real instruction
17958 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17959 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17960 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17961 * bail to the real handler if breakFlags==0.
17962 */
17963    ldrb   r3, [rSELF, #offThread_breakFlags]
17964    adrl   lr, dvmAsmInstructionStart + (132 * 64)
17965    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17966    cmp    r3, #0
17967    bxeq   lr                   @ nothing to do - jump to real handler
17968    EXPORT_PC()
17969    mov    r0, rPC              @ arg0
17970    mov    r1, rFP              @ arg1
17971    mov    r2, rSELF            @ arg2
17972    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17973
17974/* ------------------------------ */
17975    .balign 64
17976.L_ALT_OP_LONG_TO_FLOAT: /* 0x85 */
17977/* File: armv5te/alt_stub.S */
17978/*
17979 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17980 * any interesting requests and then jump to the real instruction
17981 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17982 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17983 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17984 * bail to the real handler if breakFlags==0.
17985 */
17986    ldrb   r3, [rSELF, #offThread_breakFlags]
17987    adrl   lr, dvmAsmInstructionStart + (133 * 64)
17988    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17989    cmp    r3, #0
17990    bxeq   lr                   @ nothing to do - jump to real handler
17991    EXPORT_PC()
17992    mov    r0, rPC              @ arg0
17993    mov    r1, rFP              @ arg1
17994    mov    r2, rSELF            @ arg2
17995    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17996
17997/* ------------------------------ */
17998    .balign 64
17999.L_ALT_OP_LONG_TO_DOUBLE: /* 0x86 */
18000/* File: armv5te/alt_stub.S */
18001/*
18002 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18003 * any interesting requests and then jump to the real instruction
18004 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18005 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18006 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18007 * bail to the real handler if breakFlags==0.
18008 */
18009    ldrb   r3, [rSELF, #offThread_breakFlags]
18010    adrl   lr, dvmAsmInstructionStart + (134 * 64)
18011    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18012    cmp    r3, #0
18013    bxeq   lr                   @ nothing to do - jump to real handler
18014    EXPORT_PC()
18015    mov    r0, rPC              @ arg0
18016    mov    r1, rFP              @ arg1
18017    mov    r2, rSELF            @ arg2
18018    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18019
18020/* ------------------------------ */
18021    .balign 64
18022.L_ALT_OP_FLOAT_TO_INT: /* 0x87 */
18023/* File: armv5te/alt_stub.S */
18024/*
18025 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18026 * any interesting requests and then jump to the real instruction
18027 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18028 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18029 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18030 * bail to the real handler if breakFlags==0.
18031 */
18032    ldrb   r3, [rSELF, #offThread_breakFlags]
18033    adrl   lr, dvmAsmInstructionStart + (135 * 64)
18034    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18035    cmp    r3, #0
18036    bxeq   lr                   @ nothing to do - jump to real handler
18037    EXPORT_PC()
18038    mov    r0, rPC              @ arg0
18039    mov    r1, rFP              @ arg1
18040    mov    r2, rSELF            @ arg2
18041    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18042
18043/* ------------------------------ */
18044    .balign 64
18045.L_ALT_OP_FLOAT_TO_LONG: /* 0x88 */
18046/* File: armv5te/alt_stub.S */
18047/*
18048 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18049 * any interesting requests and then jump to the real instruction
18050 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18051 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18052 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18053 * bail to the real handler if breakFlags==0.
18054 */
18055    ldrb   r3, [rSELF, #offThread_breakFlags]
18056    adrl   lr, dvmAsmInstructionStart + (136 * 64)
18057    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18058    cmp    r3, #0
18059    bxeq   lr                   @ nothing to do - jump to real handler
18060    EXPORT_PC()
18061    mov    r0, rPC              @ arg0
18062    mov    r1, rFP              @ arg1
18063    mov    r2, rSELF            @ arg2
18064    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18065
18066/* ------------------------------ */
18067    .balign 64
18068.L_ALT_OP_FLOAT_TO_DOUBLE: /* 0x89 */
18069/* File: armv5te/alt_stub.S */
18070/*
18071 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18072 * any interesting requests and then jump to the real instruction
18073 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18074 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18075 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18076 * bail to the real handler if breakFlags==0.
18077 */
18078    ldrb   r3, [rSELF, #offThread_breakFlags]
18079    adrl   lr, dvmAsmInstructionStart + (137 * 64)
18080    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18081    cmp    r3, #0
18082    bxeq   lr                   @ nothing to do - jump to real handler
18083    EXPORT_PC()
18084    mov    r0, rPC              @ arg0
18085    mov    r1, rFP              @ arg1
18086    mov    r2, rSELF            @ arg2
18087    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18088
18089/* ------------------------------ */
18090    .balign 64
18091.L_ALT_OP_DOUBLE_TO_INT: /* 0x8a */
18092/* File: armv5te/alt_stub.S */
18093/*
18094 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18095 * any interesting requests and then jump to the real instruction
18096 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18097 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18098 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18099 * bail to the real handler if breakFlags==0.
18100 */
18101    ldrb   r3, [rSELF, #offThread_breakFlags]
18102    adrl   lr, dvmAsmInstructionStart + (138 * 64)
18103    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18104    cmp    r3, #0
18105    bxeq   lr                   @ nothing to do - jump to real handler
18106    EXPORT_PC()
18107    mov    r0, rPC              @ arg0
18108    mov    r1, rFP              @ arg1
18109    mov    r2, rSELF            @ arg2
18110    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18111
18112/* ------------------------------ */
18113    .balign 64
18114.L_ALT_OP_DOUBLE_TO_LONG: /* 0x8b */
18115/* File: armv5te/alt_stub.S */
18116/*
18117 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18118 * any interesting requests and then jump to the real instruction
18119 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18120 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18121 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18122 * bail to the real handler if breakFlags==0.
18123 */
18124    ldrb   r3, [rSELF, #offThread_breakFlags]
18125    adrl   lr, dvmAsmInstructionStart + (139 * 64)
18126    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18127    cmp    r3, #0
18128    bxeq   lr                   @ nothing to do - jump to real handler
18129    EXPORT_PC()
18130    mov    r0, rPC              @ arg0
18131    mov    r1, rFP              @ arg1
18132    mov    r2, rSELF            @ arg2
18133    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18134
18135/* ------------------------------ */
18136    .balign 64
18137.L_ALT_OP_DOUBLE_TO_FLOAT: /* 0x8c */
18138/* File: armv5te/alt_stub.S */
18139/*
18140 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18141 * any interesting requests and then jump to the real instruction
18142 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18143 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18144 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18145 * bail to the real handler if breakFlags==0.
18146 */
18147    ldrb   r3, [rSELF, #offThread_breakFlags]
18148    adrl   lr, dvmAsmInstructionStart + (140 * 64)
18149    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18150    cmp    r3, #0
18151    bxeq   lr                   @ nothing to do - jump to real handler
18152    EXPORT_PC()
18153    mov    r0, rPC              @ arg0
18154    mov    r1, rFP              @ arg1
18155    mov    r2, rSELF            @ arg2
18156    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18157
18158/* ------------------------------ */
18159    .balign 64
18160.L_ALT_OP_INT_TO_BYTE: /* 0x8d */
18161/* File: armv5te/alt_stub.S */
18162/*
18163 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18164 * any interesting requests and then jump to the real instruction
18165 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18166 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18167 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18168 * bail to the real handler if breakFlags==0.
18169 */
18170    ldrb   r3, [rSELF, #offThread_breakFlags]
18171    adrl   lr, dvmAsmInstructionStart + (141 * 64)
18172    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18173    cmp    r3, #0
18174    bxeq   lr                   @ nothing to do - jump to real handler
18175    EXPORT_PC()
18176    mov    r0, rPC              @ arg0
18177    mov    r1, rFP              @ arg1
18178    mov    r2, rSELF            @ arg2
18179    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18180
18181/* ------------------------------ */
18182    .balign 64
18183.L_ALT_OP_INT_TO_CHAR: /* 0x8e */
18184/* File: armv5te/alt_stub.S */
18185/*
18186 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18187 * any interesting requests and then jump to the real instruction
18188 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18189 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18190 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18191 * bail to the real handler if breakFlags==0.
18192 */
18193    ldrb   r3, [rSELF, #offThread_breakFlags]
18194    adrl   lr, dvmAsmInstructionStart + (142 * 64)
18195    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18196    cmp    r3, #0
18197    bxeq   lr                   @ nothing to do - jump to real handler
18198    EXPORT_PC()
18199    mov    r0, rPC              @ arg0
18200    mov    r1, rFP              @ arg1
18201    mov    r2, rSELF            @ arg2
18202    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18203
18204/* ------------------------------ */
18205    .balign 64
18206.L_ALT_OP_INT_TO_SHORT: /* 0x8f */
18207/* File: armv5te/alt_stub.S */
18208/*
18209 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18210 * any interesting requests and then jump to the real instruction
18211 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18212 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18213 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18214 * bail to the real handler if breakFlags==0.
18215 */
18216    ldrb   r3, [rSELF, #offThread_breakFlags]
18217    adrl   lr, dvmAsmInstructionStart + (143 * 64)
18218    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18219    cmp    r3, #0
18220    bxeq   lr                   @ nothing to do - jump to real handler
18221    EXPORT_PC()
18222    mov    r0, rPC              @ arg0
18223    mov    r1, rFP              @ arg1
18224    mov    r2, rSELF            @ arg2
18225    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18226
18227/* ------------------------------ */
18228    .balign 64
18229.L_ALT_OP_ADD_INT: /* 0x90 */
18230/* File: armv5te/alt_stub.S */
18231/*
18232 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18233 * any interesting requests and then jump to the real instruction
18234 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18235 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18236 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18237 * bail to the real handler if breakFlags==0.
18238 */
18239    ldrb   r3, [rSELF, #offThread_breakFlags]
18240    adrl   lr, dvmAsmInstructionStart + (144 * 64)
18241    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18242    cmp    r3, #0
18243    bxeq   lr                   @ nothing to do - jump to real handler
18244    EXPORT_PC()
18245    mov    r0, rPC              @ arg0
18246    mov    r1, rFP              @ arg1
18247    mov    r2, rSELF            @ arg2
18248    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18249
18250/* ------------------------------ */
18251    .balign 64
18252.L_ALT_OP_SUB_INT: /* 0x91 */
18253/* File: armv5te/alt_stub.S */
18254/*
18255 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18256 * any interesting requests and then jump to the real instruction
18257 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18258 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18259 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18260 * bail to the real handler if breakFlags==0.
18261 */
18262    ldrb   r3, [rSELF, #offThread_breakFlags]
18263    adrl   lr, dvmAsmInstructionStart + (145 * 64)
18264    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18265    cmp    r3, #0
18266    bxeq   lr                   @ nothing to do - jump to real handler
18267    EXPORT_PC()
18268    mov    r0, rPC              @ arg0
18269    mov    r1, rFP              @ arg1
18270    mov    r2, rSELF            @ arg2
18271    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18272
18273/* ------------------------------ */
18274    .balign 64
18275.L_ALT_OP_MUL_INT: /* 0x92 */
18276/* File: armv5te/alt_stub.S */
18277/*
18278 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18279 * any interesting requests and then jump to the real instruction
18280 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18281 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18282 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18283 * bail to the real handler if breakFlags==0.
18284 */
18285    ldrb   r3, [rSELF, #offThread_breakFlags]
18286    adrl   lr, dvmAsmInstructionStart + (146 * 64)
18287    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18288    cmp    r3, #0
18289    bxeq   lr                   @ nothing to do - jump to real handler
18290    EXPORT_PC()
18291    mov    r0, rPC              @ arg0
18292    mov    r1, rFP              @ arg1
18293    mov    r2, rSELF            @ arg2
18294    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18295
18296/* ------------------------------ */
18297    .balign 64
18298.L_ALT_OP_DIV_INT: /* 0x93 */
18299/* File: armv5te/alt_stub.S */
18300/*
18301 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18302 * any interesting requests and then jump to the real instruction
18303 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18304 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18305 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18306 * bail to the real handler if breakFlags==0.
18307 */
18308    ldrb   r3, [rSELF, #offThread_breakFlags]
18309    adrl   lr, dvmAsmInstructionStart + (147 * 64)
18310    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18311    cmp    r3, #0
18312    bxeq   lr                   @ nothing to do - jump to real handler
18313    EXPORT_PC()
18314    mov    r0, rPC              @ arg0
18315    mov    r1, rFP              @ arg1
18316    mov    r2, rSELF            @ arg2
18317    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18318
18319/* ------------------------------ */
18320    .balign 64
18321.L_ALT_OP_REM_INT: /* 0x94 */
18322/* File: armv5te/alt_stub.S */
18323/*
18324 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18325 * any interesting requests and then jump to the real instruction
18326 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18327 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18328 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18329 * bail to the real handler if breakFlags==0.
18330 */
18331    ldrb   r3, [rSELF, #offThread_breakFlags]
18332    adrl   lr, dvmAsmInstructionStart + (148 * 64)
18333    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18334    cmp    r3, #0
18335    bxeq   lr                   @ nothing to do - jump to real handler
18336    EXPORT_PC()
18337    mov    r0, rPC              @ arg0
18338    mov    r1, rFP              @ arg1
18339    mov    r2, rSELF            @ arg2
18340    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18341
18342/* ------------------------------ */
18343    .balign 64
18344.L_ALT_OP_AND_INT: /* 0x95 */
18345/* File: armv5te/alt_stub.S */
18346/*
18347 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18348 * any interesting requests and then jump to the real instruction
18349 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18350 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18351 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18352 * bail to the real handler if breakFlags==0.
18353 */
18354    ldrb   r3, [rSELF, #offThread_breakFlags]
18355    adrl   lr, dvmAsmInstructionStart + (149 * 64)
18356    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18357    cmp    r3, #0
18358    bxeq   lr                   @ nothing to do - jump to real handler
18359    EXPORT_PC()
18360    mov    r0, rPC              @ arg0
18361    mov    r1, rFP              @ arg1
18362    mov    r2, rSELF            @ arg2
18363    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18364
18365/* ------------------------------ */
18366    .balign 64
18367.L_ALT_OP_OR_INT: /* 0x96 */
18368/* File: armv5te/alt_stub.S */
18369/*
18370 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18371 * any interesting requests and then jump to the real instruction
18372 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18373 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18374 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18375 * bail to the real handler if breakFlags==0.
18376 */
18377    ldrb   r3, [rSELF, #offThread_breakFlags]
18378    adrl   lr, dvmAsmInstructionStart + (150 * 64)
18379    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18380    cmp    r3, #0
18381    bxeq   lr                   @ nothing to do - jump to real handler
18382    EXPORT_PC()
18383    mov    r0, rPC              @ arg0
18384    mov    r1, rFP              @ arg1
18385    mov    r2, rSELF            @ arg2
18386    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18387
18388/* ------------------------------ */
18389    .balign 64
18390.L_ALT_OP_XOR_INT: /* 0x97 */
18391/* File: armv5te/alt_stub.S */
18392/*
18393 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18394 * any interesting requests and then jump to the real instruction
18395 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18396 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18397 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18398 * bail to the real handler if breakFlags==0.
18399 */
18400    ldrb   r3, [rSELF, #offThread_breakFlags]
18401    adrl   lr, dvmAsmInstructionStart + (151 * 64)
18402    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18403    cmp    r3, #0
18404    bxeq   lr                   @ nothing to do - jump to real handler
18405    EXPORT_PC()
18406    mov    r0, rPC              @ arg0
18407    mov    r1, rFP              @ arg1
18408    mov    r2, rSELF            @ arg2
18409    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18410
18411/* ------------------------------ */
18412    .balign 64
18413.L_ALT_OP_SHL_INT: /* 0x98 */
18414/* File: armv5te/alt_stub.S */
18415/*
18416 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18417 * any interesting requests and then jump to the real instruction
18418 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18419 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18420 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18421 * bail to the real handler if breakFlags==0.
18422 */
18423    ldrb   r3, [rSELF, #offThread_breakFlags]
18424    adrl   lr, dvmAsmInstructionStart + (152 * 64)
18425    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18426    cmp    r3, #0
18427    bxeq   lr                   @ nothing to do - jump to real handler
18428    EXPORT_PC()
18429    mov    r0, rPC              @ arg0
18430    mov    r1, rFP              @ arg1
18431    mov    r2, rSELF            @ arg2
18432    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18433
18434/* ------------------------------ */
18435    .balign 64
18436.L_ALT_OP_SHR_INT: /* 0x99 */
18437/* File: armv5te/alt_stub.S */
18438/*
18439 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18440 * any interesting requests and then jump to the real instruction
18441 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18442 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18443 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18444 * bail to the real handler if breakFlags==0.
18445 */
18446    ldrb   r3, [rSELF, #offThread_breakFlags]
18447    adrl   lr, dvmAsmInstructionStart + (153 * 64)
18448    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18449    cmp    r3, #0
18450    bxeq   lr                   @ nothing to do - jump to real handler
18451    EXPORT_PC()
18452    mov    r0, rPC              @ arg0
18453    mov    r1, rFP              @ arg1
18454    mov    r2, rSELF            @ arg2
18455    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18456
18457/* ------------------------------ */
18458    .balign 64
18459.L_ALT_OP_USHR_INT: /* 0x9a */
18460/* File: armv5te/alt_stub.S */
18461/*
18462 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18463 * any interesting requests and then jump to the real instruction
18464 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18465 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18466 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18467 * bail to the real handler if breakFlags==0.
18468 */
18469    ldrb   r3, [rSELF, #offThread_breakFlags]
18470    adrl   lr, dvmAsmInstructionStart + (154 * 64)
18471    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18472    cmp    r3, #0
18473    bxeq   lr                   @ nothing to do - jump to real handler
18474    EXPORT_PC()
18475    mov    r0, rPC              @ arg0
18476    mov    r1, rFP              @ arg1
18477    mov    r2, rSELF            @ arg2
18478    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18479
18480/* ------------------------------ */
18481    .balign 64
18482.L_ALT_OP_ADD_LONG: /* 0x9b */
18483/* File: armv5te/alt_stub.S */
18484/*
18485 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18486 * any interesting requests and then jump to the real instruction
18487 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18488 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18489 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18490 * bail to the real handler if breakFlags==0.
18491 */
18492    ldrb   r3, [rSELF, #offThread_breakFlags]
18493    adrl   lr, dvmAsmInstructionStart + (155 * 64)
18494    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18495    cmp    r3, #0
18496    bxeq   lr                   @ nothing to do - jump to real handler
18497    EXPORT_PC()
18498    mov    r0, rPC              @ arg0
18499    mov    r1, rFP              @ arg1
18500    mov    r2, rSELF            @ arg2
18501    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18502
18503/* ------------------------------ */
18504    .balign 64
18505.L_ALT_OP_SUB_LONG: /* 0x9c */
18506/* File: armv5te/alt_stub.S */
18507/*
18508 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18509 * any interesting requests and then jump to the real instruction
18510 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18511 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18512 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18513 * bail to the real handler if breakFlags==0.
18514 */
18515    ldrb   r3, [rSELF, #offThread_breakFlags]
18516    adrl   lr, dvmAsmInstructionStart + (156 * 64)
18517    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18518    cmp    r3, #0
18519    bxeq   lr                   @ nothing to do - jump to real handler
18520    EXPORT_PC()
18521    mov    r0, rPC              @ arg0
18522    mov    r1, rFP              @ arg1
18523    mov    r2, rSELF            @ arg2
18524    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18525
18526/* ------------------------------ */
18527    .balign 64
18528.L_ALT_OP_MUL_LONG: /* 0x9d */
18529/* File: armv5te/alt_stub.S */
18530/*
18531 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18532 * any interesting requests and then jump to the real instruction
18533 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18534 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18535 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18536 * bail to the real handler if breakFlags==0.
18537 */
18538    ldrb   r3, [rSELF, #offThread_breakFlags]
18539    adrl   lr, dvmAsmInstructionStart + (157 * 64)
18540    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18541    cmp    r3, #0
18542    bxeq   lr                   @ nothing to do - jump to real handler
18543    EXPORT_PC()
18544    mov    r0, rPC              @ arg0
18545    mov    r1, rFP              @ arg1
18546    mov    r2, rSELF            @ arg2
18547    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18548
18549/* ------------------------------ */
18550    .balign 64
18551.L_ALT_OP_DIV_LONG: /* 0x9e */
18552/* File: armv5te/alt_stub.S */
18553/*
18554 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18555 * any interesting requests and then jump to the real instruction
18556 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18557 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18558 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18559 * bail to the real handler if breakFlags==0.
18560 */
18561    ldrb   r3, [rSELF, #offThread_breakFlags]
18562    adrl   lr, dvmAsmInstructionStart + (158 * 64)
18563    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18564    cmp    r3, #0
18565    bxeq   lr                   @ nothing to do - jump to real handler
18566    EXPORT_PC()
18567    mov    r0, rPC              @ arg0
18568    mov    r1, rFP              @ arg1
18569    mov    r2, rSELF            @ arg2
18570    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18571
18572/* ------------------------------ */
18573    .balign 64
18574.L_ALT_OP_REM_LONG: /* 0x9f */
18575/* File: armv5te/alt_stub.S */
18576/*
18577 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18578 * any interesting requests and then jump to the real instruction
18579 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18580 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18581 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18582 * bail to the real handler if breakFlags==0.
18583 */
18584    ldrb   r3, [rSELF, #offThread_breakFlags]
18585    adrl   lr, dvmAsmInstructionStart + (159 * 64)
18586    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18587    cmp    r3, #0
18588    bxeq   lr                   @ nothing to do - jump to real handler
18589    EXPORT_PC()
18590    mov    r0, rPC              @ arg0
18591    mov    r1, rFP              @ arg1
18592    mov    r2, rSELF            @ arg2
18593    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18594
18595/* ------------------------------ */
18596    .balign 64
18597.L_ALT_OP_AND_LONG: /* 0xa0 */
18598/* File: armv5te/alt_stub.S */
18599/*
18600 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18601 * any interesting requests and then jump to the real instruction
18602 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18603 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18604 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18605 * bail to the real handler if breakFlags==0.
18606 */
18607    ldrb   r3, [rSELF, #offThread_breakFlags]
18608    adrl   lr, dvmAsmInstructionStart + (160 * 64)
18609    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18610    cmp    r3, #0
18611    bxeq   lr                   @ nothing to do - jump to real handler
18612    EXPORT_PC()
18613    mov    r0, rPC              @ arg0
18614    mov    r1, rFP              @ arg1
18615    mov    r2, rSELF            @ arg2
18616    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18617
18618/* ------------------------------ */
18619    .balign 64
18620.L_ALT_OP_OR_LONG: /* 0xa1 */
18621/* File: armv5te/alt_stub.S */
18622/*
18623 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18624 * any interesting requests and then jump to the real instruction
18625 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18626 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18627 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18628 * bail to the real handler if breakFlags==0.
18629 */
18630    ldrb   r3, [rSELF, #offThread_breakFlags]
18631    adrl   lr, dvmAsmInstructionStart + (161 * 64)
18632    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18633    cmp    r3, #0
18634    bxeq   lr                   @ nothing to do - jump to real handler
18635    EXPORT_PC()
18636    mov    r0, rPC              @ arg0
18637    mov    r1, rFP              @ arg1
18638    mov    r2, rSELF            @ arg2
18639    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18640
18641/* ------------------------------ */
18642    .balign 64
18643.L_ALT_OP_XOR_LONG: /* 0xa2 */
18644/* File: armv5te/alt_stub.S */
18645/*
18646 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18647 * any interesting requests and then jump to the real instruction
18648 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18649 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18650 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18651 * bail to the real handler if breakFlags==0.
18652 */
18653    ldrb   r3, [rSELF, #offThread_breakFlags]
18654    adrl   lr, dvmAsmInstructionStart + (162 * 64)
18655    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18656    cmp    r3, #0
18657    bxeq   lr                   @ nothing to do - jump to real handler
18658    EXPORT_PC()
18659    mov    r0, rPC              @ arg0
18660    mov    r1, rFP              @ arg1
18661    mov    r2, rSELF            @ arg2
18662    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18663
18664/* ------------------------------ */
18665    .balign 64
18666.L_ALT_OP_SHL_LONG: /* 0xa3 */
18667/* File: armv5te/alt_stub.S */
18668/*
18669 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18670 * any interesting requests and then jump to the real instruction
18671 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18672 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18673 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18674 * bail to the real handler if breakFlags==0.
18675 */
18676    ldrb   r3, [rSELF, #offThread_breakFlags]
18677    adrl   lr, dvmAsmInstructionStart + (163 * 64)
18678    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18679    cmp    r3, #0
18680    bxeq   lr                   @ nothing to do - jump to real handler
18681    EXPORT_PC()
18682    mov    r0, rPC              @ arg0
18683    mov    r1, rFP              @ arg1
18684    mov    r2, rSELF            @ arg2
18685    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18686
18687/* ------------------------------ */
18688    .balign 64
18689.L_ALT_OP_SHR_LONG: /* 0xa4 */
18690/* File: armv5te/alt_stub.S */
18691/*
18692 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18693 * any interesting requests and then jump to the real instruction
18694 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18695 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18696 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18697 * bail to the real handler if breakFlags==0.
18698 */
18699    ldrb   r3, [rSELF, #offThread_breakFlags]
18700    adrl   lr, dvmAsmInstructionStart + (164 * 64)
18701    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18702    cmp    r3, #0
18703    bxeq   lr                   @ nothing to do - jump to real handler
18704    EXPORT_PC()
18705    mov    r0, rPC              @ arg0
18706    mov    r1, rFP              @ arg1
18707    mov    r2, rSELF            @ arg2
18708    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18709
18710/* ------------------------------ */
18711    .balign 64
18712.L_ALT_OP_USHR_LONG: /* 0xa5 */
18713/* File: armv5te/alt_stub.S */
18714/*
18715 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18716 * any interesting requests and then jump to the real instruction
18717 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18718 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18719 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18720 * bail to the real handler if breakFlags==0.
18721 */
18722    ldrb   r3, [rSELF, #offThread_breakFlags]
18723    adrl   lr, dvmAsmInstructionStart + (165 * 64)
18724    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18725    cmp    r3, #0
18726    bxeq   lr                   @ nothing to do - jump to real handler
18727    EXPORT_PC()
18728    mov    r0, rPC              @ arg0
18729    mov    r1, rFP              @ arg1
18730    mov    r2, rSELF            @ arg2
18731    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18732
18733/* ------------------------------ */
18734    .balign 64
18735.L_ALT_OP_ADD_FLOAT: /* 0xa6 */
18736/* File: armv5te/alt_stub.S */
18737/*
18738 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18739 * any interesting requests and then jump to the real instruction
18740 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18741 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18742 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18743 * bail to the real handler if breakFlags==0.
18744 */
18745    ldrb   r3, [rSELF, #offThread_breakFlags]
18746    adrl   lr, dvmAsmInstructionStart + (166 * 64)
18747    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18748    cmp    r3, #0
18749    bxeq   lr                   @ nothing to do - jump to real handler
18750    EXPORT_PC()
18751    mov    r0, rPC              @ arg0
18752    mov    r1, rFP              @ arg1
18753    mov    r2, rSELF            @ arg2
18754    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18755
18756/* ------------------------------ */
18757    .balign 64
18758.L_ALT_OP_SUB_FLOAT: /* 0xa7 */
18759/* File: armv5te/alt_stub.S */
18760/*
18761 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18762 * any interesting requests and then jump to the real instruction
18763 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18764 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18765 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18766 * bail to the real handler if breakFlags==0.
18767 */
18768    ldrb   r3, [rSELF, #offThread_breakFlags]
18769    adrl   lr, dvmAsmInstructionStart + (167 * 64)
18770    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18771    cmp    r3, #0
18772    bxeq   lr                   @ nothing to do - jump to real handler
18773    EXPORT_PC()
18774    mov    r0, rPC              @ arg0
18775    mov    r1, rFP              @ arg1
18776    mov    r2, rSELF            @ arg2
18777    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18778
18779/* ------------------------------ */
18780    .balign 64
18781.L_ALT_OP_MUL_FLOAT: /* 0xa8 */
18782/* File: armv5te/alt_stub.S */
18783/*
18784 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18785 * any interesting requests and then jump to the real instruction
18786 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18787 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18788 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18789 * bail to the real handler if breakFlags==0.
18790 */
18791    ldrb   r3, [rSELF, #offThread_breakFlags]
18792    adrl   lr, dvmAsmInstructionStart + (168 * 64)
18793    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18794    cmp    r3, #0
18795    bxeq   lr                   @ nothing to do - jump to real handler
18796    EXPORT_PC()
18797    mov    r0, rPC              @ arg0
18798    mov    r1, rFP              @ arg1
18799    mov    r2, rSELF            @ arg2
18800    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18801
18802/* ------------------------------ */
18803    .balign 64
18804.L_ALT_OP_DIV_FLOAT: /* 0xa9 */
18805/* File: armv5te/alt_stub.S */
18806/*
18807 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18808 * any interesting requests and then jump to the real instruction
18809 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18810 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18811 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18812 * bail to the real handler if breakFlags==0.
18813 */
18814    ldrb   r3, [rSELF, #offThread_breakFlags]
18815    adrl   lr, dvmAsmInstructionStart + (169 * 64)
18816    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18817    cmp    r3, #0
18818    bxeq   lr                   @ nothing to do - jump to real handler
18819    EXPORT_PC()
18820    mov    r0, rPC              @ arg0
18821    mov    r1, rFP              @ arg1
18822    mov    r2, rSELF            @ arg2
18823    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18824
18825/* ------------------------------ */
18826    .balign 64
18827.L_ALT_OP_REM_FLOAT: /* 0xaa */
18828/* File: armv5te/alt_stub.S */
18829/*
18830 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18831 * any interesting requests and then jump to the real instruction
18832 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18833 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18834 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18835 * bail to the real handler if breakFlags==0.
18836 */
18837    ldrb   r3, [rSELF, #offThread_breakFlags]
18838    adrl   lr, dvmAsmInstructionStart + (170 * 64)
18839    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18840    cmp    r3, #0
18841    bxeq   lr                   @ nothing to do - jump to real handler
18842    EXPORT_PC()
18843    mov    r0, rPC              @ arg0
18844    mov    r1, rFP              @ arg1
18845    mov    r2, rSELF            @ arg2
18846    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18847
18848/* ------------------------------ */
18849    .balign 64
18850.L_ALT_OP_ADD_DOUBLE: /* 0xab */
18851/* File: armv5te/alt_stub.S */
18852/*
18853 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18854 * any interesting requests and then jump to the real instruction
18855 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18856 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18857 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18858 * bail to the real handler if breakFlags==0.
18859 */
18860    ldrb   r3, [rSELF, #offThread_breakFlags]
18861    adrl   lr, dvmAsmInstructionStart + (171 * 64)
18862    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18863    cmp    r3, #0
18864    bxeq   lr                   @ nothing to do - jump to real handler
18865    EXPORT_PC()
18866    mov    r0, rPC              @ arg0
18867    mov    r1, rFP              @ arg1
18868    mov    r2, rSELF            @ arg2
18869    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18870
18871/* ------------------------------ */
18872    .balign 64
18873.L_ALT_OP_SUB_DOUBLE: /* 0xac */
18874/* File: armv5te/alt_stub.S */
18875/*
18876 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18877 * any interesting requests and then jump to the real instruction
18878 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18879 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18880 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18881 * bail to the real handler if breakFlags==0.
18882 */
18883    ldrb   r3, [rSELF, #offThread_breakFlags]
18884    adrl   lr, dvmAsmInstructionStart + (172 * 64)
18885    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18886    cmp    r3, #0
18887    bxeq   lr                   @ nothing to do - jump to real handler
18888    EXPORT_PC()
18889    mov    r0, rPC              @ arg0
18890    mov    r1, rFP              @ arg1
18891    mov    r2, rSELF            @ arg2
18892    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18893
18894/* ------------------------------ */
18895    .balign 64
18896.L_ALT_OP_MUL_DOUBLE: /* 0xad */
18897/* File: armv5te/alt_stub.S */
18898/*
18899 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18900 * any interesting requests and then jump to the real instruction
18901 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18902 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18903 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18904 * bail to the real handler if breakFlags==0.
18905 */
18906    ldrb   r3, [rSELF, #offThread_breakFlags]
18907    adrl   lr, dvmAsmInstructionStart + (173 * 64)
18908    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18909    cmp    r3, #0
18910    bxeq   lr                   @ nothing to do - jump to real handler
18911    EXPORT_PC()
18912    mov    r0, rPC              @ arg0
18913    mov    r1, rFP              @ arg1
18914    mov    r2, rSELF            @ arg2
18915    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18916
18917/* ------------------------------ */
18918    .balign 64
18919.L_ALT_OP_DIV_DOUBLE: /* 0xae */
18920/* File: armv5te/alt_stub.S */
18921/*
18922 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18923 * any interesting requests and then jump to the real instruction
18924 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18925 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18926 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18927 * bail to the real handler if breakFlags==0.
18928 */
18929    ldrb   r3, [rSELF, #offThread_breakFlags]
18930    adrl   lr, dvmAsmInstructionStart + (174 * 64)
18931    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18932    cmp    r3, #0
18933    bxeq   lr                   @ nothing to do - jump to real handler
18934    EXPORT_PC()
18935    mov    r0, rPC              @ arg0
18936    mov    r1, rFP              @ arg1
18937    mov    r2, rSELF            @ arg2
18938    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18939
18940/* ------------------------------ */
18941    .balign 64
18942.L_ALT_OP_REM_DOUBLE: /* 0xaf */
18943/* File: armv5te/alt_stub.S */
18944/*
18945 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18946 * any interesting requests and then jump to the real instruction
18947 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18948 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18949 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18950 * bail to the real handler if breakFlags==0.
18951 */
18952    ldrb   r3, [rSELF, #offThread_breakFlags]
18953    adrl   lr, dvmAsmInstructionStart + (175 * 64)
18954    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18955    cmp    r3, #0
18956    bxeq   lr                   @ nothing to do - jump to real handler
18957    EXPORT_PC()
18958    mov    r0, rPC              @ arg0
18959    mov    r1, rFP              @ arg1
18960    mov    r2, rSELF            @ arg2
18961    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18962
18963/* ------------------------------ */
18964    .balign 64
18965.L_ALT_OP_ADD_INT_2ADDR: /* 0xb0 */
18966/* File: armv5te/alt_stub.S */
18967/*
18968 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18969 * any interesting requests and then jump to the real instruction
18970 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18971 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18972 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18973 * bail to the real handler if breakFlags==0.
18974 */
18975    ldrb   r3, [rSELF, #offThread_breakFlags]
18976    adrl   lr, dvmAsmInstructionStart + (176 * 64)
18977    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18978    cmp    r3, #0
18979    bxeq   lr                   @ nothing to do - jump to real handler
18980    EXPORT_PC()
18981    mov    r0, rPC              @ arg0
18982    mov    r1, rFP              @ arg1
18983    mov    r2, rSELF            @ arg2
18984    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18985
18986/* ------------------------------ */
18987    .balign 64
18988.L_ALT_OP_SUB_INT_2ADDR: /* 0xb1 */
18989/* File: armv5te/alt_stub.S */
18990/*
18991 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18992 * any interesting requests and then jump to the real instruction
18993 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18994 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18995 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18996 * bail to the real handler if breakFlags==0.
18997 */
18998    ldrb   r3, [rSELF, #offThread_breakFlags]
18999    adrl   lr, dvmAsmInstructionStart + (177 * 64)
19000    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19001    cmp    r3, #0
19002    bxeq   lr                   @ nothing to do - jump to real handler
19003    EXPORT_PC()
19004    mov    r0, rPC              @ arg0
19005    mov    r1, rFP              @ arg1
19006    mov    r2, rSELF            @ arg2
19007    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19008
19009/* ------------------------------ */
19010    .balign 64
19011.L_ALT_OP_MUL_INT_2ADDR: /* 0xb2 */
19012/* File: armv5te/alt_stub.S */
19013/*
19014 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19015 * any interesting requests and then jump to the real instruction
19016 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19017 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19018 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19019 * bail to the real handler if breakFlags==0.
19020 */
19021    ldrb   r3, [rSELF, #offThread_breakFlags]
19022    adrl   lr, dvmAsmInstructionStart + (178 * 64)
19023    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19024    cmp    r3, #0
19025    bxeq   lr                   @ nothing to do - jump to real handler
19026    EXPORT_PC()
19027    mov    r0, rPC              @ arg0
19028    mov    r1, rFP              @ arg1
19029    mov    r2, rSELF            @ arg2
19030    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19031
19032/* ------------------------------ */
19033    .balign 64
19034.L_ALT_OP_DIV_INT_2ADDR: /* 0xb3 */
19035/* File: armv5te/alt_stub.S */
19036/*
19037 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19038 * any interesting requests and then jump to the real instruction
19039 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19040 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19041 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19042 * bail to the real handler if breakFlags==0.
19043 */
19044    ldrb   r3, [rSELF, #offThread_breakFlags]
19045    adrl   lr, dvmAsmInstructionStart + (179 * 64)
19046    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19047    cmp    r3, #0
19048    bxeq   lr                   @ nothing to do - jump to real handler
19049    EXPORT_PC()
19050    mov    r0, rPC              @ arg0
19051    mov    r1, rFP              @ arg1
19052    mov    r2, rSELF            @ arg2
19053    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19054
19055/* ------------------------------ */
19056    .balign 64
19057.L_ALT_OP_REM_INT_2ADDR: /* 0xb4 */
19058/* File: armv5te/alt_stub.S */
19059/*
19060 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19061 * any interesting requests and then jump to the real instruction
19062 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19063 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19064 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19065 * bail to the real handler if breakFlags==0.
19066 */
19067    ldrb   r3, [rSELF, #offThread_breakFlags]
19068    adrl   lr, dvmAsmInstructionStart + (180 * 64)
19069    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19070    cmp    r3, #0
19071    bxeq   lr                   @ nothing to do - jump to real handler
19072    EXPORT_PC()
19073    mov    r0, rPC              @ arg0
19074    mov    r1, rFP              @ arg1
19075    mov    r2, rSELF            @ arg2
19076    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19077
19078/* ------------------------------ */
19079    .balign 64
19080.L_ALT_OP_AND_INT_2ADDR: /* 0xb5 */
19081/* File: armv5te/alt_stub.S */
19082/*
19083 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19084 * any interesting requests and then jump to the real instruction
19085 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19086 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19087 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19088 * bail to the real handler if breakFlags==0.
19089 */
19090    ldrb   r3, [rSELF, #offThread_breakFlags]
19091    adrl   lr, dvmAsmInstructionStart + (181 * 64)
19092    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19093    cmp    r3, #0
19094    bxeq   lr                   @ nothing to do - jump to real handler
19095    EXPORT_PC()
19096    mov    r0, rPC              @ arg0
19097    mov    r1, rFP              @ arg1
19098    mov    r2, rSELF            @ arg2
19099    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19100
19101/* ------------------------------ */
19102    .balign 64
19103.L_ALT_OP_OR_INT_2ADDR: /* 0xb6 */
19104/* File: armv5te/alt_stub.S */
19105/*
19106 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19107 * any interesting requests and then jump to the real instruction
19108 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19109 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19110 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19111 * bail to the real handler if breakFlags==0.
19112 */
19113    ldrb   r3, [rSELF, #offThread_breakFlags]
19114    adrl   lr, dvmAsmInstructionStart + (182 * 64)
19115    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19116    cmp    r3, #0
19117    bxeq   lr                   @ nothing to do - jump to real handler
19118    EXPORT_PC()
19119    mov    r0, rPC              @ arg0
19120    mov    r1, rFP              @ arg1
19121    mov    r2, rSELF            @ arg2
19122    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19123
19124/* ------------------------------ */
19125    .balign 64
19126.L_ALT_OP_XOR_INT_2ADDR: /* 0xb7 */
19127/* File: armv5te/alt_stub.S */
19128/*
19129 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19130 * any interesting requests and then jump to the real instruction
19131 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19132 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19133 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19134 * bail to the real handler if breakFlags==0.
19135 */
19136    ldrb   r3, [rSELF, #offThread_breakFlags]
19137    adrl   lr, dvmAsmInstructionStart + (183 * 64)
19138    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19139    cmp    r3, #0
19140    bxeq   lr                   @ nothing to do - jump to real handler
19141    EXPORT_PC()
19142    mov    r0, rPC              @ arg0
19143    mov    r1, rFP              @ arg1
19144    mov    r2, rSELF            @ arg2
19145    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19146
19147/* ------------------------------ */
19148    .balign 64
19149.L_ALT_OP_SHL_INT_2ADDR: /* 0xb8 */
19150/* File: armv5te/alt_stub.S */
19151/*
19152 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19153 * any interesting requests and then jump to the real instruction
19154 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19155 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19156 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19157 * bail to the real handler if breakFlags==0.
19158 */
19159    ldrb   r3, [rSELF, #offThread_breakFlags]
19160    adrl   lr, dvmAsmInstructionStart + (184 * 64)
19161    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19162    cmp    r3, #0
19163    bxeq   lr                   @ nothing to do - jump to real handler
19164    EXPORT_PC()
19165    mov    r0, rPC              @ arg0
19166    mov    r1, rFP              @ arg1
19167    mov    r2, rSELF            @ arg2
19168    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19169
19170/* ------------------------------ */
19171    .balign 64
19172.L_ALT_OP_SHR_INT_2ADDR: /* 0xb9 */
19173/* File: armv5te/alt_stub.S */
19174/*
19175 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19176 * any interesting requests and then jump to the real instruction
19177 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19178 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19179 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19180 * bail to the real handler if breakFlags==0.
19181 */
19182    ldrb   r3, [rSELF, #offThread_breakFlags]
19183    adrl   lr, dvmAsmInstructionStart + (185 * 64)
19184    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19185    cmp    r3, #0
19186    bxeq   lr                   @ nothing to do - jump to real handler
19187    EXPORT_PC()
19188    mov    r0, rPC              @ arg0
19189    mov    r1, rFP              @ arg1
19190    mov    r2, rSELF            @ arg2
19191    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19192
19193/* ------------------------------ */
19194    .balign 64
19195.L_ALT_OP_USHR_INT_2ADDR: /* 0xba */
19196/* File: armv5te/alt_stub.S */
19197/*
19198 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19199 * any interesting requests and then jump to the real instruction
19200 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19201 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19202 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19203 * bail to the real handler if breakFlags==0.
19204 */
19205    ldrb   r3, [rSELF, #offThread_breakFlags]
19206    adrl   lr, dvmAsmInstructionStart + (186 * 64)
19207    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19208    cmp    r3, #0
19209    bxeq   lr                   @ nothing to do - jump to real handler
19210    EXPORT_PC()
19211    mov    r0, rPC              @ arg0
19212    mov    r1, rFP              @ arg1
19213    mov    r2, rSELF            @ arg2
19214    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19215
19216/* ------------------------------ */
19217    .balign 64
19218.L_ALT_OP_ADD_LONG_2ADDR: /* 0xbb */
19219/* File: armv5te/alt_stub.S */
19220/*
19221 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19222 * any interesting requests and then jump to the real instruction
19223 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19224 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19225 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19226 * bail to the real handler if breakFlags==0.
19227 */
19228    ldrb   r3, [rSELF, #offThread_breakFlags]
19229    adrl   lr, dvmAsmInstructionStart + (187 * 64)
19230    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19231    cmp    r3, #0
19232    bxeq   lr                   @ nothing to do - jump to real handler
19233    EXPORT_PC()
19234    mov    r0, rPC              @ arg0
19235    mov    r1, rFP              @ arg1
19236    mov    r2, rSELF            @ arg2
19237    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19238
19239/* ------------------------------ */
19240    .balign 64
19241.L_ALT_OP_SUB_LONG_2ADDR: /* 0xbc */
19242/* File: armv5te/alt_stub.S */
19243/*
19244 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19245 * any interesting requests and then jump to the real instruction
19246 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19247 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19248 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19249 * bail to the real handler if breakFlags==0.
19250 */
19251    ldrb   r3, [rSELF, #offThread_breakFlags]
19252    adrl   lr, dvmAsmInstructionStart + (188 * 64)
19253    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19254    cmp    r3, #0
19255    bxeq   lr                   @ nothing to do - jump to real handler
19256    EXPORT_PC()
19257    mov    r0, rPC              @ arg0
19258    mov    r1, rFP              @ arg1
19259    mov    r2, rSELF            @ arg2
19260    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19261
19262/* ------------------------------ */
19263    .balign 64
19264.L_ALT_OP_MUL_LONG_2ADDR: /* 0xbd */
19265/* File: armv5te/alt_stub.S */
19266/*
19267 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19268 * any interesting requests and then jump to the real instruction
19269 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19270 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19271 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19272 * bail to the real handler if breakFlags==0.
19273 */
19274    ldrb   r3, [rSELF, #offThread_breakFlags]
19275    adrl   lr, dvmAsmInstructionStart + (189 * 64)
19276    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19277    cmp    r3, #0
19278    bxeq   lr                   @ nothing to do - jump to real handler
19279    EXPORT_PC()
19280    mov    r0, rPC              @ arg0
19281    mov    r1, rFP              @ arg1
19282    mov    r2, rSELF            @ arg2
19283    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19284
19285/* ------------------------------ */
19286    .balign 64
19287.L_ALT_OP_DIV_LONG_2ADDR: /* 0xbe */
19288/* File: armv5te/alt_stub.S */
19289/*
19290 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19291 * any interesting requests and then jump to the real instruction
19292 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19293 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19294 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19295 * bail to the real handler if breakFlags==0.
19296 */
19297    ldrb   r3, [rSELF, #offThread_breakFlags]
19298    adrl   lr, dvmAsmInstructionStart + (190 * 64)
19299    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19300    cmp    r3, #0
19301    bxeq   lr                   @ nothing to do - jump to real handler
19302    EXPORT_PC()
19303    mov    r0, rPC              @ arg0
19304    mov    r1, rFP              @ arg1
19305    mov    r2, rSELF            @ arg2
19306    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19307
19308/* ------------------------------ */
19309    .balign 64
19310.L_ALT_OP_REM_LONG_2ADDR: /* 0xbf */
19311/* File: armv5te/alt_stub.S */
19312/*
19313 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19314 * any interesting requests and then jump to the real instruction
19315 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19316 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19317 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19318 * bail to the real handler if breakFlags==0.
19319 */
19320    ldrb   r3, [rSELF, #offThread_breakFlags]
19321    adrl   lr, dvmAsmInstructionStart + (191 * 64)
19322    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19323    cmp    r3, #0
19324    bxeq   lr                   @ nothing to do - jump to real handler
19325    EXPORT_PC()
19326    mov    r0, rPC              @ arg0
19327    mov    r1, rFP              @ arg1
19328    mov    r2, rSELF            @ arg2
19329    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19330
19331/* ------------------------------ */
19332    .balign 64
19333.L_ALT_OP_AND_LONG_2ADDR: /* 0xc0 */
19334/* File: armv5te/alt_stub.S */
19335/*
19336 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19337 * any interesting requests and then jump to the real instruction
19338 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19339 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19340 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19341 * bail to the real handler if breakFlags==0.
19342 */
19343    ldrb   r3, [rSELF, #offThread_breakFlags]
19344    adrl   lr, dvmAsmInstructionStart + (192 * 64)
19345    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19346    cmp    r3, #0
19347    bxeq   lr                   @ nothing to do - jump to real handler
19348    EXPORT_PC()
19349    mov    r0, rPC              @ arg0
19350    mov    r1, rFP              @ arg1
19351    mov    r2, rSELF            @ arg2
19352    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19353
19354/* ------------------------------ */
19355    .balign 64
19356.L_ALT_OP_OR_LONG_2ADDR: /* 0xc1 */
19357/* File: armv5te/alt_stub.S */
19358/*
19359 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19360 * any interesting requests and then jump to the real instruction
19361 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19362 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19363 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19364 * bail to the real handler if breakFlags==0.
19365 */
19366    ldrb   r3, [rSELF, #offThread_breakFlags]
19367    adrl   lr, dvmAsmInstructionStart + (193 * 64)
19368    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19369    cmp    r3, #0
19370    bxeq   lr                   @ nothing to do - jump to real handler
19371    EXPORT_PC()
19372    mov    r0, rPC              @ arg0
19373    mov    r1, rFP              @ arg1
19374    mov    r2, rSELF            @ arg2
19375    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19376
19377/* ------------------------------ */
19378    .balign 64
19379.L_ALT_OP_XOR_LONG_2ADDR: /* 0xc2 */
19380/* File: armv5te/alt_stub.S */
19381/*
19382 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19383 * any interesting requests and then jump to the real instruction
19384 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19385 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19386 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19387 * bail to the real handler if breakFlags==0.
19388 */
19389    ldrb   r3, [rSELF, #offThread_breakFlags]
19390    adrl   lr, dvmAsmInstructionStart + (194 * 64)
19391    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19392    cmp    r3, #0
19393    bxeq   lr                   @ nothing to do - jump to real handler
19394    EXPORT_PC()
19395    mov    r0, rPC              @ arg0
19396    mov    r1, rFP              @ arg1
19397    mov    r2, rSELF            @ arg2
19398    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19399
19400/* ------------------------------ */
19401    .balign 64
19402.L_ALT_OP_SHL_LONG_2ADDR: /* 0xc3 */
19403/* File: armv5te/alt_stub.S */
19404/*
19405 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19406 * any interesting requests and then jump to the real instruction
19407 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19408 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19409 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19410 * bail to the real handler if breakFlags==0.
19411 */
19412    ldrb   r3, [rSELF, #offThread_breakFlags]
19413    adrl   lr, dvmAsmInstructionStart + (195 * 64)
19414    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19415    cmp    r3, #0
19416    bxeq   lr                   @ nothing to do - jump to real handler
19417    EXPORT_PC()
19418    mov    r0, rPC              @ arg0
19419    mov    r1, rFP              @ arg1
19420    mov    r2, rSELF            @ arg2
19421    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19422
19423/* ------------------------------ */
19424    .balign 64
19425.L_ALT_OP_SHR_LONG_2ADDR: /* 0xc4 */
19426/* File: armv5te/alt_stub.S */
19427/*
19428 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19429 * any interesting requests and then jump to the real instruction
19430 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19431 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19432 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19433 * bail to the real handler if breakFlags==0.
19434 */
19435    ldrb   r3, [rSELF, #offThread_breakFlags]
19436    adrl   lr, dvmAsmInstructionStart + (196 * 64)
19437    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19438    cmp    r3, #0
19439    bxeq   lr                   @ nothing to do - jump to real handler
19440    EXPORT_PC()
19441    mov    r0, rPC              @ arg0
19442    mov    r1, rFP              @ arg1
19443    mov    r2, rSELF            @ arg2
19444    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19445
19446/* ------------------------------ */
19447    .balign 64
19448.L_ALT_OP_USHR_LONG_2ADDR: /* 0xc5 */
19449/* File: armv5te/alt_stub.S */
19450/*
19451 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19452 * any interesting requests and then jump to the real instruction
19453 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19454 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19455 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19456 * bail to the real handler if breakFlags==0.
19457 */
19458    ldrb   r3, [rSELF, #offThread_breakFlags]
19459    adrl   lr, dvmAsmInstructionStart + (197 * 64)
19460    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19461    cmp    r3, #0
19462    bxeq   lr                   @ nothing to do - jump to real handler
19463    EXPORT_PC()
19464    mov    r0, rPC              @ arg0
19465    mov    r1, rFP              @ arg1
19466    mov    r2, rSELF            @ arg2
19467    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19468
19469/* ------------------------------ */
19470    .balign 64
19471.L_ALT_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
19472/* File: armv5te/alt_stub.S */
19473/*
19474 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19475 * any interesting requests and then jump to the real instruction
19476 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19477 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19478 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19479 * bail to the real handler if breakFlags==0.
19480 */
19481    ldrb   r3, [rSELF, #offThread_breakFlags]
19482    adrl   lr, dvmAsmInstructionStart + (198 * 64)
19483    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19484    cmp    r3, #0
19485    bxeq   lr                   @ nothing to do - jump to real handler
19486    EXPORT_PC()
19487    mov    r0, rPC              @ arg0
19488    mov    r1, rFP              @ arg1
19489    mov    r2, rSELF            @ arg2
19490    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19491
19492/* ------------------------------ */
19493    .balign 64
19494.L_ALT_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
19495/* File: armv5te/alt_stub.S */
19496/*
19497 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19498 * any interesting requests and then jump to the real instruction
19499 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19500 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19501 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19502 * bail to the real handler if breakFlags==0.
19503 */
19504    ldrb   r3, [rSELF, #offThread_breakFlags]
19505    adrl   lr, dvmAsmInstructionStart + (199 * 64)
19506    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19507    cmp    r3, #0
19508    bxeq   lr                   @ nothing to do - jump to real handler
19509    EXPORT_PC()
19510    mov    r0, rPC              @ arg0
19511    mov    r1, rFP              @ arg1
19512    mov    r2, rSELF            @ arg2
19513    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19514
19515/* ------------------------------ */
19516    .balign 64
19517.L_ALT_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
19518/* File: armv5te/alt_stub.S */
19519/*
19520 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19521 * any interesting requests and then jump to the real instruction
19522 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19523 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19524 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19525 * bail to the real handler if breakFlags==0.
19526 */
19527    ldrb   r3, [rSELF, #offThread_breakFlags]
19528    adrl   lr, dvmAsmInstructionStart + (200 * 64)
19529    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19530    cmp    r3, #0
19531    bxeq   lr                   @ nothing to do - jump to real handler
19532    EXPORT_PC()
19533    mov    r0, rPC              @ arg0
19534    mov    r1, rFP              @ arg1
19535    mov    r2, rSELF            @ arg2
19536    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19537
19538/* ------------------------------ */
19539    .balign 64
19540.L_ALT_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
19541/* File: armv5te/alt_stub.S */
19542/*
19543 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19544 * any interesting requests and then jump to the real instruction
19545 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19546 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19547 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19548 * bail to the real handler if breakFlags==0.
19549 */
19550    ldrb   r3, [rSELF, #offThread_breakFlags]
19551    adrl   lr, dvmAsmInstructionStart + (201 * 64)
19552    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19553    cmp    r3, #0
19554    bxeq   lr                   @ nothing to do - jump to real handler
19555    EXPORT_PC()
19556    mov    r0, rPC              @ arg0
19557    mov    r1, rFP              @ arg1
19558    mov    r2, rSELF            @ arg2
19559    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19560
19561/* ------------------------------ */
19562    .balign 64
19563.L_ALT_OP_REM_FLOAT_2ADDR: /* 0xca */
19564/* File: armv5te/alt_stub.S */
19565/*
19566 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19567 * any interesting requests and then jump to the real instruction
19568 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19569 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19570 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19571 * bail to the real handler if breakFlags==0.
19572 */
19573    ldrb   r3, [rSELF, #offThread_breakFlags]
19574    adrl   lr, dvmAsmInstructionStart + (202 * 64)
19575    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19576    cmp    r3, #0
19577    bxeq   lr                   @ nothing to do - jump to real handler
19578    EXPORT_PC()
19579    mov    r0, rPC              @ arg0
19580    mov    r1, rFP              @ arg1
19581    mov    r2, rSELF            @ arg2
19582    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19583
19584/* ------------------------------ */
19585    .balign 64
19586.L_ALT_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
19587/* File: armv5te/alt_stub.S */
19588/*
19589 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19590 * any interesting requests and then jump to the real instruction
19591 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19592 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19593 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19594 * bail to the real handler if breakFlags==0.
19595 */
19596    ldrb   r3, [rSELF, #offThread_breakFlags]
19597    adrl   lr, dvmAsmInstructionStart + (203 * 64)
19598    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19599    cmp    r3, #0
19600    bxeq   lr                   @ nothing to do - jump to real handler
19601    EXPORT_PC()
19602    mov    r0, rPC              @ arg0
19603    mov    r1, rFP              @ arg1
19604    mov    r2, rSELF            @ arg2
19605    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19606
19607/* ------------------------------ */
19608    .balign 64
19609.L_ALT_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
19610/* File: armv5te/alt_stub.S */
19611/*
19612 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19613 * any interesting requests and then jump to the real instruction
19614 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19615 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19616 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19617 * bail to the real handler if breakFlags==0.
19618 */
19619    ldrb   r3, [rSELF, #offThread_breakFlags]
19620    adrl   lr, dvmAsmInstructionStart + (204 * 64)
19621    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19622    cmp    r3, #0
19623    bxeq   lr                   @ nothing to do - jump to real handler
19624    EXPORT_PC()
19625    mov    r0, rPC              @ arg0
19626    mov    r1, rFP              @ arg1
19627    mov    r2, rSELF            @ arg2
19628    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19629
19630/* ------------------------------ */
19631    .balign 64
19632.L_ALT_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
19633/* File: armv5te/alt_stub.S */
19634/*
19635 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19636 * any interesting requests and then jump to the real instruction
19637 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19638 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19639 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19640 * bail to the real handler if breakFlags==0.
19641 */
19642    ldrb   r3, [rSELF, #offThread_breakFlags]
19643    adrl   lr, dvmAsmInstructionStart + (205 * 64)
19644    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19645    cmp    r3, #0
19646    bxeq   lr                   @ nothing to do - jump to real handler
19647    EXPORT_PC()
19648    mov    r0, rPC              @ arg0
19649    mov    r1, rFP              @ arg1
19650    mov    r2, rSELF            @ arg2
19651    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19652
19653/* ------------------------------ */
19654    .balign 64
19655.L_ALT_OP_DIV_DOUBLE_2ADDR: /* 0xce */
19656/* File: armv5te/alt_stub.S */
19657/*
19658 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19659 * any interesting requests and then jump to the real instruction
19660 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19661 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19662 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19663 * bail to the real handler if breakFlags==0.
19664 */
19665    ldrb   r3, [rSELF, #offThread_breakFlags]
19666    adrl   lr, dvmAsmInstructionStart + (206 * 64)
19667    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19668    cmp    r3, #0
19669    bxeq   lr                   @ nothing to do - jump to real handler
19670    EXPORT_PC()
19671    mov    r0, rPC              @ arg0
19672    mov    r1, rFP              @ arg1
19673    mov    r2, rSELF            @ arg2
19674    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19675
19676/* ------------------------------ */
19677    .balign 64
19678.L_ALT_OP_REM_DOUBLE_2ADDR: /* 0xcf */
19679/* File: armv5te/alt_stub.S */
19680/*
19681 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19682 * any interesting requests and then jump to the real instruction
19683 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19684 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19685 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19686 * bail to the real handler if breakFlags==0.
19687 */
19688    ldrb   r3, [rSELF, #offThread_breakFlags]
19689    adrl   lr, dvmAsmInstructionStart + (207 * 64)
19690    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19691    cmp    r3, #0
19692    bxeq   lr                   @ nothing to do - jump to real handler
19693    EXPORT_PC()
19694    mov    r0, rPC              @ arg0
19695    mov    r1, rFP              @ arg1
19696    mov    r2, rSELF            @ arg2
19697    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19698
19699/* ------------------------------ */
19700    .balign 64
19701.L_ALT_OP_ADD_INT_LIT16: /* 0xd0 */
19702/* File: armv5te/alt_stub.S */
19703/*
19704 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19705 * any interesting requests and then jump to the real instruction
19706 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19707 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19708 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19709 * bail to the real handler if breakFlags==0.
19710 */
19711    ldrb   r3, [rSELF, #offThread_breakFlags]
19712    adrl   lr, dvmAsmInstructionStart + (208 * 64)
19713    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19714    cmp    r3, #0
19715    bxeq   lr                   @ nothing to do - jump to real handler
19716    EXPORT_PC()
19717    mov    r0, rPC              @ arg0
19718    mov    r1, rFP              @ arg1
19719    mov    r2, rSELF            @ arg2
19720    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19721
19722/* ------------------------------ */
19723    .balign 64
19724.L_ALT_OP_RSUB_INT: /* 0xd1 */
19725/* File: armv5te/alt_stub.S */
19726/*
19727 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19728 * any interesting requests and then jump to the real instruction
19729 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19730 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19731 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19732 * bail to the real handler if breakFlags==0.
19733 */
19734    ldrb   r3, [rSELF, #offThread_breakFlags]
19735    adrl   lr, dvmAsmInstructionStart + (209 * 64)
19736    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19737    cmp    r3, #0
19738    bxeq   lr                   @ nothing to do - jump to real handler
19739    EXPORT_PC()
19740    mov    r0, rPC              @ arg0
19741    mov    r1, rFP              @ arg1
19742    mov    r2, rSELF            @ arg2
19743    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19744
19745/* ------------------------------ */
19746    .balign 64
19747.L_ALT_OP_MUL_INT_LIT16: /* 0xd2 */
19748/* File: armv5te/alt_stub.S */
19749/*
19750 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19751 * any interesting requests and then jump to the real instruction
19752 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19753 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19754 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19755 * bail to the real handler if breakFlags==0.
19756 */
19757    ldrb   r3, [rSELF, #offThread_breakFlags]
19758    adrl   lr, dvmAsmInstructionStart + (210 * 64)
19759    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19760    cmp    r3, #0
19761    bxeq   lr                   @ nothing to do - jump to real handler
19762    EXPORT_PC()
19763    mov    r0, rPC              @ arg0
19764    mov    r1, rFP              @ arg1
19765    mov    r2, rSELF            @ arg2
19766    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19767
19768/* ------------------------------ */
19769    .balign 64
19770.L_ALT_OP_DIV_INT_LIT16: /* 0xd3 */
19771/* File: armv5te/alt_stub.S */
19772/*
19773 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19774 * any interesting requests and then jump to the real instruction
19775 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19776 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19777 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19778 * bail to the real handler if breakFlags==0.
19779 */
19780    ldrb   r3, [rSELF, #offThread_breakFlags]
19781    adrl   lr, dvmAsmInstructionStart + (211 * 64)
19782    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19783    cmp    r3, #0
19784    bxeq   lr                   @ nothing to do - jump to real handler
19785    EXPORT_PC()
19786    mov    r0, rPC              @ arg0
19787    mov    r1, rFP              @ arg1
19788    mov    r2, rSELF            @ arg2
19789    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19790
19791/* ------------------------------ */
19792    .balign 64
19793.L_ALT_OP_REM_INT_LIT16: /* 0xd4 */
19794/* File: armv5te/alt_stub.S */
19795/*
19796 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19797 * any interesting requests and then jump to the real instruction
19798 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19799 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19800 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19801 * bail to the real handler if breakFlags==0.
19802 */
19803    ldrb   r3, [rSELF, #offThread_breakFlags]
19804    adrl   lr, dvmAsmInstructionStart + (212 * 64)
19805    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19806    cmp    r3, #0
19807    bxeq   lr                   @ nothing to do - jump to real handler
19808    EXPORT_PC()
19809    mov    r0, rPC              @ arg0
19810    mov    r1, rFP              @ arg1
19811    mov    r2, rSELF            @ arg2
19812    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19813
19814/* ------------------------------ */
19815    .balign 64
19816.L_ALT_OP_AND_INT_LIT16: /* 0xd5 */
19817/* File: armv5te/alt_stub.S */
19818/*
19819 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19820 * any interesting requests and then jump to the real instruction
19821 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19822 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19823 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19824 * bail to the real handler if breakFlags==0.
19825 */
19826    ldrb   r3, [rSELF, #offThread_breakFlags]
19827    adrl   lr, dvmAsmInstructionStart + (213 * 64)
19828    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19829    cmp    r3, #0
19830    bxeq   lr                   @ nothing to do - jump to real handler
19831    EXPORT_PC()
19832    mov    r0, rPC              @ arg0
19833    mov    r1, rFP              @ arg1
19834    mov    r2, rSELF            @ arg2
19835    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19836
19837/* ------------------------------ */
19838    .balign 64
19839.L_ALT_OP_OR_INT_LIT16: /* 0xd6 */
19840/* File: armv5te/alt_stub.S */
19841/*
19842 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19843 * any interesting requests and then jump to the real instruction
19844 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19845 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19846 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19847 * bail to the real handler if breakFlags==0.
19848 */
19849    ldrb   r3, [rSELF, #offThread_breakFlags]
19850    adrl   lr, dvmAsmInstructionStart + (214 * 64)
19851    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19852    cmp    r3, #0
19853    bxeq   lr                   @ nothing to do - jump to real handler
19854    EXPORT_PC()
19855    mov    r0, rPC              @ arg0
19856    mov    r1, rFP              @ arg1
19857    mov    r2, rSELF            @ arg2
19858    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19859
19860/* ------------------------------ */
19861    .balign 64
19862.L_ALT_OP_XOR_INT_LIT16: /* 0xd7 */
19863/* File: armv5te/alt_stub.S */
19864/*
19865 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19866 * any interesting requests and then jump to the real instruction
19867 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19868 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19869 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19870 * bail to the real handler if breakFlags==0.
19871 */
19872    ldrb   r3, [rSELF, #offThread_breakFlags]
19873    adrl   lr, dvmAsmInstructionStart + (215 * 64)
19874    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19875    cmp    r3, #0
19876    bxeq   lr                   @ nothing to do - jump to real handler
19877    EXPORT_PC()
19878    mov    r0, rPC              @ arg0
19879    mov    r1, rFP              @ arg1
19880    mov    r2, rSELF            @ arg2
19881    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19882
19883/* ------------------------------ */
19884    .balign 64
19885.L_ALT_OP_ADD_INT_LIT8: /* 0xd8 */
19886/* File: armv5te/alt_stub.S */
19887/*
19888 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19889 * any interesting requests and then jump to the real instruction
19890 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19891 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19892 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19893 * bail to the real handler if breakFlags==0.
19894 */
19895    ldrb   r3, [rSELF, #offThread_breakFlags]
19896    adrl   lr, dvmAsmInstructionStart + (216 * 64)
19897    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19898    cmp    r3, #0
19899    bxeq   lr                   @ nothing to do - jump to real handler
19900    EXPORT_PC()
19901    mov    r0, rPC              @ arg0
19902    mov    r1, rFP              @ arg1
19903    mov    r2, rSELF            @ arg2
19904    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19905
19906/* ------------------------------ */
19907    .balign 64
19908.L_ALT_OP_RSUB_INT_LIT8: /* 0xd9 */
19909/* File: armv5te/alt_stub.S */
19910/*
19911 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19912 * any interesting requests and then jump to the real instruction
19913 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19914 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19915 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19916 * bail to the real handler if breakFlags==0.
19917 */
19918    ldrb   r3, [rSELF, #offThread_breakFlags]
19919    adrl   lr, dvmAsmInstructionStart + (217 * 64)
19920    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19921    cmp    r3, #0
19922    bxeq   lr                   @ nothing to do - jump to real handler
19923    EXPORT_PC()
19924    mov    r0, rPC              @ arg0
19925    mov    r1, rFP              @ arg1
19926    mov    r2, rSELF            @ arg2
19927    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19928
19929/* ------------------------------ */
19930    .balign 64
19931.L_ALT_OP_MUL_INT_LIT8: /* 0xda */
19932/* File: armv5te/alt_stub.S */
19933/*
19934 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19935 * any interesting requests and then jump to the real instruction
19936 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19937 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19938 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19939 * bail to the real handler if breakFlags==0.
19940 */
19941    ldrb   r3, [rSELF, #offThread_breakFlags]
19942    adrl   lr, dvmAsmInstructionStart + (218 * 64)
19943    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19944    cmp    r3, #0
19945    bxeq   lr                   @ nothing to do - jump to real handler
19946    EXPORT_PC()
19947    mov    r0, rPC              @ arg0
19948    mov    r1, rFP              @ arg1
19949    mov    r2, rSELF            @ arg2
19950    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19951
19952/* ------------------------------ */
19953    .balign 64
19954.L_ALT_OP_DIV_INT_LIT8: /* 0xdb */
19955/* File: armv5te/alt_stub.S */
19956/*
19957 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19958 * any interesting requests and then jump to the real instruction
19959 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19960 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19961 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19962 * bail to the real handler if breakFlags==0.
19963 */
19964    ldrb   r3, [rSELF, #offThread_breakFlags]
19965    adrl   lr, dvmAsmInstructionStart + (219 * 64)
19966    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19967    cmp    r3, #0
19968    bxeq   lr                   @ nothing to do - jump to real handler
19969    EXPORT_PC()
19970    mov    r0, rPC              @ arg0
19971    mov    r1, rFP              @ arg1
19972    mov    r2, rSELF            @ arg2
19973    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19974
19975/* ------------------------------ */
19976    .balign 64
19977.L_ALT_OP_REM_INT_LIT8: /* 0xdc */
19978/* File: armv5te/alt_stub.S */
19979/*
19980 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19981 * any interesting requests and then jump to the real instruction
19982 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19983 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19984 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19985 * bail to the real handler if breakFlags==0.
19986 */
19987    ldrb   r3, [rSELF, #offThread_breakFlags]
19988    adrl   lr, dvmAsmInstructionStart + (220 * 64)
19989    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19990    cmp    r3, #0
19991    bxeq   lr                   @ nothing to do - jump to real handler
19992    EXPORT_PC()
19993    mov    r0, rPC              @ arg0
19994    mov    r1, rFP              @ arg1
19995    mov    r2, rSELF            @ arg2
19996    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19997
19998/* ------------------------------ */
19999    .balign 64
20000.L_ALT_OP_AND_INT_LIT8: /* 0xdd */
20001/* File: armv5te/alt_stub.S */
20002/*
20003 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20004 * any interesting requests and then jump to the real instruction
20005 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20006 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20007 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20008 * bail to the real handler if breakFlags==0.
20009 */
20010    ldrb   r3, [rSELF, #offThread_breakFlags]
20011    adrl   lr, dvmAsmInstructionStart + (221 * 64)
20012    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20013    cmp    r3, #0
20014    bxeq   lr                   @ nothing to do - jump to real handler
20015    EXPORT_PC()
20016    mov    r0, rPC              @ arg0
20017    mov    r1, rFP              @ arg1
20018    mov    r2, rSELF            @ arg2
20019    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20020
20021/* ------------------------------ */
20022    .balign 64
20023.L_ALT_OP_OR_INT_LIT8: /* 0xde */
20024/* File: armv5te/alt_stub.S */
20025/*
20026 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20027 * any interesting requests and then jump to the real instruction
20028 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20029 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20030 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20031 * bail to the real handler if breakFlags==0.
20032 */
20033    ldrb   r3, [rSELF, #offThread_breakFlags]
20034    adrl   lr, dvmAsmInstructionStart + (222 * 64)
20035    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20036    cmp    r3, #0
20037    bxeq   lr                   @ nothing to do - jump to real handler
20038    EXPORT_PC()
20039    mov    r0, rPC              @ arg0
20040    mov    r1, rFP              @ arg1
20041    mov    r2, rSELF            @ arg2
20042    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20043
20044/* ------------------------------ */
20045    .balign 64
20046.L_ALT_OP_XOR_INT_LIT8: /* 0xdf */
20047/* File: armv5te/alt_stub.S */
20048/*
20049 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20050 * any interesting requests and then jump to the real instruction
20051 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20052 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20053 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20054 * bail to the real handler if breakFlags==0.
20055 */
20056    ldrb   r3, [rSELF, #offThread_breakFlags]
20057    adrl   lr, dvmAsmInstructionStart + (223 * 64)
20058    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20059    cmp    r3, #0
20060    bxeq   lr                   @ nothing to do - jump to real handler
20061    EXPORT_PC()
20062    mov    r0, rPC              @ arg0
20063    mov    r1, rFP              @ arg1
20064    mov    r2, rSELF            @ arg2
20065    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20066
20067/* ------------------------------ */
20068    .balign 64
20069.L_ALT_OP_SHL_INT_LIT8: /* 0xe0 */
20070/* File: armv5te/alt_stub.S */
20071/*
20072 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20073 * any interesting requests and then jump to the real instruction
20074 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20075 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20076 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20077 * bail to the real handler if breakFlags==0.
20078 */
20079    ldrb   r3, [rSELF, #offThread_breakFlags]
20080    adrl   lr, dvmAsmInstructionStart + (224 * 64)
20081    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20082    cmp    r3, #0
20083    bxeq   lr                   @ nothing to do - jump to real handler
20084    EXPORT_PC()
20085    mov    r0, rPC              @ arg0
20086    mov    r1, rFP              @ arg1
20087    mov    r2, rSELF            @ arg2
20088    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20089
20090/* ------------------------------ */
20091    .balign 64
20092.L_ALT_OP_SHR_INT_LIT8: /* 0xe1 */
20093/* File: armv5te/alt_stub.S */
20094/*
20095 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20096 * any interesting requests and then jump to the real instruction
20097 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20098 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20099 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20100 * bail to the real handler if breakFlags==0.
20101 */
20102    ldrb   r3, [rSELF, #offThread_breakFlags]
20103    adrl   lr, dvmAsmInstructionStart + (225 * 64)
20104    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20105    cmp    r3, #0
20106    bxeq   lr                   @ nothing to do - jump to real handler
20107    EXPORT_PC()
20108    mov    r0, rPC              @ arg0
20109    mov    r1, rFP              @ arg1
20110    mov    r2, rSELF            @ arg2
20111    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20112
20113/* ------------------------------ */
20114    .balign 64
20115.L_ALT_OP_USHR_INT_LIT8: /* 0xe2 */
20116/* File: armv5te/alt_stub.S */
20117/*
20118 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20119 * any interesting requests and then jump to the real instruction
20120 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20121 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20122 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20123 * bail to the real handler if breakFlags==0.
20124 */
20125    ldrb   r3, [rSELF, #offThread_breakFlags]
20126    adrl   lr, dvmAsmInstructionStart + (226 * 64)
20127    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20128    cmp    r3, #0
20129    bxeq   lr                   @ nothing to do - jump to real handler
20130    EXPORT_PC()
20131    mov    r0, rPC              @ arg0
20132    mov    r1, rFP              @ arg1
20133    mov    r2, rSELF            @ arg2
20134    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20135
20136/* ------------------------------ */
20137    .balign 64
20138.L_ALT_OP_IGET_VOLATILE: /* 0xe3 */
20139/* File: armv5te/alt_stub.S */
20140/*
20141 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20142 * any interesting requests and then jump to the real instruction
20143 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20144 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20145 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20146 * bail to the real handler if breakFlags==0.
20147 */
20148    ldrb   r3, [rSELF, #offThread_breakFlags]
20149    adrl   lr, dvmAsmInstructionStart + (227 * 64)
20150    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20151    cmp    r3, #0
20152    bxeq   lr                   @ nothing to do - jump to real handler
20153    EXPORT_PC()
20154    mov    r0, rPC              @ arg0
20155    mov    r1, rFP              @ arg1
20156    mov    r2, rSELF            @ arg2
20157    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20158
20159/* ------------------------------ */
20160    .balign 64
20161.L_ALT_OP_IPUT_VOLATILE: /* 0xe4 */
20162/* File: armv5te/alt_stub.S */
20163/*
20164 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20165 * any interesting requests and then jump to the real instruction
20166 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20167 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20168 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20169 * bail to the real handler if breakFlags==0.
20170 */
20171    ldrb   r3, [rSELF, #offThread_breakFlags]
20172    adrl   lr, dvmAsmInstructionStart + (228 * 64)
20173    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20174    cmp    r3, #0
20175    bxeq   lr                   @ nothing to do - jump to real handler
20176    EXPORT_PC()
20177    mov    r0, rPC              @ arg0
20178    mov    r1, rFP              @ arg1
20179    mov    r2, rSELF            @ arg2
20180    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20181
20182/* ------------------------------ */
20183    .balign 64
20184.L_ALT_OP_SGET_VOLATILE: /* 0xe5 */
20185/* File: armv5te/alt_stub.S */
20186/*
20187 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20188 * any interesting requests and then jump to the real instruction
20189 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20190 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20191 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20192 * bail to the real handler if breakFlags==0.
20193 */
20194    ldrb   r3, [rSELF, #offThread_breakFlags]
20195    adrl   lr, dvmAsmInstructionStart + (229 * 64)
20196    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20197    cmp    r3, #0
20198    bxeq   lr                   @ nothing to do - jump to real handler
20199    EXPORT_PC()
20200    mov    r0, rPC              @ arg0
20201    mov    r1, rFP              @ arg1
20202    mov    r2, rSELF            @ arg2
20203    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20204
20205/* ------------------------------ */
20206    .balign 64
20207.L_ALT_OP_SPUT_VOLATILE: /* 0xe6 */
20208/* File: armv5te/alt_stub.S */
20209/*
20210 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20211 * any interesting requests and then jump to the real instruction
20212 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20213 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20214 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20215 * bail to the real handler if breakFlags==0.
20216 */
20217    ldrb   r3, [rSELF, #offThread_breakFlags]
20218    adrl   lr, dvmAsmInstructionStart + (230 * 64)
20219    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20220    cmp    r3, #0
20221    bxeq   lr                   @ nothing to do - jump to real handler
20222    EXPORT_PC()
20223    mov    r0, rPC              @ arg0
20224    mov    r1, rFP              @ arg1
20225    mov    r2, rSELF            @ arg2
20226    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20227
20228/* ------------------------------ */
20229    .balign 64
20230.L_ALT_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
20231/* File: armv5te/alt_stub.S */
20232/*
20233 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20234 * any interesting requests and then jump to the real instruction
20235 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20236 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20237 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20238 * bail to the real handler if breakFlags==0.
20239 */
20240    ldrb   r3, [rSELF, #offThread_breakFlags]
20241    adrl   lr, dvmAsmInstructionStart + (231 * 64)
20242    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20243    cmp    r3, #0
20244    bxeq   lr                   @ nothing to do - jump to real handler
20245    EXPORT_PC()
20246    mov    r0, rPC              @ arg0
20247    mov    r1, rFP              @ arg1
20248    mov    r2, rSELF            @ arg2
20249    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20250
20251/* ------------------------------ */
20252    .balign 64
20253.L_ALT_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
20254/* File: armv5te/alt_stub.S */
20255/*
20256 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20257 * any interesting requests and then jump to the real instruction
20258 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20259 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20260 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20261 * bail to the real handler if breakFlags==0.
20262 */
20263    ldrb   r3, [rSELF, #offThread_breakFlags]
20264    adrl   lr, dvmAsmInstructionStart + (232 * 64)
20265    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20266    cmp    r3, #0
20267    bxeq   lr                   @ nothing to do - jump to real handler
20268    EXPORT_PC()
20269    mov    r0, rPC              @ arg0
20270    mov    r1, rFP              @ arg1
20271    mov    r2, rSELF            @ arg2
20272    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20273
20274/* ------------------------------ */
20275    .balign 64
20276.L_ALT_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
20277/* File: armv5te/alt_stub.S */
20278/*
20279 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20280 * any interesting requests and then jump to the real instruction
20281 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20282 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20283 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20284 * bail to the real handler if breakFlags==0.
20285 */
20286    ldrb   r3, [rSELF, #offThread_breakFlags]
20287    adrl   lr, dvmAsmInstructionStart + (233 * 64)
20288    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20289    cmp    r3, #0
20290    bxeq   lr                   @ nothing to do - jump to real handler
20291    EXPORT_PC()
20292    mov    r0, rPC              @ arg0
20293    mov    r1, rFP              @ arg1
20294    mov    r2, rSELF            @ arg2
20295    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20296
20297/* ------------------------------ */
20298    .balign 64
20299.L_ALT_OP_SGET_WIDE_VOLATILE: /* 0xea */
20300/* File: armv5te/alt_stub.S */
20301/*
20302 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20303 * any interesting requests and then jump to the real instruction
20304 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20305 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20306 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20307 * bail to the real handler if breakFlags==0.
20308 */
20309    ldrb   r3, [rSELF, #offThread_breakFlags]
20310    adrl   lr, dvmAsmInstructionStart + (234 * 64)
20311    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20312    cmp    r3, #0
20313    bxeq   lr                   @ nothing to do - jump to real handler
20314    EXPORT_PC()
20315    mov    r0, rPC              @ arg0
20316    mov    r1, rFP              @ arg1
20317    mov    r2, rSELF            @ arg2
20318    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20319
20320/* ------------------------------ */
20321    .balign 64
20322.L_ALT_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
20323/* File: armv5te/alt_stub.S */
20324/*
20325 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20326 * any interesting requests and then jump to the real instruction
20327 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20328 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20329 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20330 * bail to the real handler if breakFlags==0.
20331 */
20332    ldrb   r3, [rSELF, #offThread_breakFlags]
20333    adrl   lr, dvmAsmInstructionStart + (235 * 64)
20334    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20335    cmp    r3, #0
20336    bxeq   lr                   @ nothing to do - jump to real handler
20337    EXPORT_PC()
20338    mov    r0, rPC              @ arg0
20339    mov    r1, rFP              @ arg1
20340    mov    r2, rSELF            @ arg2
20341    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20342
20343/* ------------------------------ */
20344    .balign 64
20345.L_ALT_OP_BREAKPOINT: /* 0xec */
20346/* File: armv5te/alt_stub.S */
20347/*
20348 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20349 * any interesting requests and then jump to the real instruction
20350 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20351 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20352 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20353 * bail to the real handler if breakFlags==0.
20354 */
20355    ldrb   r3, [rSELF, #offThread_breakFlags]
20356    adrl   lr, dvmAsmInstructionStart + (236 * 64)
20357    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20358    cmp    r3, #0
20359    bxeq   lr                   @ nothing to do - jump to real handler
20360    EXPORT_PC()
20361    mov    r0, rPC              @ arg0
20362    mov    r1, rFP              @ arg1
20363    mov    r2, rSELF            @ arg2
20364    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20365
20366/* ------------------------------ */
20367    .balign 64
20368.L_ALT_OP_THROW_VERIFICATION_ERROR: /* 0xed */
20369/* File: armv5te/alt_stub.S */
20370/*
20371 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20372 * any interesting requests and then jump to the real instruction
20373 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20374 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20375 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20376 * bail to the real handler if breakFlags==0.
20377 */
20378    ldrb   r3, [rSELF, #offThread_breakFlags]
20379    adrl   lr, dvmAsmInstructionStart + (237 * 64)
20380    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20381    cmp    r3, #0
20382    bxeq   lr                   @ nothing to do - jump to real handler
20383    EXPORT_PC()
20384    mov    r0, rPC              @ arg0
20385    mov    r1, rFP              @ arg1
20386    mov    r2, rSELF            @ arg2
20387    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20388
20389/* ------------------------------ */
20390    .balign 64
20391.L_ALT_OP_EXECUTE_INLINE: /* 0xee */
20392/* File: armv5te/alt_stub.S */
20393/*
20394 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20395 * any interesting requests and then jump to the real instruction
20396 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20397 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20398 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20399 * bail to the real handler if breakFlags==0.
20400 */
20401    ldrb   r3, [rSELF, #offThread_breakFlags]
20402    adrl   lr, dvmAsmInstructionStart + (238 * 64)
20403    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20404    cmp    r3, #0
20405    bxeq   lr                   @ nothing to do - jump to real handler
20406    EXPORT_PC()
20407    mov    r0, rPC              @ arg0
20408    mov    r1, rFP              @ arg1
20409    mov    r2, rSELF            @ arg2
20410    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20411
20412/* ------------------------------ */
20413    .balign 64
20414.L_ALT_OP_EXECUTE_INLINE_RANGE: /* 0xef */
20415/* File: armv5te/alt_stub.S */
20416/*
20417 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20418 * any interesting requests and then jump to the real instruction
20419 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20420 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20421 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20422 * bail to the real handler if breakFlags==0.
20423 */
20424    ldrb   r3, [rSELF, #offThread_breakFlags]
20425    adrl   lr, dvmAsmInstructionStart + (239 * 64)
20426    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20427    cmp    r3, #0
20428    bxeq   lr                   @ nothing to do - jump to real handler
20429    EXPORT_PC()
20430    mov    r0, rPC              @ arg0
20431    mov    r1, rFP              @ arg1
20432    mov    r2, rSELF            @ arg2
20433    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20434
20435/* ------------------------------ */
20436    .balign 64
20437.L_ALT_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
20438/* File: armv5te/alt_stub.S */
20439/*
20440 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20441 * any interesting requests and then jump to the real instruction
20442 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20443 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20444 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20445 * bail to the real handler if breakFlags==0.
20446 */
20447    ldrb   r3, [rSELF, #offThread_breakFlags]
20448    adrl   lr, dvmAsmInstructionStart + (240 * 64)
20449    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20450    cmp    r3, #0
20451    bxeq   lr                   @ nothing to do - jump to real handler
20452    EXPORT_PC()
20453    mov    r0, rPC              @ arg0
20454    mov    r1, rFP              @ arg1
20455    mov    r2, rSELF            @ arg2
20456    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20457
20458/* ------------------------------ */
20459    .balign 64
20460.L_ALT_OP_RETURN_VOID_BARRIER: /* 0xf1 */
20461/* File: armv5te/alt_stub.S */
20462/*
20463 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20464 * any interesting requests and then jump to the real instruction
20465 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20466 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20467 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20468 * bail to the real handler if breakFlags==0.
20469 */
20470    ldrb   r3, [rSELF, #offThread_breakFlags]
20471    adrl   lr, dvmAsmInstructionStart + (241 * 64)
20472    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20473    cmp    r3, #0
20474    bxeq   lr                   @ nothing to do - jump to real handler
20475    EXPORT_PC()
20476    mov    r0, rPC              @ arg0
20477    mov    r1, rFP              @ arg1
20478    mov    r2, rSELF            @ arg2
20479    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20480
20481/* ------------------------------ */
20482    .balign 64
20483.L_ALT_OP_IGET_QUICK: /* 0xf2 */
20484/* File: armv5te/alt_stub.S */
20485/*
20486 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20487 * any interesting requests and then jump to the real instruction
20488 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20489 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20490 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20491 * bail to the real handler if breakFlags==0.
20492 */
20493    ldrb   r3, [rSELF, #offThread_breakFlags]
20494    adrl   lr, dvmAsmInstructionStart + (242 * 64)
20495    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20496    cmp    r3, #0
20497    bxeq   lr                   @ nothing to do - jump to real handler
20498    EXPORT_PC()
20499    mov    r0, rPC              @ arg0
20500    mov    r1, rFP              @ arg1
20501    mov    r2, rSELF            @ arg2
20502    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20503
20504/* ------------------------------ */
20505    .balign 64
20506.L_ALT_OP_IGET_WIDE_QUICK: /* 0xf3 */
20507/* File: armv5te/alt_stub.S */
20508/*
20509 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20510 * any interesting requests and then jump to the real instruction
20511 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20512 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20513 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20514 * bail to the real handler if breakFlags==0.
20515 */
20516    ldrb   r3, [rSELF, #offThread_breakFlags]
20517    adrl   lr, dvmAsmInstructionStart + (243 * 64)
20518    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20519    cmp    r3, #0
20520    bxeq   lr                   @ nothing to do - jump to real handler
20521    EXPORT_PC()
20522    mov    r0, rPC              @ arg0
20523    mov    r1, rFP              @ arg1
20524    mov    r2, rSELF            @ arg2
20525    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20526
20527/* ------------------------------ */
20528    .balign 64
20529.L_ALT_OP_IGET_OBJECT_QUICK: /* 0xf4 */
20530/* File: armv5te/alt_stub.S */
20531/*
20532 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20533 * any interesting requests and then jump to the real instruction
20534 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20535 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20536 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20537 * bail to the real handler if breakFlags==0.
20538 */
20539    ldrb   r3, [rSELF, #offThread_breakFlags]
20540    adrl   lr, dvmAsmInstructionStart + (244 * 64)
20541    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20542    cmp    r3, #0
20543    bxeq   lr                   @ nothing to do - jump to real handler
20544    EXPORT_PC()
20545    mov    r0, rPC              @ arg0
20546    mov    r1, rFP              @ arg1
20547    mov    r2, rSELF            @ arg2
20548    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20549
20550/* ------------------------------ */
20551    .balign 64
20552.L_ALT_OP_IPUT_QUICK: /* 0xf5 */
20553/* File: armv5te/alt_stub.S */
20554/*
20555 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20556 * any interesting requests and then jump to the real instruction
20557 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20558 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20559 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20560 * bail to the real handler if breakFlags==0.
20561 */
20562    ldrb   r3, [rSELF, #offThread_breakFlags]
20563    adrl   lr, dvmAsmInstructionStart + (245 * 64)
20564    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20565    cmp    r3, #0
20566    bxeq   lr                   @ nothing to do - jump to real handler
20567    EXPORT_PC()
20568    mov    r0, rPC              @ arg0
20569    mov    r1, rFP              @ arg1
20570    mov    r2, rSELF            @ arg2
20571    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20572
20573/* ------------------------------ */
20574    .balign 64
20575.L_ALT_OP_IPUT_WIDE_QUICK: /* 0xf6 */
20576/* File: armv5te/alt_stub.S */
20577/*
20578 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20579 * any interesting requests and then jump to the real instruction
20580 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20581 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20582 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20583 * bail to the real handler if breakFlags==0.
20584 */
20585    ldrb   r3, [rSELF, #offThread_breakFlags]
20586    adrl   lr, dvmAsmInstructionStart + (246 * 64)
20587    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20588    cmp    r3, #0
20589    bxeq   lr                   @ nothing to do - jump to real handler
20590    EXPORT_PC()
20591    mov    r0, rPC              @ arg0
20592    mov    r1, rFP              @ arg1
20593    mov    r2, rSELF            @ arg2
20594    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20595
20596/* ------------------------------ */
20597    .balign 64
20598.L_ALT_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
20599/* File: armv5te/alt_stub.S */
20600/*
20601 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20602 * any interesting requests and then jump to the real instruction
20603 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20604 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20605 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20606 * bail to the real handler if breakFlags==0.
20607 */
20608    ldrb   r3, [rSELF, #offThread_breakFlags]
20609    adrl   lr, dvmAsmInstructionStart + (247 * 64)
20610    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20611    cmp    r3, #0
20612    bxeq   lr                   @ nothing to do - jump to real handler
20613    EXPORT_PC()
20614    mov    r0, rPC              @ arg0
20615    mov    r1, rFP              @ arg1
20616    mov    r2, rSELF            @ arg2
20617    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20618
20619/* ------------------------------ */
20620    .balign 64
20621.L_ALT_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
20622/* File: armv5te/alt_stub.S */
20623/*
20624 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20625 * any interesting requests and then jump to the real instruction
20626 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20627 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20628 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20629 * bail to the real handler if breakFlags==0.
20630 */
20631    ldrb   r3, [rSELF, #offThread_breakFlags]
20632    adrl   lr, dvmAsmInstructionStart + (248 * 64)
20633    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20634    cmp    r3, #0
20635    bxeq   lr                   @ nothing to do - jump to real handler
20636    EXPORT_PC()
20637    mov    r0, rPC              @ arg0
20638    mov    r1, rFP              @ arg1
20639    mov    r2, rSELF            @ arg2
20640    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20641
20642/* ------------------------------ */
20643    .balign 64
20644.L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
20645/* File: armv5te/alt_stub.S */
20646/*
20647 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20648 * any interesting requests and then jump to the real instruction
20649 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20650 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20651 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20652 * bail to the real handler if breakFlags==0.
20653 */
20654    ldrb   r3, [rSELF, #offThread_breakFlags]
20655    adrl   lr, dvmAsmInstructionStart + (249 * 64)
20656    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20657    cmp    r3, #0
20658    bxeq   lr                   @ nothing to do - jump to real handler
20659    EXPORT_PC()
20660    mov    r0, rPC              @ arg0
20661    mov    r1, rFP              @ arg1
20662    mov    r2, rSELF            @ arg2
20663    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20664
20665/* ------------------------------ */
20666    .balign 64
20667.L_ALT_OP_INVOKE_SUPER_QUICK: /* 0xfa */
20668/* File: armv5te/alt_stub.S */
20669/*
20670 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20671 * any interesting requests and then jump to the real instruction
20672 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20673 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20674 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20675 * bail to the real handler if breakFlags==0.
20676 */
20677    ldrb   r3, [rSELF, #offThread_breakFlags]
20678    adrl   lr, dvmAsmInstructionStart + (250 * 64)
20679    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20680    cmp    r3, #0
20681    bxeq   lr                   @ nothing to do - jump to real handler
20682    EXPORT_PC()
20683    mov    r0, rPC              @ arg0
20684    mov    r1, rFP              @ arg1
20685    mov    r2, rSELF            @ arg2
20686    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20687
20688/* ------------------------------ */
20689    .balign 64
20690.L_ALT_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
20691/* File: armv5te/alt_stub.S */
20692/*
20693 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20694 * any interesting requests and then jump to the real instruction
20695 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20696 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20697 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20698 * bail to the real handler if breakFlags==0.
20699 */
20700    ldrb   r3, [rSELF, #offThread_breakFlags]
20701    adrl   lr, dvmAsmInstructionStart + (251 * 64)
20702    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20703    cmp    r3, #0
20704    bxeq   lr                   @ nothing to do - jump to real handler
20705    EXPORT_PC()
20706    mov    r0, rPC              @ arg0
20707    mov    r1, rFP              @ arg1
20708    mov    r2, rSELF            @ arg2
20709    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20710
20711/* ------------------------------ */
20712    .balign 64
20713.L_ALT_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
20714/* File: armv5te/alt_stub.S */
20715/*
20716 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20717 * any interesting requests and then jump to the real instruction
20718 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20719 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20720 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20721 * bail to the real handler if breakFlags==0.
20722 */
20723    ldrb   r3, [rSELF, #offThread_breakFlags]
20724    adrl   lr, dvmAsmInstructionStart + (252 * 64)
20725    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20726    cmp    r3, #0
20727    bxeq   lr                   @ nothing to do - jump to real handler
20728    EXPORT_PC()
20729    mov    r0, rPC              @ arg0
20730    mov    r1, rFP              @ arg1
20731    mov    r2, rSELF            @ arg2
20732    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20733
20734/* ------------------------------ */
20735    .balign 64
20736.L_ALT_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
20737/* File: armv5te/alt_stub.S */
20738/*
20739 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20740 * any interesting requests and then jump to the real instruction
20741 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20742 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20743 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20744 * bail to the real handler if breakFlags==0.
20745 */
20746    ldrb   r3, [rSELF, #offThread_breakFlags]
20747    adrl   lr, dvmAsmInstructionStart + (253 * 64)
20748    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20749    cmp    r3, #0
20750    bxeq   lr                   @ nothing to do - jump to real handler
20751    EXPORT_PC()
20752    mov    r0, rPC              @ arg0
20753    mov    r1, rFP              @ arg1
20754    mov    r2, rSELF            @ arg2
20755    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20756
20757/* ------------------------------ */
20758    .balign 64
20759.L_ALT_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
20760/* File: armv5te/alt_stub.S */
20761/*
20762 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20763 * any interesting requests and then jump to the real instruction
20764 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20765 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20766 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20767 * bail to the real handler if breakFlags==0.
20768 */
20769    ldrb   r3, [rSELF, #offThread_breakFlags]
20770    adrl   lr, dvmAsmInstructionStart + (254 * 64)
20771    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20772    cmp    r3, #0
20773    bxeq   lr                   @ nothing to do - jump to real handler
20774    EXPORT_PC()
20775    mov    r0, rPC              @ arg0
20776    mov    r1, rFP              @ arg1
20777    mov    r2, rSELF            @ arg2
20778    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20779
20780/* ------------------------------ */
20781    .balign 64
20782.L_ALT_OP_DISPATCH_FF: /* 0xff */
20783/* File: armv5te/ALT_OP_DISPATCH_FF.S */
20784/*
20785 * Unlike other alt stubs, we don't want to call dvmCheckBefore() here.
20786 * Instead, just treat this as a trampoline to reach the real alt
20787 * handler (which will do the dvmCheckBefore() call.
20788 */
20789    mov     ip, rINST, lsr #8           @ ip<- extended opcode
20790    add     ip, ip, #256                @ add offset for extended opcodes
20791    GOTO_OPCODE(ip)                     @ go to proper extended handler
20792
20793
20794/* ------------------------------ */
20795    .balign 64
20796.L_ALT_OP_CONST_CLASS_JUMBO: /* 0x100 */
20797/* File: armv5te/alt_stub.S */
20798/*
20799 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20800 * any interesting requests and then jump to the real instruction
20801 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20802 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20803 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20804 * bail to the real handler if breakFlags==0.
20805 */
20806    ldrb   r3, [rSELF, #offThread_breakFlags]
20807    adrl   lr, dvmAsmInstructionStart + (256 * 64)
20808    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20809    cmp    r3, #0
20810    bxeq   lr                   @ nothing to do - jump to real handler
20811    EXPORT_PC()
20812    mov    r0, rPC              @ arg0
20813    mov    r1, rFP              @ arg1
20814    mov    r2, rSELF            @ arg2
20815    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20816
20817/* ------------------------------ */
20818    .balign 64
20819.L_ALT_OP_CHECK_CAST_JUMBO: /* 0x101 */
20820/* File: armv5te/alt_stub.S */
20821/*
20822 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20823 * any interesting requests and then jump to the real instruction
20824 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20825 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20826 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20827 * bail to the real handler if breakFlags==0.
20828 */
20829    ldrb   r3, [rSELF, #offThread_breakFlags]
20830    adrl   lr, dvmAsmInstructionStart + (257 * 64)
20831    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20832    cmp    r3, #0
20833    bxeq   lr                   @ nothing to do - jump to real handler
20834    EXPORT_PC()
20835    mov    r0, rPC              @ arg0
20836    mov    r1, rFP              @ arg1
20837    mov    r2, rSELF            @ arg2
20838    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20839
20840/* ------------------------------ */
20841    .balign 64
20842.L_ALT_OP_INSTANCE_OF_JUMBO: /* 0x102 */
20843/* File: armv5te/alt_stub.S */
20844/*
20845 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20846 * any interesting requests and then jump to the real instruction
20847 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20848 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20849 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20850 * bail to the real handler if breakFlags==0.
20851 */
20852    ldrb   r3, [rSELF, #offThread_breakFlags]
20853    adrl   lr, dvmAsmInstructionStart + (258 * 64)
20854    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20855    cmp    r3, #0
20856    bxeq   lr                   @ nothing to do - jump to real handler
20857    EXPORT_PC()
20858    mov    r0, rPC              @ arg0
20859    mov    r1, rFP              @ arg1
20860    mov    r2, rSELF            @ arg2
20861    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20862
20863/* ------------------------------ */
20864    .balign 64
20865.L_ALT_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
20866/* File: armv5te/alt_stub.S */
20867/*
20868 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20869 * any interesting requests and then jump to the real instruction
20870 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20871 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20872 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20873 * bail to the real handler if breakFlags==0.
20874 */
20875    ldrb   r3, [rSELF, #offThread_breakFlags]
20876    adrl   lr, dvmAsmInstructionStart + (259 * 64)
20877    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20878    cmp    r3, #0
20879    bxeq   lr                   @ nothing to do - jump to real handler
20880    EXPORT_PC()
20881    mov    r0, rPC              @ arg0
20882    mov    r1, rFP              @ arg1
20883    mov    r2, rSELF            @ arg2
20884    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20885
20886/* ------------------------------ */
20887    .balign 64
20888.L_ALT_OP_NEW_ARRAY_JUMBO: /* 0x104 */
20889/* File: armv5te/alt_stub.S */
20890/*
20891 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20892 * any interesting requests and then jump to the real instruction
20893 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20894 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20895 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20896 * bail to the real handler if breakFlags==0.
20897 */
20898    ldrb   r3, [rSELF, #offThread_breakFlags]
20899    adrl   lr, dvmAsmInstructionStart + (260 * 64)
20900    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20901    cmp    r3, #0
20902    bxeq   lr                   @ nothing to do - jump to real handler
20903    EXPORT_PC()
20904    mov    r0, rPC              @ arg0
20905    mov    r1, rFP              @ arg1
20906    mov    r2, rSELF            @ arg2
20907    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20908
20909/* ------------------------------ */
20910    .balign 64
20911.L_ALT_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
20912/* File: armv5te/alt_stub.S */
20913/*
20914 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20915 * any interesting requests and then jump to the real instruction
20916 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20917 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20918 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20919 * bail to the real handler if breakFlags==0.
20920 */
20921    ldrb   r3, [rSELF, #offThread_breakFlags]
20922    adrl   lr, dvmAsmInstructionStart + (261 * 64)
20923    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20924    cmp    r3, #0
20925    bxeq   lr                   @ nothing to do - jump to real handler
20926    EXPORT_PC()
20927    mov    r0, rPC              @ arg0
20928    mov    r1, rFP              @ arg1
20929    mov    r2, rSELF            @ arg2
20930    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20931
20932/* ------------------------------ */
20933    .balign 64
20934.L_ALT_OP_IGET_JUMBO: /* 0x106 */
20935/* File: armv5te/alt_stub.S */
20936/*
20937 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20938 * any interesting requests and then jump to the real instruction
20939 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20940 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20941 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20942 * bail to the real handler if breakFlags==0.
20943 */
20944    ldrb   r3, [rSELF, #offThread_breakFlags]
20945    adrl   lr, dvmAsmInstructionStart + (262 * 64)
20946    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20947    cmp    r3, #0
20948    bxeq   lr                   @ nothing to do - jump to real handler
20949    EXPORT_PC()
20950    mov    r0, rPC              @ arg0
20951    mov    r1, rFP              @ arg1
20952    mov    r2, rSELF            @ arg2
20953    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20954
20955/* ------------------------------ */
20956    .balign 64
20957.L_ALT_OP_IGET_WIDE_JUMBO: /* 0x107 */
20958/* File: armv5te/alt_stub.S */
20959/*
20960 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20961 * any interesting requests and then jump to the real instruction
20962 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20963 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20964 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20965 * bail to the real handler if breakFlags==0.
20966 */
20967    ldrb   r3, [rSELF, #offThread_breakFlags]
20968    adrl   lr, dvmAsmInstructionStart + (263 * 64)
20969    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20970    cmp    r3, #0
20971    bxeq   lr                   @ nothing to do - jump to real handler
20972    EXPORT_PC()
20973    mov    r0, rPC              @ arg0
20974    mov    r1, rFP              @ arg1
20975    mov    r2, rSELF            @ arg2
20976    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20977
20978/* ------------------------------ */
20979    .balign 64
20980.L_ALT_OP_IGET_OBJECT_JUMBO: /* 0x108 */
20981/* File: armv5te/alt_stub.S */
20982/*
20983 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20984 * any interesting requests and then jump to the real instruction
20985 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20986 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20987 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20988 * bail to the real handler if breakFlags==0.
20989 */
20990    ldrb   r3, [rSELF, #offThread_breakFlags]
20991    adrl   lr, dvmAsmInstructionStart + (264 * 64)
20992    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20993    cmp    r3, #0
20994    bxeq   lr                   @ nothing to do - jump to real handler
20995    EXPORT_PC()
20996    mov    r0, rPC              @ arg0
20997    mov    r1, rFP              @ arg1
20998    mov    r2, rSELF            @ arg2
20999    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21000
21001/* ------------------------------ */
21002    .balign 64
21003.L_ALT_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
21004/* File: armv5te/alt_stub.S */
21005/*
21006 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21007 * any interesting requests and then jump to the real instruction
21008 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21009 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21010 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21011 * bail to the real handler if breakFlags==0.
21012 */
21013    ldrb   r3, [rSELF, #offThread_breakFlags]
21014    adrl   lr, dvmAsmInstructionStart + (265 * 64)
21015    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21016    cmp    r3, #0
21017    bxeq   lr                   @ nothing to do - jump to real handler
21018    EXPORT_PC()
21019    mov    r0, rPC              @ arg0
21020    mov    r1, rFP              @ arg1
21021    mov    r2, rSELF            @ arg2
21022    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21023
21024/* ------------------------------ */
21025    .balign 64
21026.L_ALT_OP_IGET_BYTE_JUMBO: /* 0x10a */
21027/* File: armv5te/alt_stub.S */
21028/*
21029 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21030 * any interesting requests and then jump to the real instruction
21031 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21032 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21033 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21034 * bail to the real handler if breakFlags==0.
21035 */
21036    ldrb   r3, [rSELF, #offThread_breakFlags]
21037    adrl   lr, dvmAsmInstructionStart + (266 * 64)
21038    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21039    cmp    r3, #0
21040    bxeq   lr                   @ nothing to do - jump to real handler
21041    EXPORT_PC()
21042    mov    r0, rPC              @ arg0
21043    mov    r1, rFP              @ arg1
21044    mov    r2, rSELF            @ arg2
21045    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21046
21047/* ------------------------------ */
21048    .balign 64
21049.L_ALT_OP_IGET_CHAR_JUMBO: /* 0x10b */
21050/* File: armv5te/alt_stub.S */
21051/*
21052 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21053 * any interesting requests and then jump to the real instruction
21054 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21055 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21056 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21057 * bail to the real handler if breakFlags==0.
21058 */
21059    ldrb   r3, [rSELF, #offThread_breakFlags]
21060    adrl   lr, dvmAsmInstructionStart + (267 * 64)
21061    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21062    cmp    r3, #0
21063    bxeq   lr                   @ nothing to do - jump to real handler
21064    EXPORT_PC()
21065    mov    r0, rPC              @ arg0
21066    mov    r1, rFP              @ arg1
21067    mov    r2, rSELF            @ arg2
21068    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21069
21070/* ------------------------------ */
21071    .balign 64
21072.L_ALT_OP_IGET_SHORT_JUMBO: /* 0x10c */
21073/* File: armv5te/alt_stub.S */
21074/*
21075 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21076 * any interesting requests and then jump to the real instruction
21077 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21078 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21079 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21080 * bail to the real handler if breakFlags==0.
21081 */
21082    ldrb   r3, [rSELF, #offThread_breakFlags]
21083    adrl   lr, dvmAsmInstructionStart + (268 * 64)
21084    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21085    cmp    r3, #0
21086    bxeq   lr                   @ nothing to do - jump to real handler
21087    EXPORT_PC()
21088    mov    r0, rPC              @ arg0
21089    mov    r1, rFP              @ arg1
21090    mov    r2, rSELF            @ arg2
21091    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21092
21093/* ------------------------------ */
21094    .balign 64
21095.L_ALT_OP_IPUT_JUMBO: /* 0x10d */
21096/* File: armv5te/alt_stub.S */
21097/*
21098 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21099 * any interesting requests and then jump to the real instruction
21100 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21101 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21102 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21103 * bail to the real handler if breakFlags==0.
21104 */
21105    ldrb   r3, [rSELF, #offThread_breakFlags]
21106    adrl   lr, dvmAsmInstructionStart + (269 * 64)
21107    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21108    cmp    r3, #0
21109    bxeq   lr                   @ nothing to do - jump to real handler
21110    EXPORT_PC()
21111    mov    r0, rPC              @ arg0
21112    mov    r1, rFP              @ arg1
21113    mov    r2, rSELF            @ arg2
21114    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21115
21116/* ------------------------------ */
21117    .balign 64
21118.L_ALT_OP_IPUT_WIDE_JUMBO: /* 0x10e */
21119/* File: armv5te/alt_stub.S */
21120/*
21121 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21122 * any interesting requests and then jump to the real instruction
21123 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21124 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21125 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21126 * bail to the real handler if breakFlags==0.
21127 */
21128    ldrb   r3, [rSELF, #offThread_breakFlags]
21129    adrl   lr, dvmAsmInstructionStart + (270 * 64)
21130    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21131    cmp    r3, #0
21132    bxeq   lr                   @ nothing to do - jump to real handler
21133    EXPORT_PC()
21134    mov    r0, rPC              @ arg0
21135    mov    r1, rFP              @ arg1
21136    mov    r2, rSELF            @ arg2
21137    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21138
21139/* ------------------------------ */
21140    .balign 64
21141.L_ALT_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
21142/* File: armv5te/alt_stub.S */
21143/*
21144 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21145 * any interesting requests and then jump to the real instruction
21146 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21147 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21148 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21149 * bail to the real handler if breakFlags==0.
21150 */
21151    ldrb   r3, [rSELF, #offThread_breakFlags]
21152    adrl   lr, dvmAsmInstructionStart + (271 * 64)
21153    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21154    cmp    r3, #0
21155    bxeq   lr                   @ nothing to do - jump to real handler
21156    EXPORT_PC()
21157    mov    r0, rPC              @ arg0
21158    mov    r1, rFP              @ arg1
21159    mov    r2, rSELF            @ arg2
21160    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21161
21162/* ------------------------------ */
21163    .balign 64
21164.L_ALT_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
21165/* File: armv5te/alt_stub.S */
21166/*
21167 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21168 * any interesting requests and then jump to the real instruction
21169 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21170 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21171 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21172 * bail to the real handler if breakFlags==0.
21173 */
21174    ldrb   r3, [rSELF, #offThread_breakFlags]
21175    adrl   lr, dvmAsmInstructionStart + (272 * 64)
21176    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21177    cmp    r3, #0
21178    bxeq   lr                   @ nothing to do - jump to real handler
21179    EXPORT_PC()
21180    mov    r0, rPC              @ arg0
21181    mov    r1, rFP              @ arg1
21182    mov    r2, rSELF            @ arg2
21183    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21184
21185/* ------------------------------ */
21186    .balign 64
21187.L_ALT_OP_IPUT_BYTE_JUMBO: /* 0x111 */
21188/* File: armv5te/alt_stub.S */
21189/*
21190 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21191 * any interesting requests and then jump to the real instruction
21192 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21193 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21194 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21195 * bail to the real handler if breakFlags==0.
21196 */
21197    ldrb   r3, [rSELF, #offThread_breakFlags]
21198    adrl   lr, dvmAsmInstructionStart + (273 * 64)
21199    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21200    cmp    r3, #0
21201    bxeq   lr                   @ nothing to do - jump to real handler
21202    EXPORT_PC()
21203    mov    r0, rPC              @ arg0
21204    mov    r1, rFP              @ arg1
21205    mov    r2, rSELF            @ arg2
21206    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21207
21208/* ------------------------------ */
21209    .balign 64
21210.L_ALT_OP_IPUT_CHAR_JUMBO: /* 0x112 */
21211/* File: armv5te/alt_stub.S */
21212/*
21213 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21214 * any interesting requests and then jump to the real instruction
21215 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21216 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21217 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21218 * bail to the real handler if breakFlags==0.
21219 */
21220    ldrb   r3, [rSELF, #offThread_breakFlags]
21221    adrl   lr, dvmAsmInstructionStart + (274 * 64)
21222    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21223    cmp    r3, #0
21224    bxeq   lr                   @ nothing to do - jump to real handler
21225    EXPORT_PC()
21226    mov    r0, rPC              @ arg0
21227    mov    r1, rFP              @ arg1
21228    mov    r2, rSELF            @ arg2
21229    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21230
21231/* ------------------------------ */
21232    .balign 64
21233.L_ALT_OP_IPUT_SHORT_JUMBO: /* 0x113 */
21234/* File: armv5te/alt_stub.S */
21235/*
21236 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21237 * any interesting requests and then jump to the real instruction
21238 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21239 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21240 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21241 * bail to the real handler if breakFlags==0.
21242 */
21243    ldrb   r3, [rSELF, #offThread_breakFlags]
21244    adrl   lr, dvmAsmInstructionStart + (275 * 64)
21245    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21246    cmp    r3, #0
21247    bxeq   lr                   @ nothing to do - jump to real handler
21248    EXPORT_PC()
21249    mov    r0, rPC              @ arg0
21250    mov    r1, rFP              @ arg1
21251    mov    r2, rSELF            @ arg2
21252    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21253
21254/* ------------------------------ */
21255    .balign 64
21256.L_ALT_OP_SGET_JUMBO: /* 0x114 */
21257/* File: armv5te/alt_stub.S */
21258/*
21259 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21260 * any interesting requests and then jump to the real instruction
21261 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21262 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21263 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21264 * bail to the real handler if breakFlags==0.
21265 */
21266    ldrb   r3, [rSELF, #offThread_breakFlags]
21267    adrl   lr, dvmAsmInstructionStart + (276 * 64)
21268    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21269    cmp    r3, #0
21270    bxeq   lr                   @ nothing to do - jump to real handler
21271    EXPORT_PC()
21272    mov    r0, rPC              @ arg0
21273    mov    r1, rFP              @ arg1
21274    mov    r2, rSELF            @ arg2
21275    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21276
21277/* ------------------------------ */
21278    .balign 64
21279.L_ALT_OP_SGET_WIDE_JUMBO: /* 0x115 */
21280/* File: armv5te/alt_stub.S */
21281/*
21282 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21283 * any interesting requests and then jump to the real instruction
21284 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21285 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21286 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21287 * bail to the real handler if breakFlags==0.
21288 */
21289    ldrb   r3, [rSELF, #offThread_breakFlags]
21290    adrl   lr, dvmAsmInstructionStart + (277 * 64)
21291    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21292    cmp    r3, #0
21293    bxeq   lr                   @ nothing to do - jump to real handler
21294    EXPORT_PC()
21295    mov    r0, rPC              @ arg0
21296    mov    r1, rFP              @ arg1
21297    mov    r2, rSELF            @ arg2
21298    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21299
21300/* ------------------------------ */
21301    .balign 64
21302.L_ALT_OP_SGET_OBJECT_JUMBO: /* 0x116 */
21303/* File: armv5te/alt_stub.S */
21304/*
21305 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21306 * any interesting requests and then jump to the real instruction
21307 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21308 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21309 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21310 * bail to the real handler if breakFlags==0.
21311 */
21312    ldrb   r3, [rSELF, #offThread_breakFlags]
21313    adrl   lr, dvmAsmInstructionStart + (278 * 64)
21314    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21315    cmp    r3, #0
21316    bxeq   lr                   @ nothing to do - jump to real handler
21317    EXPORT_PC()
21318    mov    r0, rPC              @ arg0
21319    mov    r1, rFP              @ arg1
21320    mov    r2, rSELF            @ arg2
21321    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21322
21323/* ------------------------------ */
21324    .balign 64
21325.L_ALT_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
21326/* File: armv5te/alt_stub.S */
21327/*
21328 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21329 * any interesting requests and then jump to the real instruction
21330 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21331 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21332 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21333 * bail to the real handler if breakFlags==0.
21334 */
21335    ldrb   r3, [rSELF, #offThread_breakFlags]
21336    adrl   lr, dvmAsmInstructionStart + (279 * 64)
21337    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21338    cmp    r3, #0
21339    bxeq   lr                   @ nothing to do - jump to real handler
21340    EXPORT_PC()
21341    mov    r0, rPC              @ arg0
21342    mov    r1, rFP              @ arg1
21343    mov    r2, rSELF            @ arg2
21344    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21345
21346/* ------------------------------ */
21347    .balign 64
21348.L_ALT_OP_SGET_BYTE_JUMBO: /* 0x118 */
21349/* File: armv5te/alt_stub.S */
21350/*
21351 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21352 * any interesting requests and then jump to the real instruction
21353 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21354 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21355 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21356 * bail to the real handler if breakFlags==0.
21357 */
21358    ldrb   r3, [rSELF, #offThread_breakFlags]
21359    adrl   lr, dvmAsmInstructionStart + (280 * 64)
21360    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21361    cmp    r3, #0
21362    bxeq   lr                   @ nothing to do - jump to real handler
21363    EXPORT_PC()
21364    mov    r0, rPC              @ arg0
21365    mov    r1, rFP              @ arg1
21366    mov    r2, rSELF            @ arg2
21367    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21368
21369/* ------------------------------ */
21370    .balign 64
21371.L_ALT_OP_SGET_CHAR_JUMBO: /* 0x119 */
21372/* File: armv5te/alt_stub.S */
21373/*
21374 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21375 * any interesting requests and then jump to the real instruction
21376 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21377 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21378 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21379 * bail to the real handler if breakFlags==0.
21380 */
21381    ldrb   r3, [rSELF, #offThread_breakFlags]
21382    adrl   lr, dvmAsmInstructionStart + (281 * 64)
21383    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21384    cmp    r3, #0
21385    bxeq   lr                   @ nothing to do - jump to real handler
21386    EXPORT_PC()
21387    mov    r0, rPC              @ arg0
21388    mov    r1, rFP              @ arg1
21389    mov    r2, rSELF            @ arg2
21390    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21391
21392/* ------------------------------ */
21393    .balign 64
21394.L_ALT_OP_SGET_SHORT_JUMBO: /* 0x11a */
21395/* File: armv5te/alt_stub.S */
21396/*
21397 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21398 * any interesting requests and then jump to the real instruction
21399 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21400 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21401 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21402 * bail to the real handler if breakFlags==0.
21403 */
21404    ldrb   r3, [rSELF, #offThread_breakFlags]
21405    adrl   lr, dvmAsmInstructionStart + (282 * 64)
21406    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21407    cmp    r3, #0
21408    bxeq   lr                   @ nothing to do - jump to real handler
21409    EXPORT_PC()
21410    mov    r0, rPC              @ arg0
21411    mov    r1, rFP              @ arg1
21412    mov    r2, rSELF            @ arg2
21413    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21414
21415/* ------------------------------ */
21416    .balign 64
21417.L_ALT_OP_SPUT_JUMBO: /* 0x11b */
21418/* File: armv5te/alt_stub.S */
21419/*
21420 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21421 * any interesting requests and then jump to the real instruction
21422 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21423 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21424 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21425 * bail to the real handler if breakFlags==0.
21426 */
21427    ldrb   r3, [rSELF, #offThread_breakFlags]
21428    adrl   lr, dvmAsmInstructionStart + (283 * 64)
21429    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21430    cmp    r3, #0
21431    bxeq   lr                   @ nothing to do - jump to real handler
21432    EXPORT_PC()
21433    mov    r0, rPC              @ arg0
21434    mov    r1, rFP              @ arg1
21435    mov    r2, rSELF            @ arg2
21436    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21437
21438/* ------------------------------ */
21439    .balign 64
21440.L_ALT_OP_SPUT_WIDE_JUMBO: /* 0x11c */
21441/* File: armv5te/alt_stub.S */
21442/*
21443 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21444 * any interesting requests and then jump to the real instruction
21445 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21446 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21447 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21448 * bail to the real handler if breakFlags==0.
21449 */
21450    ldrb   r3, [rSELF, #offThread_breakFlags]
21451    adrl   lr, dvmAsmInstructionStart + (284 * 64)
21452    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21453    cmp    r3, #0
21454    bxeq   lr                   @ nothing to do - jump to real handler
21455    EXPORT_PC()
21456    mov    r0, rPC              @ arg0
21457    mov    r1, rFP              @ arg1
21458    mov    r2, rSELF            @ arg2
21459    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21460
21461/* ------------------------------ */
21462    .balign 64
21463.L_ALT_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
21464/* File: armv5te/alt_stub.S */
21465/*
21466 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21467 * any interesting requests and then jump to the real instruction
21468 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21469 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21470 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21471 * bail to the real handler if breakFlags==0.
21472 */
21473    ldrb   r3, [rSELF, #offThread_breakFlags]
21474    adrl   lr, dvmAsmInstructionStart + (285 * 64)
21475    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21476    cmp    r3, #0
21477    bxeq   lr                   @ nothing to do - jump to real handler
21478    EXPORT_PC()
21479    mov    r0, rPC              @ arg0
21480    mov    r1, rFP              @ arg1
21481    mov    r2, rSELF            @ arg2
21482    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21483
21484/* ------------------------------ */
21485    .balign 64
21486.L_ALT_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
21487/* File: armv5te/alt_stub.S */
21488/*
21489 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21490 * any interesting requests and then jump to the real instruction
21491 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21492 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21493 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21494 * bail to the real handler if breakFlags==0.
21495 */
21496    ldrb   r3, [rSELF, #offThread_breakFlags]
21497    adrl   lr, dvmAsmInstructionStart + (286 * 64)
21498    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21499    cmp    r3, #0
21500    bxeq   lr                   @ nothing to do - jump to real handler
21501    EXPORT_PC()
21502    mov    r0, rPC              @ arg0
21503    mov    r1, rFP              @ arg1
21504    mov    r2, rSELF            @ arg2
21505    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21506
21507/* ------------------------------ */
21508    .balign 64
21509.L_ALT_OP_SPUT_BYTE_JUMBO: /* 0x11f */
21510/* File: armv5te/alt_stub.S */
21511/*
21512 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21513 * any interesting requests and then jump to the real instruction
21514 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21515 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21516 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21517 * bail to the real handler if breakFlags==0.
21518 */
21519    ldrb   r3, [rSELF, #offThread_breakFlags]
21520    adrl   lr, dvmAsmInstructionStart + (287 * 64)
21521    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21522    cmp    r3, #0
21523    bxeq   lr                   @ nothing to do - jump to real handler
21524    EXPORT_PC()
21525    mov    r0, rPC              @ arg0
21526    mov    r1, rFP              @ arg1
21527    mov    r2, rSELF            @ arg2
21528    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21529
21530/* ------------------------------ */
21531    .balign 64
21532.L_ALT_OP_SPUT_CHAR_JUMBO: /* 0x120 */
21533/* File: armv5te/alt_stub.S */
21534/*
21535 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21536 * any interesting requests and then jump to the real instruction
21537 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21538 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21539 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21540 * bail to the real handler if breakFlags==0.
21541 */
21542    ldrb   r3, [rSELF, #offThread_breakFlags]
21543    adrl   lr, dvmAsmInstructionStart + (288 * 64)
21544    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21545    cmp    r3, #0
21546    bxeq   lr                   @ nothing to do - jump to real handler
21547    EXPORT_PC()
21548    mov    r0, rPC              @ arg0
21549    mov    r1, rFP              @ arg1
21550    mov    r2, rSELF            @ arg2
21551    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21552
21553/* ------------------------------ */
21554    .balign 64
21555.L_ALT_OP_SPUT_SHORT_JUMBO: /* 0x121 */
21556/* File: armv5te/alt_stub.S */
21557/*
21558 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21559 * any interesting requests and then jump to the real instruction
21560 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21561 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21562 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21563 * bail to the real handler if breakFlags==0.
21564 */
21565    ldrb   r3, [rSELF, #offThread_breakFlags]
21566    adrl   lr, dvmAsmInstructionStart + (289 * 64)
21567    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21568    cmp    r3, #0
21569    bxeq   lr                   @ nothing to do - jump to real handler
21570    EXPORT_PC()
21571    mov    r0, rPC              @ arg0
21572    mov    r1, rFP              @ arg1
21573    mov    r2, rSELF            @ arg2
21574    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21575
21576/* ------------------------------ */
21577    .balign 64
21578.L_ALT_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
21579/* File: armv5te/alt_stub.S */
21580/*
21581 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21582 * any interesting requests and then jump to the real instruction
21583 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21584 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21585 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21586 * bail to the real handler if breakFlags==0.
21587 */
21588    ldrb   r3, [rSELF, #offThread_breakFlags]
21589    adrl   lr, dvmAsmInstructionStart + (290 * 64)
21590    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21591    cmp    r3, #0
21592    bxeq   lr                   @ nothing to do - jump to real handler
21593    EXPORT_PC()
21594    mov    r0, rPC              @ arg0
21595    mov    r1, rFP              @ arg1
21596    mov    r2, rSELF            @ arg2
21597    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21598
21599/* ------------------------------ */
21600    .balign 64
21601.L_ALT_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
21602/* File: armv5te/alt_stub.S */
21603/*
21604 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21605 * any interesting requests and then jump to the real instruction
21606 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21607 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21608 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21609 * bail to the real handler if breakFlags==0.
21610 */
21611    ldrb   r3, [rSELF, #offThread_breakFlags]
21612    adrl   lr, dvmAsmInstructionStart + (291 * 64)
21613    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21614    cmp    r3, #0
21615    bxeq   lr                   @ nothing to do - jump to real handler
21616    EXPORT_PC()
21617    mov    r0, rPC              @ arg0
21618    mov    r1, rFP              @ arg1
21619    mov    r2, rSELF            @ arg2
21620    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21621
21622/* ------------------------------ */
21623    .balign 64
21624.L_ALT_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
21625/* File: armv5te/alt_stub.S */
21626/*
21627 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21628 * any interesting requests and then jump to the real instruction
21629 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21630 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21631 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21632 * bail to the real handler if breakFlags==0.
21633 */
21634    ldrb   r3, [rSELF, #offThread_breakFlags]
21635    adrl   lr, dvmAsmInstructionStart + (292 * 64)
21636    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21637    cmp    r3, #0
21638    bxeq   lr                   @ nothing to do - jump to real handler
21639    EXPORT_PC()
21640    mov    r0, rPC              @ arg0
21641    mov    r1, rFP              @ arg1
21642    mov    r2, rSELF            @ arg2
21643    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21644
21645/* ------------------------------ */
21646    .balign 64
21647.L_ALT_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
21648/* File: armv5te/alt_stub.S */
21649/*
21650 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21651 * any interesting requests and then jump to the real instruction
21652 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21653 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21654 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21655 * bail to the real handler if breakFlags==0.
21656 */
21657    ldrb   r3, [rSELF, #offThread_breakFlags]
21658    adrl   lr, dvmAsmInstructionStart + (293 * 64)
21659    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21660    cmp    r3, #0
21661    bxeq   lr                   @ nothing to do - jump to real handler
21662    EXPORT_PC()
21663    mov    r0, rPC              @ arg0
21664    mov    r1, rFP              @ arg1
21665    mov    r2, rSELF            @ arg2
21666    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21667
21668/* ------------------------------ */
21669    .balign 64
21670.L_ALT_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
21671/* File: armv5te/alt_stub.S */
21672/*
21673 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21674 * any interesting requests and then jump to the real instruction
21675 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21676 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21677 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21678 * bail to the real handler if breakFlags==0.
21679 */
21680    ldrb   r3, [rSELF, #offThread_breakFlags]
21681    adrl   lr, dvmAsmInstructionStart + (294 * 64)
21682    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21683    cmp    r3, #0
21684    bxeq   lr                   @ nothing to do - jump to real handler
21685    EXPORT_PC()
21686    mov    r0, rPC              @ arg0
21687    mov    r1, rFP              @ arg1
21688    mov    r2, rSELF            @ arg2
21689    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21690
21691/* ------------------------------ */
21692    .balign 64
21693.L_ALT_OP_UNUSED_27FF: /* 0x127 */
21694/* File: armv5te/alt_stub.S */
21695/*
21696 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21697 * any interesting requests and then jump to the real instruction
21698 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21699 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21700 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21701 * bail to the real handler if breakFlags==0.
21702 */
21703    ldrb   r3, [rSELF, #offThread_breakFlags]
21704    adrl   lr, dvmAsmInstructionStart + (295 * 64)
21705    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21706    cmp    r3, #0
21707    bxeq   lr                   @ nothing to do - jump to real handler
21708    EXPORT_PC()
21709    mov    r0, rPC              @ arg0
21710    mov    r1, rFP              @ arg1
21711    mov    r2, rSELF            @ arg2
21712    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21713
21714/* ------------------------------ */
21715    .balign 64
21716.L_ALT_OP_UNUSED_28FF: /* 0x128 */
21717/* File: armv5te/alt_stub.S */
21718/*
21719 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21720 * any interesting requests and then jump to the real instruction
21721 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21722 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21723 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21724 * bail to the real handler if breakFlags==0.
21725 */
21726    ldrb   r3, [rSELF, #offThread_breakFlags]
21727    adrl   lr, dvmAsmInstructionStart + (296 * 64)
21728    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21729    cmp    r3, #0
21730    bxeq   lr                   @ nothing to do - jump to real handler
21731    EXPORT_PC()
21732    mov    r0, rPC              @ arg0
21733    mov    r1, rFP              @ arg1
21734    mov    r2, rSELF            @ arg2
21735    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21736
21737/* ------------------------------ */
21738    .balign 64
21739.L_ALT_OP_UNUSED_29FF: /* 0x129 */
21740/* File: armv5te/alt_stub.S */
21741/*
21742 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21743 * any interesting requests and then jump to the real instruction
21744 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21745 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21746 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21747 * bail to the real handler if breakFlags==0.
21748 */
21749    ldrb   r3, [rSELF, #offThread_breakFlags]
21750    adrl   lr, dvmAsmInstructionStart + (297 * 64)
21751    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21752    cmp    r3, #0
21753    bxeq   lr                   @ nothing to do - jump to real handler
21754    EXPORT_PC()
21755    mov    r0, rPC              @ arg0
21756    mov    r1, rFP              @ arg1
21757    mov    r2, rSELF            @ arg2
21758    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21759
21760/* ------------------------------ */
21761    .balign 64
21762.L_ALT_OP_UNUSED_2AFF: /* 0x12a */
21763/* File: armv5te/alt_stub.S */
21764/*
21765 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21766 * any interesting requests and then jump to the real instruction
21767 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21768 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21769 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21770 * bail to the real handler if breakFlags==0.
21771 */
21772    ldrb   r3, [rSELF, #offThread_breakFlags]
21773    adrl   lr, dvmAsmInstructionStart + (298 * 64)
21774    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21775    cmp    r3, #0
21776    bxeq   lr                   @ nothing to do - jump to real handler
21777    EXPORT_PC()
21778    mov    r0, rPC              @ arg0
21779    mov    r1, rFP              @ arg1
21780    mov    r2, rSELF            @ arg2
21781    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21782
21783/* ------------------------------ */
21784    .balign 64
21785.L_ALT_OP_UNUSED_2BFF: /* 0x12b */
21786/* File: armv5te/alt_stub.S */
21787/*
21788 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21789 * any interesting requests and then jump to the real instruction
21790 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21791 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21792 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21793 * bail to the real handler if breakFlags==0.
21794 */
21795    ldrb   r3, [rSELF, #offThread_breakFlags]
21796    adrl   lr, dvmAsmInstructionStart + (299 * 64)
21797    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21798    cmp    r3, #0
21799    bxeq   lr                   @ nothing to do - jump to real handler
21800    EXPORT_PC()
21801    mov    r0, rPC              @ arg0
21802    mov    r1, rFP              @ arg1
21803    mov    r2, rSELF            @ arg2
21804    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21805
21806/* ------------------------------ */
21807    .balign 64
21808.L_ALT_OP_UNUSED_2CFF: /* 0x12c */
21809/* File: armv5te/alt_stub.S */
21810/*
21811 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21812 * any interesting requests and then jump to the real instruction
21813 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21814 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21815 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21816 * bail to the real handler if breakFlags==0.
21817 */
21818    ldrb   r3, [rSELF, #offThread_breakFlags]
21819    adrl   lr, dvmAsmInstructionStart + (300 * 64)
21820    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21821    cmp    r3, #0
21822    bxeq   lr                   @ nothing to do - jump to real handler
21823    EXPORT_PC()
21824    mov    r0, rPC              @ arg0
21825    mov    r1, rFP              @ arg1
21826    mov    r2, rSELF            @ arg2
21827    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21828
21829/* ------------------------------ */
21830    .balign 64
21831.L_ALT_OP_UNUSED_2DFF: /* 0x12d */
21832/* File: armv5te/alt_stub.S */
21833/*
21834 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21835 * any interesting requests and then jump to the real instruction
21836 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21837 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21838 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21839 * bail to the real handler if breakFlags==0.
21840 */
21841    ldrb   r3, [rSELF, #offThread_breakFlags]
21842    adrl   lr, dvmAsmInstructionStart + (301 * 64)
21843    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21844    cmp    r3, #0
21845    bxeq   lr                   @ nothing to do - jump to real handler
21846    EXPORT_PC()
21847    mov    r0, rPC              @ arg0
21848    mov    r1, rFP              @ arg1
21849    mov    r2, rSELF            @ arg2
21850    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21851
21852/* ------------------------------ */
21853    .balign 64
21854.L_ALT_OP_UNUSED_2EFF: /* 0x12e */
21855/* File: armv5te/alt_stub.S */
21856/*
21857 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21858 * any interesting requests and then jump to the real instruction
21859 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21860 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21861 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21862 * bail to the real handler if breakFlags==0.
21863 */
21864    ldrb   r3, [rSELF, #offThread_breakFlags]
21865    adrl   lr, dvmAsmInstructionStart + (302 * 64)
21866    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21867    cmp    r3, #0
21868    bxeq   lr                   @ nothing to do - jump to real handler
21869    EXPORT_PC()
21870    mov    r0, rPC              @ arg0
21871    mov    r1, rFP              @ arg1
21872    mov    r2, rSELF            @ arg2
21873    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21874
21875/* ------------------------------ */
21876    .balign 64
21877.L_ALT_OP_UNUSED_2FFF: /* 0x12f */
21878/* File: armv5te/alt_stub.S */
21879/*
21880 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21881 * any interesting requests and then jump to the real instruction
21882 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21883 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21884 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21885 * bail to the real handler if breakFlags==0.
21886 */
21887    ldrb   r3, [rSELF, #offThread_breakFlags]
21888    adrl   lr, dvmAsmInstructionStart + (303 * 64)
21889    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21890    cmp    r3, #0
21891    bxeq   lr                   @ nothing to do - jump to real handler
21892    EXPORT_PC()
21893    mov    r0, rPC              @ arg0
21894    mov    r1, rFP              @ arg1
21895    mov    r2, rSELF            @ arg2
21896    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21897
21898/* ------------------------------ */
21899    .balign 64
21900.L_ALT_OP_UNUSED_30FF: /* 0x130 */
21901/* File: armv5te/alt_stub.S */
21902/*
21903 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21904 * any interesting requests and then jump to the real instruction
21905 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21906 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21907 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21908 * bail to the real handler if breakFlags==0.
21909 */
21910    ldrb   r3, [rSELF, #offThread_breakFlags]
21911    adrl   lr, dvmAsmInstructionStart + (304 * 64)
21912    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21913    cmp    r3, #0
21914    bxeq   lr                   @ nothing to do - jump to real handler
21915    EXPORT_PC()
21916    mov    r0, rPC              @ arg0
21917    mov    r1, rFP              @ arg1
21918    mov    r2, rSELF            @ arg2
21919    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21920
21921/* ------------------------------ */
21922    .balign 64
21923.L_ALT_OP_UNUSED_31FF: /* 0x131 */
21924/* File: armv5te/alt_stub.S */
21925/*
21926 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21927 * any interesting requests and then jump to the real instruction
21928 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21929 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21930 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21931 * bail to the real handler if breakFlags==0.
21932 */
21933    ldrb   r3, [rSELF, #offThread_breakFlags]
21934    adrl   lr, dvmAsmInstructionStart + (305 * 64)
21935    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21936    cmp    r3, #0
21937    bxeq   lr                   @ nothing to do - jump to real handler
21938    EXPORT_PC()
21939    mov    r0, rPC              @ arg0
21940    mov    r1, rFP              @ arg1
21941    mov    r2, rSELF            @ arg2
21942    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21943
21944/* ------------------------------ */
21945    .balign 64
21946.L_ALT_OP_UNUSED_32FF: /* 0x132 */
21947/* File: armv5te/alt_stub.S */
21948/*
21949 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21950 * any interesting requests and then jump to the real instruction
21951 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21952 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21953 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21954 * bail to the real handler if breakFlags==0.
21955 */
21956    ldrb   r3, [rSELF, #offThread_breakFlags]
21957    adrl   lr, dvmAsmInstructionStart + (306 * 64)
21958    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21959    cmp    r3, #0
21960    bxeq   lr                   @ nothing to do - jump to real handler
21961    EXPORT_PC()
21962    mov    r0, rPC              @ arg0
21963    mov    r1, rFP              @ arg1
21964    mov    r2, rSELF            @ arg2
21965    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21966
21967/* ------------------------------ */
21968    .balign 64
21969.L_ALT_OP_UNUSED_33FF: /* 0x133 */
21970/* File: armv5te/alt_stub.S */
21971/*
21972 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21973 * any interesting requests and then jump to the real instruction
21974 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21975 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21976 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21977 * bail to the real handler if breakFlags==0.
21978 */
21979    ldrb   r3, [rSELF, #offThread_breakFlags]
21980    adrl   lr, dvmAsmInstructionStart + (307 * 64)
21981    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21982    cmp    r3, #0
21983    bxeq   lr                   @ nothing to do - jump to real handler
21984    EXPORT_PC()
21985    mov    r0, rPC              @ arg0
21986    mov    r1, rFP              @ arg1
21987    mov    r2, rSELF            @ arg2
21988    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21989
21990/* ------------------------------ */
21991    .balign 64
21992.L_ALT_OP_UNUSED_34FF: /* 0x134 */
21993/* File: armv5te/alt_stub.S */
21994/*
21995 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21996 * any interesting requests and then jump to the real instruction
21997 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21998 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21999 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22000 * bail to the real handler if breakFlags==0.
22001 */
22002    ldrb   r3, [rSELF, #offThread_breakFlags]
22003    adrl   lr, dvmAsmInstructionStart + (308 * 64)
22004    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22005    cmp    r3, #0
22006    bxeq   lr                   @ nothing to do - jump to real handler
22007    EXPORT_PC()
22008    mov    r0, rPC              @ arg0
22009    mov    r1, rFP              @ arg1
22010    mov    r2, rSELF            @ arg2
22011    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22012
22013/* ------------------------------ */
22014    .balign 64
22015.L_ALT_OP_UNUSED_35FF: /* 0x135 */
22016/* File: armv5te/alt_stub.S */
22017/*
22018 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22019 * any interesting requests and then jump to the real instruction
22020 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22021 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22022 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22023 * bail to the real handler if breakFlags==0.
22024 */
22025    ldrb   r3, [rSELF, #offThread_breakFlags]
22026    adrl   lr, dvmAsmInstructionStart + (309 * 64)
22027    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22028    cmp    r3, #0
22029    bxeq   lr                   @ nothing to do - jump to real handler
22030    EXPORT_PC()
22031    mov    r0, rPC              @ arg0
22032    mov    r1, rFP              @ arg1
22033    mov    r2, rSELF            @ arg2
22034    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22035
22036/* ------------------------------ */
22037    .balign 64
22038.L_ALT_OP_UNUSED_36FF: /* 0x136 */
22039/* File: armv5te/alt_stub.S */
22040/*
22041 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22042 * any interesting requests and then jump to the real instruction
22043 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22044 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22045 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22046 * bail to the real handler if breakFlags==0.
22047 */
22048    ldrb   r3, [rSELF, #offThread_breakFlags]
22049    adrl   lr, dvmAsmInstructionStart + (310 * 64)
22050    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22051    cmp    r3, #0
22052    bxeq   lr                   @ nothing to do - jump to real handler
22053    EXPORT_PC()
22054    mov    r0, rPC              @ arg0
22055    mov    r1, rFP              @ arg1
22056    mov    r2, rSELF            @ arg2
22057    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22058
22059/* ------------------------------ */
22060    .balign 64
22061.L_ALT_OP_UNUSED_37FF: /* 0x137 */
22062/* File: armv5te/alt_stub.S */
22063/*
22064 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22065 * any interesting requests and then jump to the real instruction
22066 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22067 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22068 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22069 * bail to the real handler if breakFlags==0.
22070 */
22071    ldrb   r3, [rSELF, #offThread_breakFlags]
22072    adrl   lr, dvmAsmInstructionStart + (311 * 64)
22073    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22074    cmp    r3, #0
22075    bxeq   lr                   @ nothing to do - jump to real handler
22076    EXPORT_PC()
22077    mov    r0, rPC              @ arg0
22078    mov    r1, rFP              @ arg1
22079    mov    r2, rSELF            @ arg2
22080    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22081
22082/* ------------------------------ */
22083    .balign 64
22084.L_ALT_OP_UNUSED_38FF: /* 0x138 */
22085/* File: armv5te/alt_stub.S */
22086/*
22087 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22088 * any interesting requests and then jump to the real instruction
22089 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22090 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22091 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22092 * bail to the real handler if breakFlags==0.
22093 */
22094    ldrb   r3, [rSELF, #offThread_breakFlags]
22095    adrl   lr, dvmAsmInstructionStart + (312 * 64)
22096    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22097    cmp    r3, #0
22098    bxeq   lr                   @ nothing to do - jump to real handler
22099    EXPORT_PC()
22100    mov    r0, rPC              @ arg0
22101    mov    r1, rFP              @ arg1
22102    mov    r2, rSELF            @ arg2
22103    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22104
22105/* ------------------------------ */
22106    .balign 64
22107.L_ALT_OP_UNUSED_39FF: /* 0x139 */
22108/* File: armv5te/alt_stub.S */
22109/*
22110 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22111 * any interesting requests and then jump to the real instruction
22112 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22113 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22114 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22115 * bail to the real handler if breakFlags==0.
22116 */
22117    ldrb   r3, [rSELF, #offThread_breakFlags]
22118    adrl   lr, dvmAsmInstructionStart + (313 * 64)
22119    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22120    cmp    r3, #0
22121    bxeq   lr                   @ nothing to do - jump to real handler
22122    EXPORT_PC()
22123    mov    r0, rPC              @ arg0
22124    mov    r1, rFP              @ arg1
22125    mov    r2, rSELF            @ arg2
22126    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22127
22128/* ------------------------------ */
22129    .balign 64
22130.L_ALT_OP_UNUSED_3AFF: /* 0x13a */
22131/* File: armv5te/alt_stub.S */
22132/*
22133 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22134 * any interesting requests and then jump to the real instruction
22135 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22136 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22137 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22138 * bail to the real handler if breakFlags==0.
22139 */
22140    ldrb   r3, [rSELF, #offThread_breakFlags]
22141    adrl   lr, dvmAsmInstructionStart + (314 * 64)
22142    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22143    cmp    r3, #0
22144    bxeq   lr                   @ nothing to do - jump to real handler
22145    EXPORT_PC()
22146    mov    r0, rPC              @ arg0
22147    mov    r1, rFP              @ arg1
22148    mov    r2, rSELF            @ arg2
22149    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22150
22151/* ------------------------------ */
22152    .balign 64
22153.L_ALT_OP_UNUSED_3BFF: /* 0x13b */
22154/* File: armv5te/alt_stub.S */
22155/*
22156 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22157 * any interesting requests and then jump to the real instruction
22158 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22159 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22160 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22161 * bail to the real handler if breakFlags==0.
22162 */
22163    ldrb   r3, [rSELF, #offThread_breakFlags]
22164    adrl   lr, dvmAsmInstructionStart + (315 * 64)
22165    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22166    cmp    r3, #0
22167    bxeq   lr                   @ nothing to do - jump to real handler
22168    EXPORT_PC()
22169    mov    r0, rPC              @ arg0
22170    mov    r1, rFP              @ arg1
22171    mov    r2, rSELF            @ arg2
22172    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22173
22174/* ------------------------------ */
22175    .balign 64
22176.L_ALT_OP_UNUSED_3CFF: /* 0x13c */
22177/* File: armv5te/alt_stub.S */
22178/*
22179 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22180 * any interesting requests and then jump to the real instruction
22181 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22182 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22183 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22184 * bail to the real handler if breakFlags==0.
22185 */
22186    ldrb   r3, [rSELF, #offThread_breakFlags]
22187    adrl   lr, dvmAsmInstructionStart + (316 * 64)
22188    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22189    cmp    r3, #0
22190    bxeq   lr                   @ nothing to do - jump to real handler
22191    EXPORT_PC()
22192    mov    r0, rPC              @ arg0
22193    mov    r1, rFP              @ arg1
22194    mov    r2, rSELF            @ arg2
22195    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22196
22197/* ------------------------------ */
22198    .balign 64
22199.L_ALT_OP_UNUSED_3DFF: /* 0x13d */
22200/* File: armv5te/alt_stub.S */
22201/*
22202 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22203 * any interesting requests and then jump to the real instruction
22204 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22205 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22206 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22207 * bail to the real handler if breakFlags==0.
22208 */
22209    ldrb   r3, [rSELF, #offThread_breakFlags]
22210    adrl   lr, dvmAsmInstructionStart + (317 * 64)
22211    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22212    cmp    r3, #0
22213    bxeq   lr                   @ nothing to do - jump to real handler
22214    EXPORT_PC()
22215    mov    r0, rPC              @ arg0
22216    mov    r1, rFP              @ arg1
22217    mov    r2, rSELF            @ arg2
22218    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22219
22220/* ------------------------------ */
22221    .balign 64
22222.L_ALT_OP_UNUSED_3EFF: /* 0x13e */
22223/* File: armv5te/alt_stub.S */
22224/*
22225 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22226 * any interesting requests and then jump to the real instruction
22227 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22228 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22229 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22230 * bail to the real handler if breakFlags==0.
22231 */
22232    ldrb   r3, [rSELF, #offThread_breakFlags]
22233    adrl   lr, dvmAsmInstructionStart + (318 * 64)
22234    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22235    cmp    r3, #0
22236    bxeq   lr                   @ nothing to do - jump to real handler
22237    EXPORT_PC()
22238    mov    r0, rPC              @ arg0
22239    mov    r1, rFP              @ arg1
22240    mov    r2, rSELF            @ arg2
22241    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22242
22243/* ------------------------------ */
22244    .balign 64
22245.L_ALT_OP_UNUSED_3FFF: /* 0x13f */
22246/* File: armv5te/alt_stub.S */
22247/*
22248 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22249 * any interesting requests and then jump to the real instruction
22250 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22251 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22252 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22253 * bail to the real handler if breakFlags==0.
22254 */
22255    ldrb   r3, [rSELF, #offThread_breakFlags]
22256    adrl   lr, dvmAsmInstructionStart + (319 * 64)
22257    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22258    cmp    r3, #0
22259    bxeq   lr                   @ nothing to do - jump to real handler
22260    EXPORT_PC()
22261    mov    r0, rPC              @ arg0
22262    mov    r1, rFP              @ arg1
22263    mov    r2, rSELF            @ arg2
22264    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22265
22266/* ------------------------------ */
22267    .balign 64
22268.L_ALT_OP_UNUSED_40FF: /* 0x140 */
22269/* File: armv5te/alt_stub.S */
22270/*
22271 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22272 * any interesting requests and then jump to the real instruction
22273 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22274 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22275 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22276 * bail to the real handler if breakFlags==0.
22277 */
22278    ldrb   r3, [rSELF, #offThread_breakFlags]
22279    adrl   lr, dvmAsmInstructionStart + (320 * 64)
22280    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22281    cmp    r3, #0
22282    bxeq   lr                   @ nothing to do - jump to real handler
22283    EXPORT_PC()
22284    mov    r0, rPC              @ arg0
22285    mov    r1, rFP              @ arg1
22286    mov    r2, rSELF            @ arg2
22287    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22288
22289/* ------------------------------ */
22290    .balign 64
22291.L_ALT_OP_UNUSED_41FF: /* 0x141 */
22292/* File: armv5te/alt_stub.S */
22293/*
22294 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22295 * any interesting requests and then jump to the real instruction
22296 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22297 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22298 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22299 * bail to the real handler if breakFlags==0.
22300 */
22301    ldrb   r3, [rSELF, #offThread_breakFlags]
22302    adrl   lr, dvmAsmInstructionStart + (321 * 64)
22303    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22304    cmp    r3, #0
22305    bxeq   lr                   @ nothing to do - jump to real handler
22306    EXPORT_PC()
22307    mov    r0, rPC              @ arg0
22308    mov    r1, rFP              @ arg1
22309    mov    r2, rSELF            @ arg2
22310    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22311
22312/* ------------------------------ */
22313    .balign 64
22314.L_ALT_OP_UNUSED_42FF: /* 0x142 */
22315/* File: armv5te/alt_stub.S */
22316/*
22317 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22318 * any interesting requests and then jump to the real instruction
22319 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22320 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22321 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22322 * bail to the real handler if breakFlags==0.
22323 */
22324    ldrb   r3, [rSELF, #offThread_breakFlags]
22325    adrl   lr, dvmAsmInstructionStart + (322 * 64)
22326    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22327    cmp    r3, #0
22328    bxeq   lr                   @ nothing to do - jump to real handler
22329    EXPORT_PC()
22330    mov    r0, rPC              @ arg0
22331    mov    r1, rFP              @ arg1
22332    mov    r2, rSELF            @ arg2
22333    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22334
22335/* ------------------------------ */
22336    .balign 64
22337.L_ALT_OP_UNUSED_43FF: /* 0x143 */
22338/* File: armv5te/alt_stub.S */
22339/*
22340 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22341 * any interesting requests and then jump to the real instruction
22342 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22343 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22344 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22345 * bail to the real handler if breakFlags==0.
22346 */
22347    ldrb   r3, [rSELF, #offThread_breakFlags]
22348    adrl   lr, dvmAsmInstructionStart + (323 * 64)
22349    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22350    cmp    r3, #0
22351    bxeq   lr                   @ nothing to do - jump to real handler
22352    EXPORT_PC()
22353    mov    r0, rPC              @ arg0
22354    mov    r1, rFP              @ arg1
22355    mov    r2, rSELF            @ arg2
22356    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22357
22358/* ------------------------------ */
22359    .balign 64
22360.L_ALT_OP_UNUSED_44FF: /* 0x144 */
22361/* File: armv5te/alt_stub.S */
22362/*
22363 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22364 * any interesting requests and then jump to the real instruction
22365 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22366 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22367 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22368 * bail to the real handler if breakFlags==0.
22369 */
22370    ldrb   r3, [rSELF, #offThread_breakFlags]
22371    adrl   lr, dvmAsmInstructionStart + (324 * 64)
22372    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22373    cmp    r3, #0
22374    bxeq   lr                   @ nothing to do - jump to real handler
22375    EXPORT_PC()
22376    mov    r0, rPC              @ arg0
22377    mov    r1, rFP              @ arg1
22378    mov    r2, rSELF            @ arg2
22379    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22380
22381/* ------------------------------ */
22382    .balign 64
22383.L_ALT_OP_UNUSED_45FF: /* 0x145 */
22384/* File: armv5te/alt_stub.S */
22385/*
22386 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22387 * any interesting requests and then jump to the real instruction
22388 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22389 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22390 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22391 * bail to the real handler if breakFlags==0.
22392 */
22393    ldrb   r3, [rSELF, #offThread_breakFlags]
22394    adrl   lr, dvmAsmInstructionStart + (325 * 64)
22395    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22396    cmp    r3, #0
22397    bxeq   lr                   @ nothing to do - jump to real handler
22398    EXPORT_PC()
22399    mov    r0, rPC              @ arg0
22400    mov    r1, rFP              @ arg1
22401    mov    r2, rSELF            @ arg2
22402    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22403
22404/* ------------------------------ */
22405    .balign 64
22406.L_ALT_OP_UNUSED_46FF: /* 0x146 */
22407/* File: armv5te/alt_stub.S */
22408/*
22409 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22410 * any interesting requests and then jump to the real instruction
22411 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22412 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22413 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22414 * bail to the real handler if breakFlags==0.
22415 */
22416    ldrb   r3, [rSELF, #offThread_breakFlags]
22417    adrl   lr, dvmAsmInstructionStart + (326 * 64)
22418    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22419    cmp    r3, #0
22420    bxeq   lr                   @ nothing to do - jump to real handler
22421    EXPORT_PC()
22422    mov    r0, rPC              @ arg0
22423    mov    r1, rFP              @ arg1
22424    mov    r2, rSELF            @ arg2
22425    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22426
22427/* ------------------------------ */
22428    .balign 64
22429.L_ALT_OP_UNUSED_47FF: /* 0x147 */
22430/* File: armv5te/alt_stub.S */
22431/*
22432 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22433 * any interesting requests and then jump to the real instruction
22434 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22435 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22436 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22437 * bail to the real handler if breakFlags==0.
22438 */
22439    ldrb   r3, [rSELF, #offThread_breakFlags]
22440    adrl   lr, dvmAsmInstructionStart + (327 * 64)
22441    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22442    cmp    r3, #0
22443    bxeq   lr                   @ nothing to do - jump to real handler
22444    EXPORT_PC()
22445    mov    r0, rPC              @ arg0
22446    mov    r1, rFP              @ arg1
22447    mov    r2, rSELF            @ arg2
22448    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22449
22450/* ------------------------------ */
22451    .balign 64
22452.L_ALT_OP_UNUSED_48FF: /* 0x148 */
22453/* File: armv5te/alt_stub.S */
22454/*
22455 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22456 * any interesting requests and then jump to the real instruction
22457 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22458 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22459 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22460 * bail to the real handler if breakFlags==0.
22461 */
22462    ldrb   r3, [rSELF, #offThread_breakFlags]
22463    adrl   lr, dvmAsmInstructionStart + (328 * 64)
22464    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22465    cmp    r3, #0
22466    bxeq   lr                   @ nothing to do - jump to real handler
22467    EXPORT_PC()
22468    mov    r0, rPC              @ arg0
22469    mov    r1, rFP              @ arg1
22470    mov    r2, rSELF            @ arg2
22471    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22472
22473/* ------------------------------ */
22474    .balign 64
22475.L_ALT_OP_UNUSED_49FF: /* 0x149 */
22476/* File: armv5te/alt_stub.S */
22477/*
22478 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22479 * any interesting requests and then jump to the real instruction
22480 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22481 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22482 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22483 * bail to the real handler if breakFlags==0.
22484 */
22485    ldrb   r3, [rSELF, #offThread_breakFlags]
22486    adrl   lr, dvmAsmInstructionStart + (329 * 64)
22487    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22488    cmp    r3, #0
22489    bxeq   lr                   @ nothing to do - jump to real handler
22490    EXPORT_PC()
22491    mov    r0, rPC              @ arg0
22492    mov    r1, rFP              @ arg1
22493    mov    r2, rSELF            @ arg2
22494    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22495
22496/* ------------------------------ */
22497    .balign 64
22498.L_ALT_OP_UNUSED_4AFF: /* 0x14a */
22499/* File: armv5te/alt_stub.S */
22500/*
22501 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22502 * any interesting requests and then jump to the real instruction
22503 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22504 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22505 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22506 * bail to the real handler if breakFlags==0.
22507 */
22508    ldrb   r3, [rSELF, #offThread_breakFlags]
22509    adrl   lr, dvmAsmInstructionStart + (330 * 64)
22510    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22511    cmp    r3, #0
22512    bxeq   lr                   @ nothing to do - jump to real handler
22513    EXPORT_PC()
22514    mov    r0, rPC              @ arg0
22515    mov    r1, rFP              @ arg1
22516    mov    r2, rSELF            @ arg2
22517    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22518
22519/* ------------------------------ */
22520    .balign 64
22521.L_ALT_OP_UNUSED_4BFF: /* 0x14b */
22522/* File: armv5te/alt_stub.S */
22523/*
22524 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22525 * any interesting requests and then jump to the real instruction
22526 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22527 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22528 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22529 * bail to the real handler if breakFlags==0.
22530 */
22531    ldrb   r3, [rSELF, #offThread_breakFlags]
22532    adrl   lr, dvmAsmInstructionStart + (331 * 64)
22533    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22534    cmp    r3, #0
22535    bxeq   lr                   @ nothing to do - jump to real handler
22536    EXPORT_PC()
22537    mov    r0, rPC              @ arg0
22538    mov    r1, rFP              @ arg1
22539    mov    r2, rSELF            @ arg2
22540    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22541
22542/* ------------------------------ */
22543    .balign 64
22544.L_ALT_OP_UNUSED_4CFF: /* 0x14c */
22545/* File: armv5te/alt_stub.S */
22546/*
22547 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22548 * any interesting requests and then jump to the real instruction
22549 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22550 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22551 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22552 * bail to the real handler if breakFlags==0.
22553 */
22554    ldrb   r3, [rSELF, #offThread_breakFlags]
22555    adrl   lr, dvmAsmInstructionStart + (332 * 64)
22556    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22557    cmp    r3, #0
22558    bxeq   lr                   @ nothing to do - jump to real handler
22559    EXPORT_PC()
22560    mov    r0, rPC              @ arg0
22561    mov    r1, rFP              @ arg1
22562    mov    r2, rSELF            @ arg2
22563    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22564
22565/* ------------------------------ */
22566    .balign 64
22567.L_ALT_OP_UNUSED_4DFF: /* 0x14d */
22568/* File: armv5te/alt_stub.S */
22569/*
22570 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22571 * any interesting requests and then jump to the real instruction
22572 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22573 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22574 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22575 * bail to the real handler if breakFlags==0.
22576 */
22577    ldrb   r3, [rSELF, #offThread_breakFlags]
22578    adrl   lr, dvmAsmInstructionStart + (333 * 64)
22579    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22580    cmp    r3, #0
22581    bxeq   lr                   @ nothing to do - jump to real handler
22582    EXPORT_PC()
22583    mov    r0, rPC              @ arg0
22584    mov    r1, rFP              @ arg1
22585    mov    r2, rSELF            @ arg2
22586    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22587
22588/* ------------------------------ */
22589    .balign 64
22590.L_ALT_OP_UNUSED_4EFF: /* 0x14e */
22591/* File: armv5te/alt_stub.S */
22592/*
22593 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22594 * any interesting requests and then jump to the real instruction
22595 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22596 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22597 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22598 * bail to the real handler if breakFlags==0.
22599 */
22600    ldrb   r3, [rSELF, #offThread_breakFlags]
22601    adrl   lr, dvmAsmInstructionStart + (334 * 64)
22602    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22603    cmp    r3, #0
22604    bxeq   lr                   @ nothing to do - jump to real handler
22605    EXPORT_PC()
22606    mov    r0, rPC              @ arg0
22607    mov    r1, rFP              @ arg1
22608    mov    r2, rSELF            @ arg2
22609    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22610
22611/* ------------------------------ */
22612    .balign 64
22613.L_ALT_OP_UNUSED_4FFF: /* 0x14f */
22614/* File: armv5te/alt_stub.S */
22615/*
22616 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22617 * any interesting requests and then jump to the real instruction
22618 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22619 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22620 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22621 * bail to the real handler if breakFlags==0.
22622 */
22623    ldrb   r3, [rSELF, #offThread_breakFlags]
22624    adrl   lr, dvmAsmInstructionStart + (335 * 64)
22625    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22626    cmp    r3, #0
22627    bxeq   lr                   @ nothing to do - jump to real handler
22628    EXPORT_PC()
22629    mov    r0, rPC              @ arg0
22630    mov    r1, rFP              @ arg1
22631    mov    r2, rSELF            @ arg2
22632    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22633
22634/* ------------------------------ */
22635    .balign 64
22636.L_ALT_OP_UNUSED_50FF: /* 0x150 */
22637/* File: armv5te/alt_stub.S */
22638/*
22639 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22640 * any interesting requests and then jump to the real instruction
22641 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22642 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22643 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22644 * bail to the real handler if breakFlags==0.
22645 */
22646    ldrb   r3, [rSELF, #offThread_breakFlags]
22647    adrl   lr, dvmAsmInstructionStart + (336 * 64)
22648    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22649    cmp    r3, #0
22650    bxeq   lr                   @ nothing to do - jump to real handler
22651    EXPORT_PC()
22652    mov    r0, rPC              @ arg0
22653    mov    r1, rFP              @ arg1
22654    mov    r2, rSELF            @ arg2
22655    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22656
22657/* ------------------------------ */
22658    .balign 64
22659.L_ALT_OP_UNUSED_51FF: /* 0x151 */
22660/* File: armv5te/alt_stub.S */
22661/*
22662 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22663 * any interesting requests and then jump to the real instruction
22664 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22665 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22666 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22667 * bail to the real handler if breakFlags==0.
22668 */
22669    ldrb   r3, [rSELF, #offThread_breakFlags]
22670    adrl   lr, dvmAsmInstructionStart + (337 * 64)
22671    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22672    cmp    r3, #0
22673    bxeq   lr                   @ nothing to do - jump to real handler
22674    EXPORT_PC()
22675    mov    r0, rPC              @ arg0
22676    mov    r1, rFP              @ arg1
22677    mov    r2, rSELF            @ arg2
22678    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22679
22680/* ------------------------------ */
22681    .balign 64
22682.L_ALT_OP_UNUSED_52FF: /* 0x152 */
22683/* File: armv5te/alt_stub.S */
22684/*
22685 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22686 * any interesting requests and then jump to the real instruction
22687 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22688 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22689 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22690 * bail to the real handler if breakFlags==0.
22691 */
22692    ldrb   r3, [rSELF, #offThread_breakFlags]
22693    adrl   lr, dvmAsmInstructionStart + (338 * 64)
22694    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22695    cmp    r3, #0
22696    bxeq   lr                   @ nothing to do - jump to real handler
22697    EXPORT_PC()
22698    mov    r0, rPC              @ arg0
22699    mov    r1, rFP              @ arg1
22700    mov    r2, rSELF            @ arg2
22701    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22702
22703/* ------------------------------ */
22704    .balign 64
22705.L_ALT_OP_UNUSED_53FF: /* 0x153 */
22706/* File: armv5te/alt_stub.S */
22707/*
22708 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22709 * any interesting requests and then jump to the real instruction
22710 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22711 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22712 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22713 * bail to the real handler if breakFlags==0.
22714 */
22715    ldrb   r3, [rSELF, #offThread_breakFlags]
22716    adrl   lr, dvmAsmInstructionStart + (339 * 64)
22717    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22718    cmp    r3, #0
22719    bxeq   lr                   @ nothing to do - jump to real handler
22720    EXPORT_PC()
22721    mov    r0, rPC              @ arg0
22722    mov    r1, rFP              @ arg1
22723    mov    r2, rSELF            @ arg2
22724    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22725
22726/* ------------------------------ */
22727    .balign 64
22728.L_ALT_OP_UNUSED_54FF: /* 0x154 */
22729/* File: armv5te/alt_stub.S */
22730/*
22731 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22732 * any interesting requests and then jump to the real instruction
22733 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22734 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22735 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22736 * bail to the real handler if breakFlags==0.
22737 */
22738    ldrb   r3, [rSELF, #offThread_breakFlags]
22739    adrl   lr, dvmAsmInstructionStart + (340 * 64)
22740    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22741    cmp    r3, #0
22742    bxeq   lr                   @ nothing to do - jump to real handler
22743    EXPORT_PC()
22744    mov    r0, rPC              @ arg0
22745    mov    r1, rFP              @ arg1
22746    mov    r2, rSELF            @ arg2
22747    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22748
22749/* ------------------------------ */
22750    .balign 64
22751.L_ALT_OP_UNUSED_55FF: /* 0x155 */
22752/* File: armv5te/alt_stub.S */
22753/*
22754 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22755 * any interesting requests and then jump to the real instruction
22756 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22757 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22758 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22759 * bail to the real handler if breakFlags==0.
22760 */
22761    ldrb   r3, [rSELF, #offThread_breakFlags]
22762    adrl   lr, dvmAsmInstructionStart + (341 * 64)
22763    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22764    cmp    r3, #0
22765    bxeq   lr                   @ nothing to do - jump to real handler
22766    EXPORT_PC()
22767    mov    r0, rPC              @ arg0
22768    mov    r1, rFP              @ arg1
22769    mov    r2, rSELF            @ arg2
22770    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22771
22772/* ------------------------------ */
22773    .balign 64
22774.L_ALT_OP_UNUSED_56FF: /* 0x156 */
22775/* File: armv5te/alt_stub.S */
22776/*
22777 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22778 * any interesting requests and then jump to the real instruction
22779 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22780 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22781 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22782 * bail to the real handler if breakFlags==0.
22783 */
22784    ldrb   r3, [rSELF, #offThread_breakFlags]
22785    adrl   lr, dvmAsmInstructionStart + (342 * 64)
22786    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22787    cmp    r3, #0
22788    bxeq   lr                   @ nothing to do - jump to real handler
22789    EXPORT_PC()
22790    mov    r0, rPC              @ arg0
22791    mov    r1, rFP              @ arg1
22792    mov    r2, rSELF            @ arg2
22793    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22794
22795/* ------------------------------ */
22796    .balign 64
22797.L_ALT_OP_UNUSED_57FF: /* 0x157 */
22798/* File: armv5te/alt_stub.S */
22799/*
22800 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22801 * any interesting requests and then jump to the real instruction
22802 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22803 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22804 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22805 * bail to the real handler if breakFlags==0.
22806 */
22807    ldrb   r3, [rSELF, #offThread_breakFlags]
22808    adrl   lr, dvmAsmInstructionStart + (343 * 64)
22809    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22810    cmp    r3, #0
22811    bxeq   lr                   @ nothing to do - jump to real handler
22812    EXPORT_PC()
22813    mov    r0, rPC              @ arg0
22814    mov    r1, rFP              @ arg1
22815    mov    r2, rSELF            @ arg2
22816    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22817
22818/* ------------------------------ */
22819    .balign 64
22820.L_ALT_OP_UNUSED_58FF: /* 0x158 */
22821/* File: armv5te/alt_stub.S */
22822/*
22823 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22824 * any interesting requests and then jump to the real instruction
22825 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22826 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22827 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22828 * bail to the real handler if breakFlags==0.
22829 */
22830    ldrb   r3, [rSELF, #offThread_breakFlags]
22831    adrl   lr, dvmAsmInstructionStart + (344 * 64)
22832    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22833    cmp    r3, #0
22834    bxeq   lr                   @ nothing to do - jump to real handler
22835    EXPORT_PC()
22836    mov    r0, rPC              @ arg0
22837    mov    r1, rFP              @ arg1
22838    mov    r2, rSELF            @ arg2
22839    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22840
22841/* ------------------------------ */
22842    .balign 64
22843.L_ALT_OP_UNUSED_59FF: /* 0x159 */
22844/* File: armv5te/alt_stub.S */
22845/*
22846 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22847 * any interesting requests and then jump to the real instruction
22848 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22849 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22850 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22851 * bail to the real handler if breakFlags==0.
22852 */
22853    ldrb   r3, [rSELF, #offThread_breakFlags]
22854    adrl   lr, dvmAsmInstructionStart + (345 * 64)
22855    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22856    cmp    r3, #0
22857    bxeq   lr                   @ nothing to do - jump to real handler
22858    EXPORT_PC()
22859    mov    r0, rPC              @ arg0
22860    mov    r1, rFP              @ arg1
22861    mov    r2, rSELF            @ arg2
22862    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22863
22864/* ------------------------------ */
22865    .balign 64
22866.L_ALT_OP_UNUSED_5AFF: /* 0x15a */
22867/* File: armv5te/alt_stub.S */
22868/*
22869 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22870 * any interesting requests and then jump to the real instruction
22871 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22872 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22873 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22874 * bail to the real handler if breakFlags==0.
22875 */
22876    ldrb   r3, [rSELF, #offThread_breakFlags]
22877    adrl   lr, dvmAsmInstructionStart + (346 * 64)
22878    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22879    cmp    r3, #0
22880    bxeq   lr                   @ nothing to do - jump to real handler
22881    EXPORT_PC()
22882    mov    r0, rPC              @ arg0
22883    mov    r1, rFP              @ arg1
22884    mov    r2, rSELF            @ arg2
22885    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22886
22887/* ------------------------------ */
22888    .balign 64
22889.L_ALT_OP_UNUSED_5BFF: /* 0x15b */
22890/* File: armv5te/alt_stub.S */
22891/*
22892 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22893 * any interesting requests and then jump to the real instruction
22894 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22895 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22896 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22897 * bail to the real handler if breakFlags==0.
22898 */
22899    ldrb   r3, [rSELF, #offThread_breakFlags]
22900    adrl   lr, dvmAsmInstructionStart + (347 * 64)
22901    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22902    cmp    r3, #0
22903    bxeq   lr                   @ nothing to do - jump to real handler
22904    EXPORT_PC()
22905    mov    r0, rPC              @ arg0
22906    mov    r1, rFP              @ arg1
22907    mov    r2, rSELF            @ arg2
22908    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22909
22910/* ------------------------------ */
22911    .balign 64
22912.L_ALT_OP_UNUSED_5CFF: /* 0x15c */
22913/* File: armv5te/alt_stub.S */
22914/*
22915 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22916 * any interesting requests and then jump to the real instruction
22917 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22918 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22919 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22920 * bail to the real handler if breakFlags==0.
22921 */
22922    ldrb   r3, [rSELF, #offThread_breakFlags]
22923    adrl   lr, dvmAsmInstructionStart + (348 * 64)
22924    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22925    cmp    r3, #0
22926    bxeq   lr                   @ nothing to do - jump to real handler
22927    EXPORT_PC()
22928    mov    r0, rPC              @ arg0
22929    mov    r1, rFP              @ arg1
22930    mov    r2, rSELF            @ arg2
22931    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22932
22933/* ------------------------------ */
22934    .balign 64
22935.L_ALT_OP_UNUSED_5DFF: /* 0x15d */
22936/* File: armv5te/alt_stub.S */
22937/*
22938 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22939 * any interesting requests and then jump to the real instruction
22940 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22941 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22942 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22943 * bail to the real handler if breakFlags==0.
22944 */
22945    ldrb   r3, [rSELF, #offThread_breakFlags]
22946    adrl   lr, dvmAsmInstructionStart + (349 * 64)
22947    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22948    cmp    r3, #0
22949    bxeq   lr                   @ nothing to do - jump to real handler
22950    EXPORT_PC()
22951    mov    r0, rPC              @ arg0
22952    mov    r1, rFP              @ arg1
22953    mov    r2, rSELF            @ arg2
22954    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22955
22956/* ------------------------------ */
22957    .balign 64
22958.L_ALT_OP_UNUSED_5EFF: /* 0x15e */
22959/* File: armv5te/alt_stub.S */
22960/*
22961 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22962 * any interesting requests and then jump to the real instruction
22963 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22964 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22965 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22966 * bail to the real handler if breakFlags==0.
22967 */
22968    ldrb   r3, [rSELF, #offThread_breakFlags]
22969    adrl   lr, dvmAsmInstructionStart + (350 * 64)
22970    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22971    cmp    r3, #0
22972    bxeq   lr                   @ nothing to do - jump to real handler
22973    EXPORT_PC()
22974    mov    r0, rPC              @ arg0
22975    mov    r1, rFP              @ arg1
22976    mov    r2, rSELF            @ arg2
22977    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22978
22979/* ------------------------------ */
22980    .balign 64
22981.L_ALT_OP_UNUSED_5FFF: /* 0x15f */
22982/* File: armv5te/alt_stub.S */
22983/*
22984 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22985 * any interesting requests and then jump to the real instruction
22986 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22987 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22988 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22989 * bail to the real handler if breakFlags==0.
22990 */
22991    ldrb   r3, [rSELF, #offThread_breakFlags]
22992    adrl   lr, dvmAsmInstructionStart + (351 * 64)
22993    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22994    cmp    r3, #0
22995    bxeq   lr                   @ nothing to do - jump to real handler
22996    EXPORT_PC()
22997    mov    r0, rPC              @ arg0
22998    mov    r1, rFP              @ arg1
22999    mov    r2, rSELF            @ arg2
23000    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23001
23002/* ------------------------------ */
23003    .balign 64
23004.L_ALT_OP_UNUSED_60FF: /* 0x160 */
23005/* File: armv5te/alt_stub.S */
23006/*
23007 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23008 * any interesting requests and then jump to the real instruction
23009 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23010 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23011 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23012 * bail to the real handler if breakFlags==0.
23013 */
23014    ldrb   r3, [rSELF, #offThread_breakFlags]
23015    adrl   lr, dvmAsmInstructionStart + (352 * 64)
23016    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23017    cmp    r3, #0
23018    bxeq   lr                   @ nothing to do - jump to real handler
23019    EXPORT_PC()
23020    mov    r0, rPC              @ arg0
23021    mov    r1, rFP              @ arg1
23022    mov    r2, rSELF            @ arg2
23023    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23024
23025/* ------------------------------ */
23026    .balign 64
23027.L_ALT_OP_UNUSED_61FF: /* 0x161 */
23028/* File: armv5te/alt_stub.S */
23029/*
23030 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23031 * any interesting requests and then jump to the real instruction
23032 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23033 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23034 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23035 * bail to the real handler if breakFlags==0.
23036 */
23037    ldrb   r3, [rSELF, #offThread_breakFlags]
23038    adrl   lr, dvmAsmInstructionStart + (353 * 64)
23039    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23040    cmp    r3, #0
23041    bxeq   lr                   @ nothing to do - jump to real handler
23042    EXPORT_PC()
23043    mov    r0, rPC              @ arg0
23044    mov    r1, rFP              @ arg1
23045    mov    r2, rSELF            @ arg2
23046    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23047
23048/* ------------------------------ */
23049    .balign 64
23050.L_ALT_OP_UNUSED_62FF: /* 0x162 */
23051/* File: armv5te/alt_stub.S */
23052/*
23053 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23054 * any interesting requests and then jump to the real instruction
23055 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23056 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23057 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23058 * bail to the real handler if breakFlags==0.
23059 */
23060    ldrb   r3, [rSELF, #offThread_breakFlags]
23061    adrl   lr, dvmAsmInstructionStart + (354 * 64)
23062    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23063    cmp    r3, #0
23064    bxeq   lr                   @ nothing to do - jump to real handler
23065    EXPORT_PC()
23066    mov    r0, rPC              @ arg0
23067    mov    r1, rFP              @ arg1
23068    mov    r2, rSELF            @ arg2
23069    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23070
23071/* ------------------------------ */
23072    .balign 64
23073.L_ALT_OP_UNUSED_63FF: /* 0x163 */
23074/* File: armv5te/alt_stub.S */
23075/*
23076 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23077 * any interesting requests and then jump to the real instruction
23078 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23079 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23080 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23081 * bail to the real handler if breakFlags==0.
23082 */
23083    ldrb   r3, [rSELF, #offThread_breakFlags]
23084    adrl   lr, dvmAsmInstructionStart + (355 * 64)
23085    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23086    cmp    r3, #0
23087    bxeq   lr                   @ nothing to do - jump to real handler
23088    EXPORT_PC()
23089    mov    r0, rPC              @ arg0
23090    mov    r1, rFP              @ arg1
23091    mov    r2, rSELF            @ arg2
23092    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23093
23094/* ------------------------------ */
23095    .balign 64
23096.L_ALT_OP_UNUSED_64FF: /* 0x164 */
23097/* File: armv5te/alt_stub.S */
23098/*
23099 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23100 * any interesting requests and then jump to the real instruction
23101 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23102 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23103 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23104 * bail to the real handler if breakFlags==0.
23105 */
23106    ldrb   r3, [rSELF, #offThread_breakFlags]
23107    adrl   lr, dvmAsmInstructionStart + (356 * 64)
23108    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23109    cmp    r3, #0
23110    bxeq   lr                   @ nothing to do - jump to real handler
23111    EXPORT_PC()
23112    mov    r0, rPC              @ arg0
23113    mov    r1, rFP              @ arg1
23114    mov    r2, rSELF            @ arg2
23115    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23116
23117/* ------------------------------ */
23118    .balign 64
23119.L_ALT_OP_UNUSED_65FF: /* 0x165 */
23120/* File: armv5te/alt_stub.S */
23121/*
23122 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23123 * any interesting requests and then jump to the real instruction
23124 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23125 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23126 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23127 * bail to the real handler if breakFlags==0.
23128 */
23129    ldrb   r3, [rSELF, #offThread_breakFlags]
23130    adrl   lr, dvmAsmInstructionStart + (357 * 64)
23131    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23132    cmp    r3, #0
23133    bxeq   lr                   @ nothing to do - jump to real handler
23134    EXPORT_PC()
23135    mov    r0, rPC              @ arg0
23136    mov    r1, rFP              @ arg1
23137    mov    r2, rSELF            @ arg2
23138    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23139
23140/* ------------------------------ */
23141    .balign 64
23142.L_ALT_OP_UNUSED_66FF: /* 0x166 */
23143/* File: armv5te/alt_stub.S */
23144/*
23145 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23146 * any interesting requests and then jump to the real instruction
23147 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23148 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23149 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23150 * bail to the real handler if breakFlags==0.
23151 */
23152    ldrb   r3, [rSELF, #offThread_breakFlags]
23153    adrl   lr, dvmAsmInstructionStart + (358 * 64)
23154    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23155    cmp    r3, #0
23156    bxeq   lr                   @ nothing to do - jump to real handler
23157    EXPORT_PC()
23158    mov    r0, rPC              @ arg0
23159    mov    r1, rFP              @ arg1
23160    mov    r2, rSELF            @ arg2
23161    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23162
23163/* ------------------------------ */
23164    .balign 64
23165.L_ALT_OP_UNUSED_67FF: /* 0x167 */
23166/* File: armv5te/alt_stub.S */
23167/*
23168 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23169 * any interesting requests and then jump to the real instruction
23170 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23171 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23172 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23173 * bail to the real handler if breakFlags==0.
23174 */
23175    ldrb   r3, [rSELF, #offThread_breakFlags]
23176    adrl   lr, dvmAsmInstructionStart + (359 * 64)
23177    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23178    cmp    r3, #0
23179    bxeq   lr                   @ nothing to do - jump to real handler
23180    EXPORT_PC()
23181    mov    r0, rPC              @ arg0
23182    mov    r1, rFP              @ arg1
23183    mov    r2, rSELF            @ arg2
23184    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23185
23186/* ------------------------------ */
23187    .balign 64
23188.L_ALT_OP_UNUSED_68FF: /* 0x168 */
23189/* File: armv5te/alt_stub.S */
23190/*
23191 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23192 * any interesting requests and then jump to the real instruction
23193 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23194 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23195 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23196 * bail to the real handler if breakFlags==0.
23197 */
23198    ldrb   r3, [rSELF, #offThread_breakFlags]
23199    adrl   lr, dvmAsmInstructionStart + (360 * 64)
23200    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23201    cmp    r3, #0
23202    bxeq   lr                   @ nothing to do - jump to real handler
23203    EXPORT_PC()
23204    mov    r0, rPC              @ arg0
23205    mov    r1, rFP              @ arg1
23206    mov    r2, rSELF            @ arg2
23207    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23208
23209/* ------------------------------ */
23210    .balign 64
23211.L_ALT_OP_UNUSED_69FF: /* 0x169 */
23212/* File: armv5te/alt_stub.S */
23213/*
23214 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23215 * any interesting requests and then jump to the real instruction
23216 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23217 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23218 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23219 * bail to the real handler if breakFlags==0.
23220 */
23221    ldrb   r3, [rSELF, #offThread_breakFlags]
23222    adrl   lr, dvmAsmInstructionStart + (361 * 64)
23223    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23224    cmp    r3, #0
23225    bxeq   lr                   @ nothing to do - jump to real handler
23226    EXPORT_PC()
23227    mov    r0, rPC              @ arg0
23228    mov    r1, rFP              @ arg1
23229    mov    r2, rSELF            @ arg2
23230    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23231
23232/* ------------------------------ */
23233    .balign 64
23234.L_ALT_OP_UNUSED_6AFF: /* 0x16a */
23235/* File: armv5te/alt_stub.S */
23236/*
23237 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23238 * any interesting requests and then jump to the real instruction
23239 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23240 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23241 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23242 * bail to the real handler if breakFlags==0.
23243 */
23244    ldrb   r3, [rSELF, #offThread_breakFlags]
23245    adrl   lr, dvmAsmInstructionStart + (362 * 64)
23246    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23247    cmp    r3, #0
23248    bxeq   lr                   @ nothing to do - jump to real handler
23249    EXPORT_PC()
23250    mov    r0, rPC              @ arg0
23251    mov    r1, rFP              @ arg1
23252    mov    r2, rSELF            @ arg2
23253    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23254
23255/* ------------------------------ */
23256    .balign 64
23257.L_ALT_OP_UNUSED_6BFF: /* 0x16b */
23258/* File: armv5te/alt_stub.S */
23259/*
23260 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23261 * any interesting requests and then jump to the real instruction
23262 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23263 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23264 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23265 * bail to the real handler if breakFlags==0.
23266 */
23267    ldrb   r3, [rSELF, #offThread_breakFlags]
23268    adrl   lr, dvmAsmInstructionStart + (363 * 64)
23269    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23270    cmp    r3, #0
23271    bxeq   lr                   @ nothing to do - jump to real handler
23272    EXPORT_PC()
23273    mov    r0, rPC              @ arg0
23274    mov    r1, rFP              @ arg1
23275    mov    r2, rSELF            @ arg2
23276    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23277
23278/* ------------------------------ */
23279    .balign 64
23280.L_ALT_OP_UNUSED_6CFF: /* 0x16c */
23281/* File: armv5te/alt_stub.S */
23282/*
23283 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23284 * any interesting requests and then jump to the real instruction
23285 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23286 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23287 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23288 * bail to the real handler if breakFlags==0.
23289 */
23290    ldrb   r3, [rSELF, #offThread_breakFlags]
23291    adrl   lr, dvmAsmInstructionStart + (364 * 64)
23292    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23293    cmp    r3, #0
23294    bxeq   lr                   @ nothing to do - jump to real handler
23295    EXPORT_PC()
23296    mov    r0, rPC              @ arg0
23297    mov    r1, rFP              @ arg1
23298    mov    r2, rSELF            @ arg2
23299    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23300
23301/* ------------------------------ */
23302    .balign 64
23303.L_ALT_OP_UNUSED_6DFF: /* 0x16d */
23304/* File: armv5te/alt_stub.S */
23305/*
23306 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23307 * any interesting requests and then jump to the real instruction
23308 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23309 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23310 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23311 * bail to the real handler if breakFlags==0.
23312 */
23313    ldrb   r3, [rSELF, #offThread_breakFlags]
23314    adrl   lr, dvmAsmInstructionStart + (365 * 64)
23315    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23316    cmp    r3, #0
23317    bxeq   lr                   @ nothing to do - jump to real handler
23318    EXPORT_PC()
23319    mov    r0, rPC              @ arg0
23320    mov    r1, rFP              @ arg1
23321    mov    r2, rSELF            @ arg2
23322    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23323
23324/* ------------------------------ */
23325    .balign 64
23326.L_ALT_OP_UNUSED_6EFF: /* 0x16e */
23327/* File: armv5te/alt_stub.S */
23328/*
23329 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23330 * any interesting requests and then jump to the real instruction
23331 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23332 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23333 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23334 * bail to the real handler if breakFlags==0.
23335 */
23336    ldrb   r3, [rSELF, #offThread_breakFlags]
23337    adrl   lr, dvmAsmInstructionStart + (366 * 64)
23338    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23339    cmp    r3, #0
23340    bxeq   lr                   @ nothing to do - jump to real handler
23341    EXPORT_PC()
23342    mov    r0, rPC              @ arg0
23343    mov    r1, rFP              @ arg1
23344    mov    r2, rSELF            @ arg2
23345    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23346
23347/* ------------------------------ */
23348    .balign 64
23349.L_ALT_OP_UNUSED_6FFF: /* 0x16f */
23350/* File: armv5te/alt_stub.S */
23351/*
23352 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23353 * any interesting requests and then jump to the real instruction
23354 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23355 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23356 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23357 * bail to the real handler if breakFlags==0.
23358 */
23359    ldrb   r3, [rSELF, #offThread_breakFlags]
23360    adrl   lr, dvmAsmInstructionStart + (367 * 64)
23361    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23362    cmp    r3, #0
23363    bxeq   lr                   @ nothing to do - jump to real handler
23364    EXPORT_PC()
23365    mov    r0, rPC              @ arg0
23366    mov    r1, rFP              @ arg1
23367    mov    r2, rSELF            @ arg2
23368    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23369
23370/* ------------------------------ */
23371    .balign 64
23372.L_ALT_OP_UNUSED_70FF: /* 0x170 */
23373/* File: armv5te/alt_stub.S */
23374/*
23375 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23376 * any interesting requests and then jump to the real instruction
23377 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23378 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23379 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23380 * bail to the real handler if breakFlags==0.
23381 */
23382    ldrb   r3, [rSELF, #offThread_breakFlags]
23383    adrl   lr, dvmAsmInstructionStart + (368 * 64)
23384    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23385    cmp    r3, #0
23386    bxeq   lr                   @ nothing to do - jump to real handler
23387    EXPORT_PC()
23388    mov    r0, rPC              @ arg0
23389    mov    r1, rFP              @ arg1
23390    mov    r2, rSELF            @ arg2
23391    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23392
23393/* ------------------------------ */
23394    .balign 64
23395.L_ALT_OP_UNUSED_71FF: /* 0x171 */
23396/* File: armv5te/alt_stub.S */
23397/*
23398 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23399 * any interesting requests and then jump to the real instruction
23400 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23401 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23402 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23403 * bail to the real handler if breakFlags==0.
23404 */
23405    ldrb   r3, [rSELF, #offThread_breakFlags]
23406    adrl   lr, dvmAsmInstructionStart + (369 * 64)
23407    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23408    cmp    r3, #0
23409    bxeq   lr                   @ nothing to do - jump to real handler
23410    EXPORT_PC()
23411    mov    r0, rPC              @ arg0
23412    mov    r1, rFP              @ arg1
23413    mov    r2, rSELF            @ arg2
23414    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23415
23416/* ------------------------------ */
23417    .balign 64
23418.L_ALT_OP_UNUSED_72FF: /* 0x172 */
23419/* File: armv5te/alt_stub.S */
23420/*
23421 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23422 * any interesting requests and then jump to the real instruction
23423 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23424 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23425 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23426 * bail to the real handler if breakFlags==0.
23427 */
23428    ldrb   r3, [rSELF, #offThread_breakFlags]
23429    adrl   lr, dvmAsmInstructionStart + (370 * 64)
23430    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23431    cmp    r3, #0
23432    bxeq   lr                   @ nothing to do - jump to real handler
23433    EXPORT_PC()
23434    mov    r0, rPC              @ arg0
23435    mov    r1, rFP              @ arg1
23436    mov    r2, rSELF            @ arg2
23437    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23438
23439/* ------------------------------ */
23440    .balign 64
23441.L_ALT_OP_UNUSED_73FF: /* 0x173 */
23442/* File: armv5te/alt_stub.S */
23443/*
23444 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23445 * any interesting requests and then jump to the real instruction
23446 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23447 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23448 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23449 * bail to the real handler if breakFlags==0.
23450 */
23451    ldrb   r3, [rSELF, #offThread_breakFlags]
23452    adrl   lr, dvmAsmInstructionStart + (371 * 64)
23453    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23454    cmp    r3, #0
23455    bxeq   lr                   @ nothing to do - jump to real handler
23456    EXPORT_PC()
23457    mov    r0, rPC              @ arg0
23458    mov    r1, rFP              @ arg1
23459    mov    r2, rSELF            @ arg2
23460    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23461
23462/* ------------------------------ */
23463    .balign 64
23464.L_ALT_OP_UNUSED_74FF: /* 0x174 */
23465/* File: armv5te/alt_stub.S */
23466/*
23467 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23468 * any interesting requests and then jump to the real instruction
23469 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23470 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23471 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23472 * bail to the real handler if breakFlags==0.
23473 */
23474    ldrb   r3, [rSELF, #offThread_breakFlags]
23475    adrl   lr, dvmAsmInstructionStart + (372 * 64)
23476    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23477    cmp    r3, #0
23478    bxeq   lr                   @ nothing to do - jump to real handler
23479    EXPORT_PC()
23480    mov    r0, rPC              @ arg0
23481    mov    r1, rFP              @ arg1
23482    mov    r2, rSELF            @ arg2
23483    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23484
23485/* ------------------------------ */
23486    .balign 64
23487.L_ALT_OP_UNUSED_75FF: /* 0x175 */
23488/* File: armv5te/alt_stub.S */
23489/*
23490 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23491 * any interesting requests and then jump to the real instruction
23492 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23493 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23494 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23495 * bail to the real handler if breakFlags==0.
23496 */
23497    ldrb   r3, [rSELF, #offThread_breakFlags]
23498    adrl   lr, dvmAsmInstructionStart + (373 * 64)
23499    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23500    cmp    r3, #0
23501    bxeq   lr                   @ nothing to do - jump to real handler
23502    EXPORT_PC()
23503    mov    r0, rPC              @ arg0
23504    mov    r1, rFP              @ arg1
23505    mov    r2, rSELF            @ arg2
23506    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23507
23508/* ------------------------------ */
23509    .balign 64
23510.L_ALT_OP_UNUSED_76FF: /* 0x176 */
23511/* File: armv5te/alt_stub.S */
23512/*
23513 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23514 * any interesting requests and then jump to the real instruction
23515 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23516 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23517 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23518 * bail to the real handler if breakFlags==0.
23519 */
23520    ldrb   r3, [rSELF, #offThread_breakFlags]
23521    adrl   lr, dvmAsmInstructionStart + (374 * 64)
23522    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23523    cmp    r3, #0
23524    bxeq   lr                   @ nothing to do - jump to real handler
23525    EXPORT_PC()
23526    mov    r0, rPC              @ arg0
23527    mov    r1, rFP              @ arg1
23528    mov    r2, rSELF            @ arg2
23529    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23530
23531/* ------------------------------ */
23532    .balign 64
23533.L_ALT_OP_UNUSED_77FF: /* 0x177 */
23534/* File: armv5te/alt_stub.S */
23535/*
23536 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23537 * any interesting requests and then jump to the real instruction
23538 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23539 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23540 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23541 * bail to the real handler if breakFlags==0.
23542 */
23543    ldrb   r3, [rSELF, #offThread_breakFlags]
23544    adrl   lr, dvmAsmInstructionStart + (375 * 64)
23545    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23546    cmp    r3, #0
23547    bxeq   lr                   @ nothing to do - jump to real handler
23548    EXPORT_PC()
23549    mov    r0, rPC              @ arg0
23550    mov    r1, rFP              @ arg1
23551    mov    r2, rSELF            @ arg2
23552    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23553
23554/* ------------------------------ */
23555    .balign 64
23556.L_ALT_OP_UNUSED_78FF: /* 0x178 */
23557/* File: armv5te/alt_stub.S */
23558/*
23559 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23560 * any interesting requests and then jump to the real instruction
23561 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23562 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23563 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23564 * bail to the real handler if breakFlags==0.
23565 */
23566    ldrb   r3, [rSELF, #offThread_breakFlags]
23567    adrl   lr, dvmAsmInstructionStart + (376 * 64)
23568    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23569    cmp    r3, #0
23570    bxeq   lr                   @ nothing to do - jump to real handler
23571    EXPORT_PC()
23572    mov    r0, rPC              @ arg0
23573    mov    r1, rFP              @ arg1
23574    mov    r2, rSELF            @ arg2
23575    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23576
23577/* ------------------------------ */
23578    .balign 64
23579.L_ALT_OP_UNUSED_79FF: /* 0x179 */
23580/* File: armv5te/alt_stub.S */
23581/*
23582 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23583 * any interesting requests and then jump to the real instruction
23584 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23585 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23586 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23587 * bail to the real handler if breakFlags==0.
23588 */
23589    ldrb   r3, [rSELF, #offThread_breakFlags]
23590    adrl   lr, dvmAsmInstructionStart + (377 * 64)
23591    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23592    cmp    r3, #0
23593    bxeq   lr                   @ nothing to do - jump to real handler
23594    EXPORT_PC()
23595    mov    r0, rPC              @ arg0
23596    mov    r1, rFP              @ arg1
23597    mov    r2, rSELF            @ arg2
23598    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23599
23600/* ------------------------------ */
23601    .balign 64
23602.L_ALT_OP_UNUSED_7AFF: /* 0x17a */
23603/* File: armv5te/alt_stub.S */
23604/*
23605 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23606 * any interesting requests and then jump to the real instruction
23607 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23608 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23609 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23610 * bail to the real handler if breakFlags==0.
23611 */
23612    ldrb   r3, [rSELF, #offThread_breakFlags]
23613    adrl   lr, dvmAsmInstructionStart + (378 * 64)
23614    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23615    cmp    r3, #0
23616    bxeq   lr                   @ nothing to do - jump to real handler
23617    EXPORT_PC()
23618    mov    r0, rPC              @ arg0
23619    mov    r1, rFP              @ arg1
23620    mov    r2, rSELF            @ arg2
23621    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23622
23623/* ------------------------------ */
23624    .balign 64
23625.L_ALT_OP_UNUSED_7BFF: /* 0x17b */
23626/* File: armv5te/alt_stub.S */
23627/*
23628 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23629 * any interesting requests and then jump to the real instruction
23630 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23631 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23632 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23633 * bail to the real handler if breakFlags==0.
23634 */
23635    ldrb   r3, [rSELF, #offThread_breakFlags]
23636    adrl   lr, dvmAsmInstructionStart + (379 * 64)
23637    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23638    cmp    r3, #0
23639    bxeq   lr                   @ nothing to do - jump to real handler
23640    EXPORT_PC()
23641    mov    r0, rPC              @ arg0
23642    mov    r1, rFP              @ arg1
23643    mov    r2, rSELF            @ arg2
23644    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23645
23646/* ------------------------------ */
23647    .balign 64
23648.L_ALT_OP_UNUSED_7CFF: /* 0x17c */
23649/* File: armv5te/alt_stub.S */
23650/*
23651 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23652 * any interesting requests and then jump to the real instruction
23653 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23654 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23655 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23656 * bail to the real handler if breakFlags==0.
23657 */
23658    ldrb   r3, [rSELF, #offThread_breakFlags]
23659    adrl   lr, dvmAsmInstructionStart + (380 * 64)
23660    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23661    cmp    r3, #0
23662    bxeq   lr                   @ nothing to do - jump to real handler
23663    EXPORT_PC()
23664    mov    r0, rPC              @ arg0
23665    mov    r1, rFP              @ arg1
23666    mov    r2, rSELF            @ arg2
23667    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23668
23669/* ------------------------------ */
23670    .balign 64
23671.L_ALT_OP_UNUSED_7DFF: /* 0x17d */
23672/* File: armv5te/alt_stub.S */
23673/*
23674 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23675 * any interesting requests and then jump to the real instruction
23676 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23677 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23678 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23679 * bail to the real handler if breakFlags==0.
23680 */
23681    ldrb   r3, [rSELF, #offThread_breakFlags]
23682    adrl   lr, dvmAsmInstructionStart + (381 * 64)
23683    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23684    cmp    r3, #0
23685    bxeq   lr                   @ nothing to do - jump to real handler
23686    EXPORT_PC()
23687    mov    r0, rPC              @ arg0
23688    mov    r1, rFP              @ arg1
23689    mov    r2, rSELF            @ arg2
23690    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23691
23692/* ------------------------------ */
23693    .balign 64
23694.L_ALT_OP_UNUSED_7EFF: /* 0x17e */
23695/* File: armv5te/alt_stub.S */
23696/*
23697 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23698 * any interesting requests and then jump to the real instruction
23699 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23700 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23701 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23702 * bail to the real handler if breakFlags==0.
23703 */
23704    ldrb   r3, [rSELF, #offThread_breakFlags]
23705    adrl   lr, dvmAsmInstructionStart + (382 * 64)
23706    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23707    cmp    r3, #0
23708    bxeq   lr                   @ nothing to do - jump to real handler
23709    EXPORT_PC()
23710    mov    r0, rPC              @ arg0
23711    mov    r1, rFP              @ arg1
23712    mov    r2, rSELF            @ arg2
23713    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23714
23715/* ------------------------------ */
23716    .balign 64
23717.L_ALT_OP_UNUSED_7FFF: /* 0x17f */
23718/* File: armv5te/alt_stub.S */
23719/*
23720 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23721 * any interesting requests and then jump to the real instruction
23722 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23723 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23724 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23725 * bail to the real handler if breakFlags==0.
23726 */
23727    ldrb   r3, [rSELF, #offThread_breakFlags]
23728    adrl   lr, dvmAsmInstructionStart + (383 * 64)
23729    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23730    cmp    r3, #0
23731    bxeq   lr                   @ nothing to do - jump to real handler
23732    EXPORT_PC()
23733    mov    r0, rPC              @ arg0
23734    mov    r1, rFP              @ arg1
23735    mov    r2, rSELF            @ arg2
23736    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23737
23738/* ------------------------------ */
23739    .balign 64
23740.L_ALT_OP_UNUSED_80FF: /* 0x180 */
23741/* File: armv5te/alt_stub.S */
23742/*
23743 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23744 * any interesting requests and then jump to the real instruction
23745 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23746 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23747 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23748 * bail to the real handler if breakFlags==0.
23749 */
23750    ldrb   r3, [rSELF, #offThread_breakFlags]
23751    adrl   lr, dvmAsmInstructionStart + (384 * 64)
23752    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23753    cmp    r3, #0
23754    bxeq   lr                   @ nothing to do - jump to real handler
23755    EXPORT_PC()
23756    mov    r0, rPC              @ arg0
23757    mov    r1, rFP              @ arg1
23758    mov    r2, rSELF            @ arg2
23759    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23760
23761/* ------------------------------ */
23762    .balign 64
23763.L_ALT_OP_UNUSED_81FF: /* 0x181 */
23764/* File: armv5te/alt_stub.S */
23765/*
23766 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23767 * any interesting requests and then jump to the real instruction
23768 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23769 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23770 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23771 * bail to the real handler if breakFlags==0.
23772 */
23773    ldrb   r3, [rSELF, #offThread_breakFlags]
23774    adrl   lr, dvmAsmInstructionStart + (385 * 64)
23775    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23776    cmp    r3, #0
23777    bxeq   lr                   @ nothing to do - jump to real handler
23778    EXPORT_PC()
23779    mov    r0, rPC              @ arg0
23780    mov    r1, rFP              @ arg1
23781    mov    r2, rSELF            @ arg2
23782    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23783
23784/* ------------------------------ */
23785    .balign 64
23786.L_ALT_OP_UNUSED_82FF: /* 0x182 */
23787/* File: armv5te/alt_stub.S */
23788/*
23789 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23790 * any interesting requests and then jump to the real instruction
23791 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23792 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23793 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23794 * bail to the real handler if breakFlags==0.
23795 */
23796    ldrb   r3, [rSELF, #offThread_breakFlags]
23797    adrl   lr, dvmAsmInstructionStart + (386 * 64)
23798    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23799    cmp    r3, #0
23800    bxeq   lr                   @ nothing to do - jump to real handler
23801    EXPORT_PC()
23802    mov    r0, rPC              @ arg0
23803    mov    r1, rFP              @ arg1
23804    mov    r2, rSELF            @ arg2
23805    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23806
23807/* ------------------------------ */
23808    .balign 64
23809.L_ALT_OP_UNUSED_83FF: /* 0x183 */
23810/* File: armv5te/alt_stub.S */
23811/*
23812 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23813 * any interesting requests and then jump to the real instruction
23814 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23815 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23816 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23817 * bail to the real handler if breakFlags==0.
23818 */
23819    ldrb   r3, [rSELF, #offThread_breakFlags]
23820    adrl   lr, dvmAsmInstructionStart + (387 * 64)
23821    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23822    cmp    r3, #0
23823    bxeq   lr                   @ nothing to do - jump to real handler
23824    EXPORT_PC()
23825    mov    r0, rPC              @ arg0
23826    mov    r1, rFP              @ arg1
23827    mov    r2, rSELF            @ arg2
23828    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23829
23830/* ------------------------------ */
23831    .balign 64
23832.L_ALT_OP_UNUSED_84FF: /* 0x184 */
23833/* File: armv5te/alt_stub.S */
23834/*
23835 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23836 * any interesting requests and then jump to the real instruction
23837 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23838 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23839 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23840 * bail to the real handler if breakFlags==0.
23841 */
23842    ldrb   r3, [rSELF, #offThread_breakFlags]
23843    adrl   lr, dvmAsmInstructionStart + (388 * 64)
23844    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23845    cmp    r3, #0
23846    bxeq   lr                   @ nothing to do - jump to real handler
23847    EXPORT_PC()
23848    mov    r0, rPC              @ arg0
23849    mov    r1, rFP              @ arg1
23850    mov    r2, rSELF            @ arg2
23851    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23852
23853/* ------------------------------ */
23854    .balign 64
23855.L_ALT_OP_UNUSED_85FF: /* 0x185 */
23856/* File: armv5te/alt_stub.S */
23857/*
23858 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23859 * any interesting requests and then jump to the real instruction
23860 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23861 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23862 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23863 * bail to the real handler if breakFlags==0.
23864 */
23865    ldrb   r3, [rSELF, #offThread_breakFlags]
23866    adrl   lr, dvmAsmInstructionStart + (389 * 64)
23867    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23868    cmp    r3, #0
23869    bxeq   lr                   @ nothing to do - jump to real handler
23870    EXPORT_PC()
23871    mov    r0, rPC              @ arg0
23872    mov    r1, rFP              @ arg1
23873    mov    r2, rSELF            @ arg2
23874    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23875
23876/* ------------------------------ */
23877    .balign 64
23878.L_ALT_OP_UNUSED_86FF: /* 0x186 */
23879/* File: armv5te/alt_stub.S */
23880/*
23881 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23882 * any interesting requests and then jump to the real instruction
23883 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23884 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23885 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23886 * bail to the real handler if breakFlags==0.
23887 */
23888    ldrb   r3, [rSELF, #offThread_breakFlags]
23889    adrl   lr, dvmAsmInstructionStart + (390 * 64)
23890    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23891    cmp    r3, #0
23892    bxeq   lr                   @ nothing to do - jump to real handler
23893    EXPORT_PC()
23894    mov    r0, rPC              @ arg0
23895    mov    r1, rFP              @ arg1
23896    mov    r2, rSELF            @ arg2
23897    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23898
23899/* ------------------------------ */
23900    .balign 64
23901.L_ALT_OP_UNUSED_87FF: /* 0x187 */
23902/* File: armv5te/alt_stub.S */
23903/*
23904 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23905 * any interesting requests and then jump to the real instruction
23906 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23907 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23908 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23909 * bail to the real handler if breakFlags==0.
23910 */
23911    ldrb   r3, [rSELF, #offThread_breakFlags]
23912    adrl   lr, dvmAsmInstructionStart + (391 * 64)
23913    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23914    cmp    r3, #0
23915    bxeq   lr                   @ nothing to do - jump to real handler
23916    EXPORT_PC()
23917    mov    r0, rPC              @ arg0
23918    mov    r1, rFP              @ arg1
23919    mov    r2, rSELF            @ arg2
23920    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23921
23922/* ------------------------------ */
23923    .balign 64
23924.L_ALT_OP_UNUSED_88FF: /* 0x188 */
23925/* File: armv5te/alt_stub.S */
23926/*
23927 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23928 * any interesting requests and then jump to the real instruction
23929 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23930 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23931 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23932 * bail to the real handler if breakFlags==0.
23933 */
23934    ldrb   r3, [rSELF, #offThread_breakFlags]
23935    adrl   lr, dvmAsmInstructionStart + (392 * 64)
23936    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23937    cmp    r3, #0
23938    bxeq   lr                   @ nothing to do - jump to real handler
23939    EXPORT_PC()
23940    mov    r0, rPC              @ arg0
23941    mov    r1, rFP              @ arg1
23942    mov    r2, rSELF            @ arg2
23943    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23944
23945/* ------------------------------ */
23946    .balign 64
23947.L_ALT_OP_UNUSED_89FF: /* 0x189 */
23948/* File: armv5te/alt_stub.S */
23949/*
23950 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23951 * any interesting requests and then jump to the real instruction
23952 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23953 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23954 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23955 * bail to the real handler if breakFlags==0.
23956 */
23957    ldrb   r3, [rSELF, #offThread_breakFlags]
23958    adrl   lr, dvmAsmInstructionStart + (393 * 64)
23959    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23960    cmp    r3, #0
23961    bxeq   lr                   @ nothing to do - jump to real handler
23962    EXPORT_PC()
23963    mov    r0, rPC              @ arg0
23964    mov    r1, rFP              @ arg1
23965    mov    r2, rSELF            @ arg2
23966    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23967
23968/* ------------------------------ */
23969    .balign 64
23970.L_ALT_OP_UNUSED_8AFF: /* 0x18a */
23971/* File: armv5te/alt_stub.S */
23972/*
23973 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23974 * any interesting requests and then jump to the real instruction
23975 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23976 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23977 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23978 * bail to the real handler if breakFlags==0.
23979 */
23980    ldrb   r3, [rSELF, #offThread_breakFlags]
23981    adrl   lr, dvmAsmInstructionStart + (394 * 64)
23982    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23983    cmp    r3, #0
23984    bxeq   lr                   @ nothing to do - jump to real handler
23985    EXPORT_PC()
23986    mov    r0, rPC              @ arg0
23987    mov    r1, rFP              @ arg1
23988    mov    r2, rSELF            @ arg2
23989    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23990
23991/* ------------------------------ */
23992    .balign 64
23993.L_ALT_OP_UNUSED_8BFF: /* 0x18b */
23994/* File: armv5te/alt_stub.S */
23995/*
23996 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23997 * any interesting requests and then jump to the real instruction
23998 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23999 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24000 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24001 * bail to the real handler if breakFlags==0.
24002 */
24003    ldrb   r3, [rSELF, #offThread_breakFlags]
24004    adrl   lr, dvmAsmInstructionStart + (395 * 64)
24005    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24006    cmp    r3, #0
24007    bxeq   lr                   @ nothing to do - jump to real handler
24008    EXPORT_PC()
24009    mov    r0, rPC              @ arg0
24010    mov    r1, rFP              @ arg1
24011    mov    r2, rSELF            @ arg2
24012    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24013
24014/* ------------------------------ */
24015    .balign 64
24016.L_ALT_OP_UNUSED_8CFF: /* 0x18c */
24017/* File: armv5te/alt_stub.S */
24018/*
24019 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24020 * any interesting requests and then jump to the real instruction
24021 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24022 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24023 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24024 * bail to the real handler if breakFlags==0.
24025 */
24026    ldrb   r3, [rSELF, #offThread_breakFlags]
24027    adrl   lr, dvmAsmInstructionStart + (396 * 64)
24028    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24029    cmp    r3, #0
24030    bxeq   lr                   @ nothing to do - jump to real handler
24031    EXPORT_PC()
24032    mov    r0, rPC              @ arg0
24033    mov    r1, rFP              @ arg1
24034    mov    r2, rSELF            @ arg2
24035    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24036
24037/* ------------------------------ */
24038    .balign 64
24039.L_ALT_OP_UNUSED_8DFF: /* 0x18d */
24040/* File: armv5te/alt_stub.S */
24041/*
24042 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24043 * any interesting requests and then jump to the real instruction
24044 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24045 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24046 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24047 * bail to the real handler if breakFlags==0.
24048 */
24049    ldrb   r3, [rSELF, #offThread_breakFlags]
24050    adrl   lr, dvmAsmInstructionStart + (397 * 64)
24051    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24052    cmp    r3, #0
24053    bxeq   lr                   @ nothing to do - jump to real handler
24054    EXPORT_PC()
24055    mov    r0, rPC              @ arg0
24056    mov    r1, rFP              @ arg1
24057    mov    r2, rSELF            @ arg2
24058    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24059
24060/* ------------------------------ */
24061    .balign 64
24062.L_ALT_OP_UNUSED_8EFF: /* 0x18e */
24063/* File: armv5te/alt_stub.S */
24064/*
24065 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24066 * any interesting requests and then jump to the real instruction
24067 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24068 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24069 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24070 * bail to the real handler if breakFlags==0.
24071 */
24072    ldrb   r3, [rSELF, #offThread_breakFlags]
24073    adrl   lr, dvmAsmInstructionStart + (398 * 64)
24074    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24075    cmp    r3, #0
24076    bxeq   lr                   @ nothing to do - jump to real handler
24077    EXPORT_PC()
24078    mov    r0, rPC              @ arg0
24079    mov    r1, rFP              @ arg1
24080    mov    r2, rSELF            @ arg2
24081    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24082
24083/* ------------------------------ */
24084    .balign 64
24085.L_ALT_OP_UNUSED_8FFF: /* 0x18f */
24086/* File: armv5te/alt_stub.S */
24087/*
24088 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24089 * any interesting requests and then jump to the real instruction
24090 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24091 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24092 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24093 * bail to the real handler if breakFlags==0.
24094 */
24095    ldrb   r3, [rSELF, #offThread_breakFlags]
24096    adrl   lr, dvmAsmInstructionStart + (399 * 64)
24097    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24098    cmp    r3, #0
24099    bxeq   lr                   @ nothing to do - jump to real handler
24100    EXPORT_PC()
24101    mov    r0, rPC              @ arg0
24102    mov    r1, rFP              @ arg1
24103    mov    r2, rSELF            @ arg2
24104    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24105
24106/* ------------------------------ */
24107    .balign 64
24108.L_ALT_OP_UNUSED_90FF: /* 0x190 */
24109/* File: armv5te/alt_stub.S */
24110/*
24111 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24112 * any interesting requests and then jump to the real instruction
24113 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24114 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24115 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24116 * bail to the real handler if breakFlags==0.
24117 */
24118    ldrb   r3, [rSELF, #offThread_breakFlags]
24119    adrl   lr, dvmAsmInstructionStart + (400 * 64)
24120    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24121    cmp    r3, #0
24122    bxeq   lr                   @ nothing to do - jump to real handler
24123    EXPORT_PC()
24124    mov    r0, rPC              @ arg0
24125    mov    r1, rFP              @ arg1
24126    mov    r2, rSELF            @ arg2
24127    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24128
24129/* ------------------------------ */
24130    .balign 64
24131.L_ALT_OP_UNUSED_91FF: /* 0x191 */
24132/* File: armv5te/alt_stub.S */
24133/*
24134 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24135 * any interesting requests and then jump to the real instruction
24136 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24137 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24138 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24139 * bail to the real handler if breakFlags==0.
24140 */
24141    ldrb   r3, [rSELF, #offThread_breakFlags]
24142    adrl   lr, dvmAsmInstructionStart + (401 * 64)
24143    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24144    cmp    r3, #0
24145    bxeq   lr                   @ nothing to do - jump to real handler
24146    EXPORT_PC()
24147    mov    r0, rPC              @ arg0
24148    mov    r1, rFP              @ arg1
24149    mov    r2, rSELF            @ arg2
24150    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24151
24152/* ------------------------------ */
24153    .balign 64
24154.L_ALT_OP_UNUSED_92FF: /* 0x192 */
24155/* File: armv5te/alt_stub.S */
24156/*
24157 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24158 * any interesting requests and then jump to the real instruction
24159 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24160 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24161 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24162 * bail to the real handler if breakFlags==0.
24163 */
24164    ldrb   r3, [rSELF, #offThread_breakFlags]
24165    adrl   lr, dvmAsmInstructionStart + (402 * 64)
24166    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24167    cmp    r3, #0
24168    bxeq   lr                   @ nothing to do - jump to real handler
24169    EXPORT_PC()
24170    mov    r0, rPC              @ arg0
24171    mov    r1, rFP              @ arg1
24172    mov    r2, rSELF            @ arg2
24173    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24174
24175/* ------------------------------ */
24176    .balign 64
24177.L_ALT_OP_UNUSED_93FF: /* 0x193 */
24178/* File: armv5te/alt_stub.S */
24179/*
24180 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24181 * any interesting requests and then jump to the real instruction
24182 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24183 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24184 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24185 * bail to the real handler if breakFlags==0.
24186 */
24187    ldrb   r3, [rSELF, #offThread_breakFlags]
24188    adrl   lr, dvmAsmInstructionStart + (403 * 64)
24189    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24190    cmp    r3, #0
24191    bxeq   lr                   @ nothing to do - jump to real handler
24192    EXPORT_PC()
24193    mov    r0, rPC              @ arg0
24194    mov    r1, rFP              @ arg1
24195    mov    r2, rSELF            @ arg2
24196    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24197
24198/* ------------------------------ */
24199    .balign 64
24200.L_ALT_OP_UNUSED_94FF: /* 0x194 */
24201/* File: armv5te/alt_stub.S */
24202/*
24203 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24204 * any interesting requests and then jump to the real instruction
24205 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24206 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24207 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24208 * bail to the real handler if breakFlags==0.
24209 */
24210    ldrb   r3, [rSELF, #offThread_breakFlags]
24211    adrl   lr, dvmAsmInstructionStart + (404 * 64)
24212    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24213    cmp    r3, #0
24214    bxeq   lr                   @ nothing to do - jump to real handler
24215    EXPORT_PC()
24216    mov    r0, rPC              @ arg0
24217    mov    r1, rFP              @ arg1
24218    mov    r2, rSELF            @ arg2
24219    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24220
24221/* ------------------------------ */
24222    .balign 64
24223.L_ALT_OP_UNUSED_95FF: /* 0x195 */
24224/* File: armv5te/alt_stub.S */
24225/*
24226 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24227 * any interesting requests and then jump to the real instruction
24228 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24229 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24230 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24231 * bail to the real handler if breakFlags==0.
24232 */
24233    ldrb   r3, [rSELF, #offThread_breakFlags]
24234    adrl   lr, dvmAsmInstructionStart + (405 * 64)
24235    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24236    cmp    r3, #0
24237    bxeq   lr                   @ nothing to do - jump to real handler
24238    EXPORT_PC()
24239    mov    r0, rPC              @ arg0
24240    mov    r1, rFP              @ arg1
24241    mov    r2, rSELF            @ arg2
24242    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24243
24244/* ------------------------------ */
24245    .balign 64
24246.L_ALT_OP_UNUSED_96FF: /* 0x196 */
24247/* File: armv5te/alt_stub.S */
24248/*
24249 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24250 * any interesting requests and then jump to the real instruction
24251 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24252 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24253 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24254 * bail to the real handler if breakFlags==0.
24255 */
24256    ldrb   r3, [rSELF, #offThread_breakFlags]
24257    adrl   lr, dvmAsmInstructionStart + (406 * 64)
24258    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24259    cmp    r3, #0
24260    bxeq   lr                   @ nothing to do - jump to real handler
24261    EXPORT_PC()
24262    mov    r0, rPC              @ arg0
24263    mov    r1, rFP              @ arg1
24264    mov    r2, rSELF            @ arg2
24265    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24266
24267/* ------------------------------ */
24268    .balign 64
24269.L_ALT_OP_UNUSED_97FF: /* 0x197 */
24270/* File: armv5te/alt_stub.S */
24271/*
24272 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24273 * any interesting requests and then jump to the real instruction
24274 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24275 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24276 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24277 * bail to the real handler if breakFlags==0.
24278 */
24279    ldrb   r3, [rSELF, #offThread_breakFlags]
24280    adrl   lr, dvmAsmInstructionStart + (407 * 64)
24281    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24282    cmp    r3, #0
24283    bxeq   lr                   @ nothing to do - jump to real handler
24284    EXPORT_PC()
24285    mov    r0, rPC              @ arg0
24286    mov    r1, rFP              @ arg1
24287    mov    r2, rSELF            @ arg2
24288    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24289
24290/* ------------------------------ */
24291    .balign 64
24292.L_ALT_OP_UNUSED_98FF: /* 0x198 */
24293/* File: armv5te/alt_stub.S */
24294/*
24295 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24296 * any interesting requests and then jump to the real instruction
24297 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24298 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24299 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24300 * bail to the real handler if breakFlags==0.
24301 */
24302    ldrb   r3, [rSELF, #offThread_breakFlags]
24303    adrl   lr, dvmAsmInstructionStart + (408 * 64)
24304    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24305    cmp    r3, #0
24306    bxeq   lr                   @ nothing to do - jump to real handler
24307    EXPORT_PC()
24308    mov    r0, rPC              @ arg0
24309    mov    r1, rFP              @ arg1
24310    mov    r2, rSELF            @ arg2
24311    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24312
24313/* ------------------------------ */
24314    .balign 64
24315.L_ALT_OP_UNUSED_99FF: /* 0x199 */
24316/* File: armv5te/alt_stub.S */
24317/*
24318 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24319 * any interesting requests and then jump to the real instruction
24320 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24321 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24322 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24323 * bail to the real handler if breakFlags==0.
24324 */
24325    ldrb   r3, [rSELF, #offThread_breakFlags]
24326    adrl   lr, dvmAsmInstructionStart + (409 * 64)
24327    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24328    cmp    r3, #0
24329    bxeq   lr                   @ nothing to do - jump to real handler
24330    EXPORT_PC()
24331    mov    r0, rPC              @ arg0
24332    mov    r1, rFP              @ arg1
24333    mov    r2, rSELF            @ arg2
24334    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24335
24336/* ------------------------------ */
24337    .balign 64
24338.L_ALT_OP_UNUSED_9AFF: /* 0x19a */
24339/* File: armv5te/alt_stub.S */
24340/*
24341 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24342 * any interesting requests and then jump to the real instruction
24343 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24344 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24345 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24346 * bail to the real handler if breakFlags==0.
24347 */
24348    ldrb   r3, [rSELF, #offThread_breakFlags]
24349    adrl   lr, dvmAsmInstructionStart + (410 * 64)
24350    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24351    cmp    r3, #0
24352    bxeq   lr                   @ nothing to do - jump to real handler
24353    EXPORT_PC()
24354    mov    r0, rPC              @ arg0
24355    mov    r1, rFP              @ arg1
24356    mov    r2, rSELF            @ arg2
24357    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24358
24359/* ------------------------------ */
24360    .balign 64
24361.L_ALT_OP_UNUSED_9BFF: /* 0x19b */
24362/* File: armv5te/alt_stub.S */
24363/*
24364 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24365 * any interesting requests and then jump to the real instruction
24366 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24367 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24368 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24369 * bail to the real handler if breakFlags==0.
24370 */
24371    ldrb   r3, [rSELF, #offThread_breakFlags]
24372    adrl   lr, dvmAsmInstructionStart + (411 * 64)
24373    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24374    cmp    r3, #0
24375    bxeq   lr                   @ nothing to do - jump to real handler
24376    EXPORT_PC()
24377    mov    r0, rPC              @ arg0
24378    mov    r1, rFP              @ arg1
24379    mov    r2, rSELF            @ arg2
24380    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24381
24382/* ------------------------------ */
24383    .balign 64
24384.L_ALT_OP_UNUSED_9CFF: /* 0x19c */
24385/* File: armv5te/alt_stub.S */
24386/*
24387 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24388 * any interesting requests and then jump to the real instruction
24389 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24390 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24391 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24392 * bail to the real handler if breakFlags==0.
24393 */
24394    ldrb   r3, [rSELF, #offThread_breakFlags]
24395    adrl   lr, dvmAsmInstructionStart + (412 * 64)
24396    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24397    cmp    r3, #0
24398    bxeq   lr                   @ nothing to do - jump to real handler
24399    EXPORT_PC()
24400    mov    r0, rPC              @ arg0
24401    mov    r1, rFP              @ arg1
24402    mov    r2, rSELF            @ arg2
24403    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24404
24405/* ------------------------------ */
24406    .balign 64
24407.L_ALT_OP_UNUSED_9DFF: /* 0x19d */
24408/* File: armv5te/alt_stub.S */
24409/*
24410 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24411 * any interesting requests and then jump to the real instruction
24412 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24413 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24414 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24415 * bail to the real handler if breakFlags==0.
24416 */
24417    ldrb   r3, [rSELF, #offThread_breakFlags]
24418    adrl   lr, dvmAsmInstructionStart + (413 * 64)
24419    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24420    cmp    r3, #0
24421    bxeq   lr                   @ nothing to do - jump to real handler
24422    EXPORT_PC()
24423    mov    r0, rPC              @ arg0
24424    mov    r1, rFP              @ arg1
24425    mov    r2, rSELF            @ arg2
24426    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24427
24428/* ------------------------------ */
24429    .balign 64
24430.L_ALT_OP_UNUSED_9EFF: /* 0x19e */
24431/* File: armv5te/alt_stub.S */
24432/*
24433 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24434 * any interesting requests and then jump to the real instruction
24435 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24436 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24437 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24438 * bail to the real handler if breakFlags==0.
24439 */
24440    ldrb   r3, [rSELF, #offThread_breakFlags]
24441    adrl   lr, dvmAsmInstructionStart + (414 * 64)
24442    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24443    cmp    r3, #0
24444    bxeq   lr                   @ nothing to do - jump to real handler
24445    EXPORT_PC()
24446    mov    r0, rPC              @ arg0
24447    mov    r1, rFP              @ arg1
24448    mov    r2, rSELF            @ arg2
24449    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24450
24451/* ------------------------------ */
24452    .balign 64
24453.L_ALT_OP_UNUSED_9FFF: /* 0x19f */
24454/* File: armv5te/alt_stub.S */
24455/*
24456 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24457 * any interesting requests and then jump to the real instruction
24458 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24459 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24460 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24461 * bail to the real handler if breakFlags==0.
24462 */
24463    ldrb   r3, [rSELF, #offThread_breakFlags]
24464    adrl   lr, dvmAsmInstructionStart + (415 * 64)
24465    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24466    cmp    r3, #0
24467    bxeq   lr                   @ nothing to do - jump to real handler
24468    EXPORT_PC()
24469    mov    r0, rPC              @ arg0
24470    mov    r1, rFP              @ arg1
24471    mov    r2, rSELF            @ arg2
24472    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24473
24474/* ------------------------------ */
24475    .balign 64
24476.L_ALT_OP_UNUSED_A0FF: /* 0x1a0 */
24477/* File: armv5te/alt_stub.S */
24478/*
24479 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24480 * any interesting requests and then jump to the real instruction
24481 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24482 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24483 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24484 * bail to the real handler if breakFlags==0.
24485 */
24486    ldrb   r3, [rSELF, #offThread_breakFlags]
24487    adrl   lr, dvmAsmInstructionStart + (416 * 64)
24488    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24489    cmp    r3, #0
24490    bxeq   lr                   @ nothing to do - jump to real handler
24491    EXPORT_PC()
24492    mov    r0, rPC              @ arg0
24493    mov    r1, rFP              @ arg1
24494    mov    r2, rSELF            @ arg2
24495    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24496
24497/* ------------------------------ */
24498    .balign 64
24499.L_ALT_OP_UNUSED_A1FF: /* 0x1a1 */
24500/* File: armv5te/alt_stub.S */
24501/*
24502 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24503 * any interesting requests and then jump to the real instruction
24504 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24505 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24506 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24507 * bail to the real handler if breakFlags==0.
24508 */
24509    ldrb   r3, [rSELF, #offThread_breakFlags]
24510    adrl   lr, dvmAsmInstructionStart + (417 * 64)
24511    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24512    cmp    r3, #0
24513    bxeq   lr                   @ nothing to do - jump to real handler
24514    EXPORT_PC()
24515    mov    r0, rPC              @ arg0
24516    mov    r1, rFP              @ arg1
24517    mov    r2, rSELF            @ arg2
24518    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24519
24520/* ------------------------------ */
24521    .balign 64
24522.L_ALT_OP_UNUSED_A2FF: /* 0x1a2 */
24523/* File: armv5te/alt_stub.S */
24524/*
24525 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24526 * any interesting requests and then jump to the real instruction
24527 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24528 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24529 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24530 * bail to the real handler if breakFlags==0.
24531 */
24532    ldrb   r3, [rSELF, #offThread_breakFlags]
24533    adrl   lr, dvmAsmInstructionStart + (418 * 64)
24534    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24535    cmp    r3, #0
24536    bxeq   lr                   @ nothing to do - jump to real handler
24537    EXPORT_PC()
24538    mov    r0, rPC              @ arg0
24539    mov    r1, rFP              @ arg1
24540    mov    r2, rSELF            @ arg2
24541    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24542
24543/* ------------------------------ */
24544    .balign 64
24545.L_ALT_OP_UNUSED_A3FF: /* 0x1a3 */
24546/* File: armv5te/alt_stub.S */
24547/*
24548 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24549 * any interesting requests and then jump to the real instruction
24550 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24551 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24552 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24553 * bail to the real handler if breakFlags==0.
24554 */
24555    ldrb   r3, [rSELF, #offThread_breakFlags]
24556    adrl   lr, dvmAsmInstructionStart + (419 * 64)
24557    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24558    cmp    r3, #0
24559    bxeq   lr                   @ nothing to do - jump to real handler
24560    EXPORT_PC()
24561    mov    r0, rPC              @ arg0
24562    mov    r1, rFP              @ arg1
24563    mov    r2, rSELF            @ arg2
24564    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24565
24566/* ------------------------------ */
24567    .balign 64
24568.L_ALT_OP_UNUSED_A4FF: /* 0x1a4 */
24569/* File: armv5te/alt_stub.S */
24570/*
24571 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24572 * any interesting requests and then jump to the real instruction
24573 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24574 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24575 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24576 * bail to the real handler if breakFlags==0.
24577 */
24578    ldrb   r3, [rSELF, #offThread_breakFlags]
24579    adrl   lr, dvmAsmInstructionStart + (420 * 64)
24580    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24581    cmp    r3, #0
24582    bxeq   lr                   @ nothing to do - jump to real handler
24583    EXPORT_PC()
24584    mov    r0, rPC              @ arg0
24585    mov    r1, rFP              @ arg1
24586    mov    r2, rSELF            @ arg2
24587    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24588
24589/* ------------------------------ */
24590    .balign 64
24591.L_ALT_OP_UNUSED_A5FF: /* 0x1a5 */
24592/* File: armv5te/alt_stub.S */
24593/*
24594 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24595 * any interesting requests and then jump to the real instruction
24596 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24597 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24598 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24599 * bail to the real handler if breakFlags==0.
24600 */
24601    ldrb   r3, [rSELF, #offThread_breakFlags]
24602    adrl   lr, dvmAsmInstructionStart + (421 * 64)
24603    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24604    cmp    r3, #0
24605    bxeq   lr                   @ nothing to do - jump to real handler
24606    EXPORT_PC()
24607    mov    r0, rPC              @ arg0
24608    mov    r1, rFP              @ arg1
24609    mov    r2, rSELF            @ arg2
24610    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24611
24612/* ------------------------------ */
24613    .balign 64
24614.L_ALT_OP_UNUSED_A6FF: /* 0x1a6 */
24615/* File: armv5te/alt_stub.S */
24616/*
24617 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24618 * any interesting requests and then jump to the real instruction
24619 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24620 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24621 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24622 * bail to the real handler if breakFlags==0.
24623 */
24624    ldrb   r3, [rSELF, #offThread_breakFlags]
24625    adrl   lr, dvmAsmInstructionStart + (422 * 64)
24626    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24627    cmp    r3, #0
24628    bxeq   lr                   @ nothing to do - jump to real handler
24629    EXPORT_PC()
24630    mov    r0, rPC              @ arg0
24631    mov    r1, rFP              @ arg1
24632    mov    r2, rSELF            @ arg2
24633    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24634
24635/* ------------------------------ */
24636    .balign 64
24637.L_ALT_OP_UNUSED_A7FF: /* 0x1a7 */
24638/* File: armv5te/alt_stub.S */
24639/*
24640 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24641 * any interesting requests and then jump to the real instruction
24642 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24643 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24644 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24645 * bail to the real handler if breakFlags==0.
24646 */
24647    ldrb   r3, [rSELF, #offThread_breakFlags]
24648    adrl   lr, dvmAsmInstructionStart + (423 * 64)
24649    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24650    cmp    r3, #0
24651    bxeq   lr                   @ nothing to do - jump to real handler
24652    EXPORT_PC()
24653    mov    r0, rPC              @ arg0
24654    mov    r1, rFP              @ arg1
24655    mov    r2, rSELF            @ arg2
24656    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24657
24658/* ------------------------------ */
24659    .balign 64
24660.L_ALT_OP_UNUSED_A8FF: /* 0x1a8 */
24661/* File: armv5te/alt_stub.S */
24662/*
24663 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24664 * any interesting requests and then jump to the real instruction
24665 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24666 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24667 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24668 * bail to the real handler if breakFlags==0.
24669 */
24670    ldrb   r3, [rSELF, #offThread_breakFlags]
24671    adrl   lr, dvmAsmInstructionStart + (424 * 64)
24672    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24673    cmp    r3, #0
24674    bxeq   lr                   @ nothing to do - jump to real handler
24675    EXPORT_PC()
24676    mov    r0, rPC              @ arg0
24677    mov    r1, rFP              @ arg1
24678    mov    r2, rSELF            @ arg2
24679    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24680
24681/* ------------------------------ */
24682    .balign 64
24683.L_ALT_OP_UNUSED_A9FF: /* 0x1a9 */
24684/* File: armv5te/alt_stub.S */
24685/*
24686 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24687 * any interesting requests and then jump to the real instruction
24688 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24689 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24690 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24691 * bail to the real handler if breakFlags==0.
24692 */
24693    ldrb   r3, [rSELF, #offThread_breakFlags]
24694    adrl   lr, dvmAsmInstructionStart + (425 * 64)
24695    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24696    cmp    r3, #0
24697    bxeq   lr                   @ nothing to do - jump to real handler
24698    EXPORT_PC()
24699    mov    r0, rPC              @ arg0
24700    mov    r1, rFP              @ arg1
24701    mov    r2, rSELF            @ arg2
24702    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24703
24704/* ------------------------------ */
24705    .balign 64
24706.L_ALT_OP_UNUSED_AAFF: /* 0x1aa */
24707/* File: armv5te/alt_stub.S */
24708/*
24709 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24710 * any interesting requests and then jump to the real instruction
24711 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24712 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24713 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24714 * bail to the real handler if breakFlags==0.
24715 */
24716    ldrb   r3, [rSELF, #offThread_breakFlags]
24717    adrl   lr, dvmAsmInstructionStart + (426 * 64)
24718    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24719    cmp    r3, #0
24720    bxeq   lr                   @ nothing to do - jump to real handler
24721    EXPORT_PC()
24722    mov    r0, rPC              @ arg0
24723    mov    r1, rFP              @ arg1
24724    mov    r2, rSELF            @ arg2
24725    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24726
24727/* ------------------------------ */
24728    .balign 64
24729.L_ALT_OP_UNUSED_ABFF: /* 0x1ab */
24730/* File: armv5te/alt_stub.S */
24731/*
24732 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24733 * any interesting requests and then jump to the real instruction
24734 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24735 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24736 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24737 * bail to the real handler if breakFlags==0.
24738 */
24739    ldrb   r3, [rSELF, #offThread_breakFlags]
24740    adrl   lr, dvmAsmInstructionStart + (427 * 64)
24741    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24742    cmp    r3, #0
24743    bxeq   lr                   @ nothing to do - jump to real handler
24744    EXPORT_PC()
24745    mov    r0, rPC              @ arg0
24746    mov    r1, rFP              @ arg1
24747    mov    r2, rSELF            @ arg2
24748    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24749
24750/* ------------------------------ */
24751    .balign 64
24752.L_ALT_OP_UNUSED_ACFF: /* 0x1ac */
24753/* File: armv5te/alt_stub.S */
24754/*
24755 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24756 * any interesting requests and then jump to the real instruction
24757 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24758 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24759 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24760 * bail to the real handler if breakFlags==0.
24761 */
24762    ldrb   r3, [rSELF, #offThread_breakFlags]
24763    adrl   lr, dvmAsmInstructionStart + (428 * 64)
24764    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24765    cmp    r3, #0
24766    bxeq   lr                   @ nothing to do - jump to real handler
24767    EXPORT_PC()
24768    mov    r0, rPC              @ arg0
24769    mov    r1, rFP              @ arg1
24770    mov    r2, rSELF            @ arg2
24771    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24772
24773/* ------------------------------ */
24774    .balign 64
24775.L_ALT_OP_UNUSED_ADFF: /* 0x1ad */
24776/* File: armv5te/alt_stub.S */
24777/*
24778 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24779 * any interesting requests and then jump to the real instruction
24780 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24781 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24782 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24783 * bail to the real handler if breakFlags==0.
24784 */
24785    ldrb   r3, [rSELF, #offThread_breakFlags]
24786    adrl   lr, dvmAsmInstructionStart + (429 * 64)
24787    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24788    cmp    r3, #0
24789    bxeq   lr                   @ nothing to do - jump to real handler
24790    EXPORT_PC()
24791    mov    r0, rPC              @ arg0
24792    mov    r1, rFP              @ arg1
24793    mov    r2, rSELF            @ arg2
24794    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24795
24796/* ------------------------------ */
24797    .balign 64
24798.L_ALT_OP_UNUSED_AEFF: /* 0x1ae */
24799/* File: armv5te/alt_stub.S */
24800/*
24801 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24802 * any interesting requests and then jump to the real instruction
24803 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24804 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24805 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24806 * bail to the real handler if breakFlags==0.
24807 */
24808    ldrb   r3, [rSELF, #offThread_breakFlags]
24809    adrl   lr, dvmAsmInstructionStart + (430 * 64)
24810    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24811    cmp    r3, #0
24812    bxeq   lr                   @ nothing to do - jump to real handler
24813    EXPORT_PC()
24814    mov    r0, rPC              @ arg0
24815    mov    r1, rFP              @ arg1
24816    mov    r2, rSELF            @ arg2
24817    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24818
24819/* ------------------------------ */
24820    .balign 64
24821.L_ALT_OP_UNUSED_AFFF: /* 0x1af */
24822/* File: armv5te/alt_stub.S */
24823/*
24824 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24825 * any interesting requests and then jump to the real instruction
24826 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24827 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24828 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24829 * bail to the real handler if breakFlags==0.
24830 */
24831    ldrb   r3, [rSELF, #offThread_breakFlags]
24832    adrl   lr, dvmAsmInstructionStart + (431 * 64)
24833    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24834    cmp    r3, #0
24835    bxeq   lr                   @ nothing to do - jump to real handler
24836    EXPORT_PC()
24837    mov    r0, rPC              @ arg0
24838    mov    r1, rFP              @ arg1
24839    mov    r2, rSELF            @ arg2
24840    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24841
24842/* ------------------------------ */
24843    .balign 64
24844.L_ALT_OP_UNUSED_B0FF: /* 0x1b0 */
24845/* File: armv5te/alt_stub.S */
24846/*
24847 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24848 * any interesting requests and then jump to the real instruction
24849 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24850 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24851 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24852 * bail to the real handler if breakFlags==0.
24853 */
24854    ldrb   r3, [rSELF, #offThread_breakFlags]
24855    adrl   lr, dvmAsmInstructionStart + (432 * 64)
24856    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24857    cmp    r3, #0
24858    bxeq   lr                   @ nothing to do - jump to real handler
24859    EXPORT_PC()
24860    mov    r0, rPC              @ arg0
24861    mov    r1, rFP              @ arg1
24862    mov    r2, rSELF            @ arg2
24863    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24864
24865/* ------------------------------ */
24866    .balign 64
24867.L_ALT_OP_UNUSED_B1FF: /* 0x1b1 */
24868/* File: armv5te/alt_stub.S */
24869/*
24870 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24871 * any interesting requests and then jump to the real instruction
24872 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24873 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24874 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24875 * bail to the real handler if breakFlags==0.
24876 */
24877    ldrb   r3, [rSELF, #offThread_breakFlags]
24878    adrl   lr, dvmAsmInstructionStart + (433 * 64)
24879    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24880    cmp    r3, #0
24881    bxeq   lr                   @ nothing to do - jump to real handler
24882    EXPORT_PC()
24883    mov    r0, rPC              @ arg0
24884    mov    r1, rFP              @ arg1
24885    mov    r2, rSELF            @ arg2
24886    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24887
24888/* ------------------------------ */
24889    .balign 64
24890.L_ALT_OP_UNUSED_B2FF: /* 0x1b2 */
24891/* File: armv5te/alt_stub.S */
24892/*
24893 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24894 * any interesting requests and then jump to the real instruction
24895 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24896 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24897 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24898 * bail to the real handler if breakFlags==0.
24899 */
24900    ldrb   r3, [rSELF, #offThread_breakFlags]
24901    adrl   lr, dvmAsmInstructionStart + (434 * 64)
24902    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24903    cmp    r3, #0
24904    bxeq   lr                   @ nothing to do - jump to real handler
24905    EXPORT_PC()
24906    mov    r0, rPC              @ arg0
24907    mov    r1, rFP              @ arg1
24908    mov    r2, rSELF            @ arg2
24909    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24910
24911/* ------------------------------ */
24912    .balign 64
24913.L_ALT_OP_UNUSED_B3FF: /* 0x1b3 */
24914/* File: armv5te/alt_stub.S */
24915/*
24916 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24917 * any interesting requests and then jump to the real instruction
24918 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24919 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24920 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24921 * bail to the real handler if breakFlags==0.
24922 */
24923    ldrb   r3, [rSELF, #offThread_breakFlags]
24924    adrl   lr, dvmAsmInstructionStart + (435 * 64)
24925    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24926    cmp    r3, #0
24927    bxeq   lr                   @ nothing to do - jump to real handler
24928    EXPORT_PC()
24929    mov    r0, rPC              @ arg0
24930    mov    r1, rFP              @ arg1
24931    mov    r2, rSELF            @ arg2
24932    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24933
24934/* ------------------------------ */
24935    .balign 64
24936.L_ALT_OP_UNUSED_B4FF: /* 0x1b4 */
24937/* File: armv5te/alt_stub.S */
24938/*
24939 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24940 * any interesting requests and then jump to the real instruction
24941 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24942 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24943 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24944 * bail to the real handler if breakFlags==0.
24945 */
24946    ldrb   r3, [rSELF, #offThread_breakFlags]
24947    adrl   lr, dvmAsmInstructionStart + (436 * 64)
24948    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24949    cmp    r3, #0
24950    bxeq   lr                   @ nothing to do - jump to real handler
24951    EXPORT_PC()
24952    mov    r0, rPC              @ arg0
24953    mov    r1, rFP              @ arg1
24954    mov    r2, rSELF            @ arg2
24955    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24956
24957/* ------------------------------ */
24958    .balign 64
24959.L_ALT_OP_UNUSED_B5FF: /* 0x1b5 */
24960/* File: armv5te/alt_stub.S */
24961/*
24962 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24963 * any interesting requests and then jump to the real instruction
24964 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24965 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24966 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24967 * bail to the real handler if breakFlags==0.
24968 */
24969    ldrb   r3, [rSELF, #offThread_breakFlags]
24970    adrl   lr, dvmAsmInstructionStart + (437 * 64)
24971    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24972    cmp    r3, #0
24973    bxeq   lr                   @ nothing to do - jump to real handler
24974    EXPORT_PC()
24975    mov    r0, rPC              @ arg0
24976    mov    r1, rFP              @ arg1
24977    mov    r2, rSELF            @ arg2
24978    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24979
24980/* ------------------------------ */
24981    .balign 64
24982.L_ALT_OP_UNUSED_B6FF: /* 0x1b6 */
24983/* File: armv5te/alt_stub.S */
24984/*
24985 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24986 * any interesting requests and then jump to the real instruction
24987 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24988 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24989 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24990 * bail to the real handler if breakFlags==0.
24991 */
24992    ldrb   r3, [rSELF, #offThread_breakFlags]
24993    adrl   lr, dvmAsmInstructionStart + (438 * 64)
24994    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24995    cmp    r3, #0
24996    bxeq   lr                   @ nothing to do - jump to real handler
24997    EXPORT_PC()
24998    mov    r0, rPC              @ arg0
24999    mov    r1, rFP              @ arg1
25000    mov    r2, rSELF            @ arg2
25001    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25002
25003/* ------------------------------ */
25004    .balign 64
25005.L_ALT_OP_UNUSED_B7FF: /* 0x1b7 */
25006/* File: armv5te/alt_stub.S */
25007/*
25008 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25009 * any interesting requests and then jump to the real instruction
25010 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25011 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25012 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25013 * bail to the real handler if breakFlags==0.
25014 */
25015    ldrb   r3, [rSELF, #offThread_breakFlags]
25016    adrl   lr, dvmAsmInstructionStart + (439 * 64)
25017    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25018    cmp    r3, #0
25019    bxeq   lr                   @ nothing to do - jump to real handler
25020    EXPORT_PC()
25021    mov    r0, rPC              @ arg0
25022    mov    r1, rFP              @ arg1
25023    mov    r2, rSELF            @ arg2
25024    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25025
25026/* ------------------------------ */
25027    .balign 64
25028.L_ALT_OP_UNUSED_B8FF: /* 0x1b8 */
25029/* File: armv5te/alt_stub.S */
25030/*
25031 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25032 * any interesting requests and then jump to the real instruction
25033 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25034 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25035 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25036 * bail to the real handler if breakFlags==0.
25037 */
25038    ldrb   r3, [rSELF, #offThread_breakFlags]
25039    adrl   lr, dvmAsmInstructionStart + (440 * 64)
25040    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25041    cmp    r3, #0
25042    bxeq   lr                   @ nothing to do - jump to real handler
25043    EXPORT_PC()
25044    mov    r0, rPC              @ arg0
25045    mov    r1, rFP              @ arg1
25046    mov    r2, rSELF            @ arg2
25047    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25048
25049/* ------------------------------ */
25050    .balign 64
25051.L_ALT_OP_UNUSED_B9FF: /* 0x1b9 */
25052/* File: armv5te/alt_stub.S */
25053/*
25054 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25055 * any interesting requests and then jump to the real instruction
25056 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25057 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25058 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25059 * bail to the real handler if breakFlags==0.
25060 */
25061    ldrb   r3, [rSELF, #offThread_breakFlags]
25062    adrl   lr, dvmAsmInstructionStart + (441 * 64)
25063    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25064    cmp    r3, #0
25065    bxeq   lr                   @ nothing to do - jump to real handler
25066    EXPORT_PC()
25067    mov    r0, rPC              @ arg0
25068    mov    r1, rFP              @ arg1
25069    mov    r2, rSELF            @ arg2
25070    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25071
25072/* ------------------------------ */
25073    .balign 64
25074.L_ALT_OP_UNUSED_BAFF: /* 0x1ba */
25075/* File: armv5te/alt_stub.S */
25076/*
25077 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25078 * any interesting requests and then jump to the real instruction
25079 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25080 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25081 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25082 * bail to the real handler if breakFlags==0.
25083 */
25084    ldrb   r3, [rSELF, #offThread_breakFlags]
25085    adrl   lr, dvmAsmInstructionStart + (442 * 64)
25086    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25087    cmp    r3, #0
25088    bxeq   lr                   @ nothing to do - jump to real handler
25089    EXPORT_PC()
25090    mov    r0, rPC              @ arg0
25091    mov    r1, rFP              @ arg1
25092    mov    r2, rSELF            @ arg2
25093    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25094
25095/* ------------------------------ */
25096    .balign 64
25097.L_ALT_OP_UNUSED_BBFF: /* 0x1bb */
25098/* File: armv5te/alt_stub.S */
25099/*
25100 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25101 * any interesting requests and then jump to the real instruction
25102 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25103 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25104 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25105 * bail to the real handler if breakFlags==0.
25106 */
25107    ldrb   r3, [rSELF, #offThread_breakFlags]
25108    adrl   lr, dvmAsmInstructionStart + (443 * 64)
25109    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25110    cmp    r3, #0
25111    bxeq   lr                   @ nothing to do - jump to real handler
25112    EXPORT_PC()
25113    mov    r0, rPC              @ arg0
25114    mov    r1, rFP              @ arg1
25115    mov    r2, rSELF            @ arg2
25116    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25117
25118/* ------------------------------ */
25119    .balign 64
25120.L_ALT_OP_UNUSED_BCFF: /* 0x1bc */
25121/* File: armv5te/alt_stub.S */
25122/*
25123 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25124 * any interesting requests and then jump to the real instruction
25125 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25126 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25127 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25128 * bail to the real handler if breakFlags==0.
25129 */
25130    ldrb   r3, [rSELF, #offThread_breakFlags]
25131    adrl   lr, dvmAsmInstructionStart + (444 * 64)
25132    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25133    cmp    r3, #0
25134    bxeq   lr                   @ nothing to do - jump to real handler
25135    EXPORT_PC()
25136    mov    r0, rPC              @ arg0
25137    mov    r1, rFP              @ arg1
25138    mov    r2, rSELF            @ arg2
25139    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25140
25141/* ------------------------------ */
25142    .balign 64
25143.L_ALT_OP_UNUSED_BDFF: /* 0x1bd */
25144/* File: armv5te/alt_stub.S */
25145/*
25146 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25147 * any interesting requests and then jump to the real instruction
25148 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25149 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25150 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25151 * bail to the real handler if breakFlags==0.
25152 */
25153    ldrb   r3, [rSELF, #offThread_breakFlags]
25154    adrl   lr, dvmAsmInstructionStart + (445 * 64)
25155    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25156    cmp    r3, #0
25157    bxeq   lr                   @ nothing to do - jump to real handler
25158    EXPORT_PC()
25159    mov    r0, rPC              @ arg0
25160    mov    r1, rFP              @ arg1
25161    mov    r2, rSELF            @ arg2
25162    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25163
25164/* ------------------------------ */
25165    .balign 64
25166.L_ALT_OP_UNUSED_BEFF: /* 0x1be */
25167/* File: armv5te/alt_stub.S */
25168/*
25169 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25170 * any interesting requests and then jump to the real instruction
25171 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25172 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25173 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25174 * bail to the real handler if breakFlags==0.
25175 */
25176    ldrb   r3, [rSELF, #offThread_breakFlags]
25177    adrl   lr, dvmAsmInstructionStart + (446 * 64)
25178    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25179    cmp    r3, #0
25180    bxeq   lr                   @ nothing to do - jump to real handler
25181    EXPORT_PC()
25182    mov    r0, rPC              @ arg0
25183    mov    r1, rFP              @ arg1
25184    mov    r2, rSELF            @ arg2
25185    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25186
25187/* ------------------------------ */
25188    .balign 64
25189.L_ALT_OP_UNUSED_BFFF: /* 0x1bf */
25190/* File: armv5te/alt_stub.S */
25191/*
25192 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25193 * any interesting requests and then jump to the real instruction
25194 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25195 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25196 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25197 * bail to the real handler if breakFlags==0.
25198 */
25199    ldrb   r3, [rSELF, #offThread_breakFlags]
25200    adrl   lr, dvmAsmInstructionStart + (447 * 64)
25201    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25202    cmp    r3, #0
25203    bxeq   lr                   @ nothing to do - jump to real handler
25204    EXPORT_PC()
25205    mov    r0, rPC              @ arg0
25206    mov    r1, rFP              @ arg1
25207    mov    r2, rSELF            @ arg2
25208    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25209
25210/* ------------------------------ */
25211    .balign 64
25212.L_ALT_OP_UNUSED_C0FF: /* 0x1c0 */
25213/* File: armv5te/alt_stub.S */
25214/*
25215 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25216 * any interesting requests and then jump to the real instruction
25217 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25218 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25219 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25220 * bail to the real handler if breakFlags==0.
25221 */
25222    ldrb   r3, [rSELF, #offThread_breakFlags]
25223    adrl   lr, dvmAsmInstructionStart + (448 * 64)
25224    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25225    cmp    r3, #0
25226    bxeq   lr                   @ nothing to do - jump to real handler
25227    EXPORT_PC()
25228    mov    r0, rPC              @ arg0
25229    mov    r1, rFP              @ arg1
25230    mov    r2, rSELF            @ arg2
25231    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25232
25233/* ------------------------------ */
25234    .balign 64
25235.L_ALT_OP_UNUSED_C1FF: /* 0x1c1 */
25236/* File: armv5te/alt_stub.S */
25237/*
25238 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25239 * any interesting requests and then jump to the real instruction
25240 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25241 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25242 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25243 * bail to the real handler if breakFlags==0.
25244 */
25245    ldrb   r3, [rSELF, #offThread_breakFlags]
25246    adrl   lr, dvmAsmInstructionStart + (449 * 64)
25247    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25248    cmp    r3, #0
25249    bxeq   lr                   @ nothing to do - jump to real handler
25250    EXPORT_PC()
25251    mov    r0, rPC              @ arg0
25252    mov    r1, rFP              @ arg1
25253    mov    r2, rSELF            @ arg2
25254    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25255
25256/* ------------------------------ */
25257    .balign 64
25258.L_ALT_OP_UNUSED_C2FF: /* 0x1c2 */
25259/* File: armv5te/alt_stub.S */
25260/*
25261 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25262 * any interesting requests and then jump to the real instruction
25263 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25264 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25265 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25266 * bail to the real handler if breakFlags==0.
25267 */
25268    ldrb   r3, [rSELF, #offThread_breakFlags]
25269    adrl   lr, dvmAsmInstructionStart + (450 * 64)
25270    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25271    cmp    r3, #0
25272    bxeq   lr                   @ nothing to do - jump to real handler
25273    EXPORT_PC()
25274    mov    r0, rPC              @ arg0
25275    mov    r1, rFP              @ arg1
25276    mov    r2, rSELF            @ arg2
25277    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25278
25279/* ------------------------------ */
25280    .balign 64
25281.L_ALT_OP_UNUSED_C3FF: /* 0x1c3 */
25282/* File: armv5te/alt_stub.S */
25283/*
25284 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25285 * any interesting requests and then jump to the real instruction
25286 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25287 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25288 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25289 * bail to the real handler if breakFlags==0.
25290 */
25291    ldrb   r3, [rSELF, #offThread_breakFlags]
25292    adrl   lr, dvmAsmInstructionStart + (451 * 64)
25293    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25294    cmp    r3, #0
25295    bxeq   lr                   @ nothing to do - jump to real handler
25296    EXPORT_PC()
25297    mov    r0, rPC              @ arg0
25298    mov    r1, rFP              @ arg1
25299    mov    r2, rSELF            @ arg2
25300    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25301
25302/* ------------------------------ */
25303    .balign 64
25304.L_ALT_OP_UNUSED_C4FF: /* 0x1c4 */
25305/* File: armv5te/alt_stub.S */
25306/*
25307 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25308 * any interesting requests and then jump to the real instruction
25309 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25310 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25311 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25312 * bail to the real handler if breakFlags==0.
25313 */
25314    ldrb   r3, [rSELF, #offThread_breakFlags]
25315    adrl   lr, dvmAsmInstructionStart + (452 * 64)
25316    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25317    cmp    r3, #0
25318    bxeq   lr                   @ nothing to do - jump to real handler
25319    EXPORT_PC()
25320    mov    r0, rPC              @ arg0
25321    mov    r1, rFP              @ arg1
25322    mov    r2, rSELF            @ arg2
25323    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25324
25325/* ------------------------------ */
25326    .balign 64
25327.L_ALT_OP_UNUSED_C5FF: /* 0x1c5 */
25328/* File: armv5te/alt_stub.S */
25329/*
25330 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25331 * any interesting requests and then jump to the real instruction
25332 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25333 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25334 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25335 * bail to the real handler if breakFlags==0.
25336 */
25337    ldrb   r3, [rSELF, #offThread_breakFlags]
25338    adrl   lr, dvmAsmInstructionStart + (453 * 64)
25339    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25340    cmp    r3, #0
25341    bxeq   lr                   @ nothing to do - jump to real handler
25342    EXPORT_PC()
25343    mov    r0, rPC              @ arg0
25344    mov    r1, rFP              @ arg1
25345    mov    r2, rSELF            @ arg2
25346    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25347
25348/* ------------------------------ */
25349    .balign 64
25350.L_ALT_OP_UNUSED_C6FF: /* 0x1c6 */
25351/* File: armv5te/alt_stub.S */
25352/*
25353 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25354 * any interesting requests and then jump to the real instruction
25355 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25356 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25357 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25358 * bail to the real handler if breakFlags==0.
25359 */
25360    ldrb   r3, [rSELF, #offThread_breakFlags]
25361    adrl   lr, dvmAsmInstructionStart + (454 * 64)
25362    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25363    cmp    r3, #0
25364    bxeq   lr                   @ nothing to do - jump to real handler
25365    EXPORT_PC()
25366    mov    r0, rPC              @ arg0
25367    mov    r1, rFP              @ arg1
25368    mov    r2, rSELF            @ arg2
25369    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25370
25371/* ------------------------------ */
25372    .balign 64
25373.L_ALT_OP_UNUSED_C7FF: /* 0x1c7 */
25374/* File: armv5te/alt_stub.S */
25375/*
25376 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25377 * any interesting requests and then jump to the real instruction
25378 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25379 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25380 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25381 * bail to the real handler if breakFlags==0.
25382 */
25383    ldrb   r3, [rSELF, #offThread_breakFlags]
25384    adrl   lr, dvmAsmInstructionStart + (455 * 64)
25385    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25386    cmp    r3, #0
25387    bxeq   lr                   @ nothing to do - jump to real handler
25388    EXPORT_PC()
25389    mov    r0, rPC              @ arg0
25390    mov    r1, rFP              @ arg1
25391    mov    r2, rSELF            @ arg2
25392    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25393
25394/* ------------------------------ */
25395    .balign 64
25396.L_ALT_OP_UNUSED_C8FF: /* 0x1c8 */
25397/* File: armv5te/alt_stub.S */
25398/*
25399 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25400 * any interesting requests and then jump to the real instruction
25401 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25402 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25403 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25404 * bail to the real handler if breakFlags==0.
25405 */
25406    ldrb   r3, [rSELF, #offThread_breakFlags]
25407    adrl   lr, dvmAsmInstructionStart + (456 * 64)
25408    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25409    cmp    r3, #0
25410    bxeq   lr                   @ nothing to do - jump to real handler
25411    EXPORT_PC()
25412    mov    r0, rPC              @ arg0
25413    mov    r1, rFP              @ arg1
25414    mov    r2, rSELF            @ arg2
25415    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25416
25417/* ------------------------------ */
25418    .balign 64
25419.L_ALT_OP_UNUSED_C9FF: /* 0x1c9 */
25420/* File: armv5te/alt_stub.S */
25421/*
25422 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25423 * any interesting requests and then jump to the real instruction
25424 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25425 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25426 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25427 * bail to the real handler if breakFlags==0.
25428 */
25429    ldrb   r3, [rSELF, #offThread_breakFlags]
25430    adrl   lr, dvmAsmInstructionStart + (457 * 64)
25431    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25432    cmp    r3, #0
25433    bxeq   lr                   @ nothing to do - jump to real handler
25434    EXPORT_PC()
25435    mov    r0, rPC              @ arg0
25436    mov    r1, rFP              @ arg1
25437    mov    r2, rSELF            @ arg2
25438    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25439
25440/* ------------------------------ */
25441    .balign 64
25442.L_ALT_OP_UNUSED_CAFF: /* 0x1ca */
25443/* File: armv5te/alt_stub.S */
25444/*
25445 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25446 * any interesting requests and then jump to the real instruction
25447 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25448 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25449 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25450 * bail to the real handler if breakFlags==0.
25451 */
25452    ldrb   r3, [rSELF, #offThread_breakFlags]
25453    adrl   lr, dvmAsmInstructionStart + (458 * 64)
25454    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25455    cmp    r3, #0
25456    bxeq   lr                   @ nothing to do - jump to real handler
25457    EXPORT_PC()
25458    mov    r0, rPC              @ arg0
25459    mov    r1, rFP              @ arg1
25460    mov    r2, rSELF            @ arg2
25461    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25462
25463/* ------------------------------ */
25464    .balign 64
25465.L_ALT_OP_UNUSED_CBFF: /* 0x1cb */
25466/* File: armv5te/alt_stub.S */
25467/*
25468 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25469 * any interesting requests and then jump to the real instruction
25470 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25471 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25472 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25473 * bail to the real handler if breakFlags==0.
25474 */
25475    ldrb   r3, [rSELF, #offThread_breakFlags]
25476    adrl   lr, dvmAsmInstructionStart + (459 * 64)
25477    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25478    cmp    r3, #0
25479    bxeq   lr                   @ nothing to do - jump to real handler
25480    EXPORT_PC()
25481    mov    r0, rPC              @ arg0
25482    mov    r1, rFP              @ arg1
25483    mov    r2, rSELF            @ arg2
25484    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25485
25486/* ------------------------------ */
25487    .balign 64
25488.L_ALT_OP_UNUSED_CCFF: /* 0x1cc */
25489/* File: armv5te/alt_stub.S */
25490/*
25491 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25492 * any interesting requests and then jump to the real instruction
25493 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25494 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25495 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25496 * bail to the real handler if breakFlags==0.
25497 */
25498    ldrb   r3, [rSELF, #offThread_breakFlags]
25499    adrl   lr, dvmAsmInstructionStart + (460 * 64)
25500    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25501    cmp    r3, #0
25502    bxeq   lr                   @ nothing to do - jump to real handler
25503    EXPORT_PC()
25504    mov    r0, rPC              @ arg0
25505    mov    r1, rFP              @ arg1
25506    mov    r2, rSELF            @ arg2
25507    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25508
25509/* ------------------------------ */
25510    .balign 64
25511.L_ALT_OP_UNUSED_CDFF: /* 0x1cd */
25512/* File: armv5te/alt_stub.S */
25513/*
25514 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25515 * any interesting requests and then jump to the real instruction
25516 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25517 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25518 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25519 * bail to the real handler if breakFlags==0.
25520 */
25521    ldrb   r3, [rSELF, #offThread_breakFlags]
25522    adrl   lr, dvmAsmInstructionStart + (461 * 64)
25523    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25524    cmp    r3, #0
25525    bxeq   lr                   @ nothing to do - jump to real handler
25526    EXPORT_PC()
25527    mov    r0, rPC              @ arg0
25528    mov    r1, rFP              @ arg1
25529    mov    r2, rSELF            @ arg2
25530    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25531
25532/* ------------------------------ */
25533    .balign 64
25534.L_ALT_OP_UNUSED_CEFF: /* 0x1ce */
25535/* File: armv5te/alt_stub.S */
25536/*
25537 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25538 * any interesting requests and then jump to the real instruction
25539 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25540 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25541 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25542 * bail to the real handler if breakFlags==0.
25543 */
25544    ldrb   r3, [rSELF, #offThread_breakFlags]
25545    adrl   lr, dvmAsmInstructionStart + (462 * 64)
25546    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25547    cmp    r3, #0
25548    bxeq   lr                   @ nothing to do - jump to real handler
25549    EXPORT_PC()
25550    mov    r0, rPC              @ arg0
25551    mov    r1, rFP              @ arg1
25552    mov    r2, rSELF            @ arg2
25553    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25554
25555/* ------------------------------ */
25556    .balign 64
25557.L_ALT_OP_UNUSED_CFFF: /* 0x1cf */
25558/* File: armv5te/alt_stub.S */
25559/*
25560 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25561 * any interesting requests and then jump to the real instruction
25562 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25563 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25564 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25565 * bail to the real handler if breakFlags==0.
25566 */
25567    ldrb   r3, [rSELF, #offThread_breakFlags]
25568    adrl   lr, dvmAsmInstructionStart + (463 * 64)
25569    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25570    cmp    r3, #0
25571    bxeq   lr                   @ nothing to do - jump to real handler
25572    EXPORT_PC()
25573    mov    r0, rPC              @ arg0
25574    mov    r1, rFP              @ arg1
25575    mov    r2, rSELF            @ arg2
25576    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25577
25578/* ------------------------------ */
25579    .balign 64
25580.L_ALT_OP_UNUSED_D0FF: /* 0x1d0 */
25581/* File: armv5te/alt_stub.S */
25582/*
25583 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25584 * any interesting requests and then jump to the real instruction
25585 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25586 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25587 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25588 * bail to the real handler if breakFlags==0.
25589 */
25590    ldrb   r3, [rSELF, #offThread_breakFlags]
25591    adrl   lr, dvmAsmInstructionStart + (464 * 64)
25592    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25593    cmp    r3, #0
25594    bxeq   lr                   @ nothing to do - jump to real handler
25595    EXPORT_PC()
25596    mov    r0, rPC              @ arg0
25597    mov    r1, rFP              @ arg1
25598    mov    r2, rSELF            @ arg2
25599    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25600
25601/* ------------------------------ */
25602    .balign 64
25603.L_ALT_OP_UNUSED_D1FF: /* 0x1d1 */
25604/* File: armv5te/alt_stub.S */
25605/*
25606 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25607 * any interesting requests and then jump to the real instruction
25608 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25609 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25610 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25611 * bail to the real handler if breakFlags==0.
25612 */
25613    ldrb   r3, [rSELF, #offThread_breakFlags]
25614    adrl   lr, dvmAsmInstructionStart + (465 * 64)
25615    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25616    cmp    r3, #0
25617    bxeq   lr                   @ nothing to do - jump to real handler
25618    EXPORT_PC()
25619    mov    r0, rPC              @ arg0
25620    mov    r1, rFP              @ arg1
25621    mov    r2, rSELF            @ arg2
25622    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25623
25624/* ------------------------------ */
25625    .balign 64
25626.L_ALT_OP_UNUSED_D2FF: /* 0x1d2 */
25627/* File: armv5te/alt_stub.S */
25628/*
25629 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25630 * any interesting requests and then jump to the real instruction
25631 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25632 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25633 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25634 * bail to the real handler if breakFlags==0.
25635 */
25636    ldrb   r3, [rSELF, #offThread_breakFlags]
25637    adrl   lr, dvmAsmInstructionStart + (466 * 64)
25638    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25639    cmp    r3, #0
25640    bxeq   lr                   @ nothing to do - jump to real handler
25641    EXPORT_PC()
25642    mov    r0, rPC              @ arg0
25643    mov    r1, rFP              @ arg1
25644    mov    r2, rSELF            @ arg2
25645    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25646
25647/* ------------------------------ */
25648    .balign 64
25649.L_ALT_OP_UNUSED_D3FF: /* 0x1d3 */
25650/* File: armv5te/alt_stub.S */
25651/*
25652 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25653 * any interesting requests and then jump to the real instruction
25654 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25655 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25656 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25657 * bail to the real handler if breakFlags==0.
25658 */
25659    ldrb   r3, [rSELF, #offThread_breakFlags]
25660    adrl   lr, dvmAsmInstructionStart + (467 * 64)
25661    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25662    cmp    r3, #0
25663    bxeq   lr                   @ nothing to do - jump to real handler
25664    EXPORT_PC()
25665    mov    r0, rPC              @ arg0
25666    mov    r1, rFP              @ arg1
25667    mov    r2, rSELF            @ arg2
25668    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25669
25670/* ------------------------------ */
25671    .balign 64
25672.L_ALT_OP_UNUSED_D4FF: /* 0x1d4 */
25673/* File: armv5te/alt_stub.S */
25674/*
25675 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25676 * any interesting requests and then jump to the real instruction
25677 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25678 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25679 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25680 * bail to the real handler if breakFlags==0.
25681 */
25682    ldrb   r3, [rSELF, #offThread_breakFlags]
25683    adrl   lr, dvmAsmInstructionStart + (468 * 64)
25684    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25685    cmp    r3, #0
25686    bxeq   lr                   @ nothing to do - jump to real handler
25687    EXPORT_PC()
25688    mov    r0, rPC              @ arg0
25689    mov    r1, rFP              @ arg1
25690    mov    r2, rSELF            @ arg2
25691    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25692
25693/* ------------------------------ */
25694    .balign 64
25695.L_ALT_OP_UNUSED_D5FF: /* 0x1d5 */
25696/* File: armv5te/alt_stub.S */
25697/*
25698 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25699 * any interesting requests and then jump to the real instruction
25700 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25701 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25702 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25703 * bail to the real handler if breakFlags==0.
25704 */
25705    ldrb   r3, [rSELF, #offThread_breakFlags]
25706    adrl   lr, dvmAsmInstructionStart + (469 * 64)
25707    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25708    cmp    r3, #0
25709    bxeq   lr                   @ nothing to do - jump to real handler
25710    EXPORT_PC()
25711    mov    r0, rPC              @ arg0
25712    mov    r1, rFP              @ arg1
25713    mov    r2, rSELF            @ arg2
25714    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25715
25716/* ------------------------------ */
25717    .balign 64
25718.L_ALT_OP_UNUSED_D6FF: /* 0x1d6 */
25719/* File: armv5te/alt_stub.S */
25720/*
25721 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25722 * any interesting requests and then jump to the real instruction
25723 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25724 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25725 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25726 * bail to the real handler if breakFlags==0.
25727 */
25728    ldrb   r3, [rSELF, #offThread_breakFlags]
25729    adrl   lr, dvmAsmInstructionStart + (470 * 64)
25730    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25731    cmp    r3, #0
25732    bxeq   lr                   @ nothing to do - jump to real handler
25733    EXPORT_PC()
25734    mov    r0, rPC              @ arg0
25735    mov    r1, rFP              @ arg1
25736    mov    r2, rSELF            @ arg2
25737    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25738
25739/* ------------------------------ */
25740    .balign 64
25741.L_ALT_OP_UNUSED_D7FF: /* 0x1d7 */
25742/* File: armv5te/alt_stub.S */
25743/*
25744 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25745 * any interesting requests and then jump to the real instruction
25746 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25747 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25748 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25749 * bail to the real handler if breakFlags==0.
25750 */
25751    ldrb   r3, [rSELF, #offThread_breakFlags]
25752    adrl   lr, dvmAsmInstructionStart + (471 * 64)
25753    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25754    cmp    r3, #0
25755    bxeq   lr                   @ nothing to do - jump to real handler
25756    EXPORT_PC()
25757    mov    r0, rPC              @ arg0
25758    mov    r1, rFP              @ arg1
25759    mov    r2, rSELF            @ arg2
25760    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25761
25762/* ------------------------------ */
25763    .balign 64
25764.L_ALT_OP_UNUSED_D8FF: /* 0x1d8 */
25765/* File: armv5te/alt_stub.S */
25766/*
25767 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25768 * any interesting requests and then jump to the real instruction
25769 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25770 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25771 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25772 * bail to the real handler if breakFlags==0.
25773 */
25774    ldrb   r3, [rSELF, #offThread_breakFlags]
25775    adrl   lr, dvmAsmInstructionStart + (472 * 64)
25776    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25777    cmp    r3, #0
25778    bxeq   lr                   @ nothing to do - jump to real handler
25779    EXPORT_PC()
25780    mov    r0, rPC              @ arg0
25781    mov    r1, rFP              @ arg1
25782    mov    r2, rSELF            @ arg2
25783    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25784
25785/* ------------------------------ */
25786    .balign 64
25787.L_ALT_OP_UNUSED_D9FF: /* 0x1d9 */
25788/* File: armv5te/alt_stub.S */
25789/*
25790 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25791 * any interesting requests and then jump to the real instruction
25792 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25793 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25794 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25795 * bail to the real handler if breakFlags==0.
25796 */
25797    ldrb   r3, [rSELF, #offThread_breakFlags]
25798    adrl   lr, dvmAsmInstructionStart + (473 * 64)
25799    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25800    cmp    r3, #0
25801    bxeq   lr                   @ nothing to do - jump to real handler
25802    EXPORT_PC()
25803    mov    r0, rPC              @ arg0
25804    mov    r1, rFP              @ arg1
25805    mov    r2, rSELF            @ arg2
25806    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25807
25808/* ------------------------------ */
25809    .balign 64
25810.L_ALT_OP_UNUSED_DAFF: /* 0x1da */
25811/* File: armv5te/alt_stub.S */
25812/*
25813 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25814 * any interesting requests and then jump to the real instruction
25815 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25816 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25817 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25818 * bail to the real handler if breakFlags==0.
25819 */
25820    ldrb   r3, [rSELF, #offThread_breakFlags]
25821    adrl   lr, dvmAsmInstructionStart + (474 * 64)
25822    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25823    cmp    r3, #0
25824    bxeq   lr                   @ nothing to do - jump to real handler
25825    EXPORT_PC()
25826    mov    r0, rPC              @ arg0
25827    mov    r1, rFP              @ arg1
25828    mov    r2, rSELF            @ arg2
25829    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25830
25831/* ------------------------------ */
25832    .balign 64
25833.L_ALT_OP_UNUSED_DBFF: /* 0x1db */
25834/* File: armv5te/alt_stub.S */
25835/*
25836 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25837 * any interesting requests and then jump to the real instruction
25838 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25839 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25840 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25841 * bail to the real handler if breakFlags==0.
25842 */
25843    ldrb   r3, [rSELF, #offThread_breakFlags]
25844    adrl   lr, dvmAsmInstructionStart + (475 * 64)
25845    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25846    cmp    r3, #0
25847    bxeq   lr                   @ nothing to do - jump to real handler
25848    EXPORT_PC()
25849    mov    r0, rPC              @ arg0
25850    mov    r1, rFP              @ arg1
25851    mov    r2, rSELF            @ arg2
25852    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25853
25854/* ------------------------------ */
25855    .balign 64
25856.L_ALT_OP_UNUSED_DCFF: /* 0x1dc */
25857/* File: armv5te/alt_stub.S */
25858/*
25859 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25860 * any interesting requests and then jump to the real instruction
25861 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25862 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25863 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25864 * bail to the real handler if breakFlags==0.
25865 */
25866    ldrb   r3, [rSELF, #offThread_breakFlags]
25867    adrl   lr, dvmAsmInstructionStart + (476 * 64)
25868    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25869    cmp    r3, #0
25870    bxeq   lr                   @ nothing to do - jump to real handler
25871    EXPORT_PC()
25872    mov    r0, rPC              @ arg0
25873    mov    r1, rFP              @ arg1
25874    mov    r2, rSELF            @ arg2
25875    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25876
25877/* ------------------------------ */
25878    .balign 64
25879.L_ALT_OP_UNUSED_DDFF: /* 0x1dd */
25880/* File: armv5te/alt_stub.S */
25881/*
25882 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25883 * any interesting requests and then jump to the real instruction
25884 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25885 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25886 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25887 * bail to the real handler if breakFlags==0.
25888 */
25889    ldrb   r3, [rSELF, #offThread_breakFlags]
25890    adrl   lr, dvmAsmInstructionStart + (477 * 64)
25891    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25892    cmp    r3, #0
25893    bxeq   lr                   @ nothing to do - jump to real handler
25894    EXPORT_PC()
25895    mov    r0, rPC              @ arg0
25896    mov    r1, rFP              @ arg1
25897    mov    r2, rSELF            @ arg2
25898    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25899
25900/* ------------------------------ */
25901    .balign 64
25902.L_ALT_OP_UNUSED_DEFF: /* 0x1de */
25903/* File: armv5te/alt_stub.S */
25904/*
25905 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25906 * any interesting requests and then jump to the real instruction
25907 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25908 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25909 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25910 * bail to the real handler if breakFlags==0.
25911 */
25912    ldrb   r3, [rSELF, #offThread_breakFlags]
25913    adrl   lr, dvmAsmInstructionStart + (478 * 64)
25914    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25915    cmp    r3, #0
25916    bxeq   lr                   @ nothing to do - jump to real handler
25917    EXPORT_PC()
25918    mov    r0, rPC              @ arg0
25919    mov    r1, rFP              @ arg1
25920    mov    r2, rSELF            @ arg2
25921    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25922
25923/* ------------------------------ */
25924    .balign 64
25925.L_ALT_OP_UNUSED_DFFF: /* 0x1df */
25926/* File: armv5te/alt_stub.S */
25927/*
25928 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25929 * any interesting requests and then jump to the real instruction
25930 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25931 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25932 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25933 * bail to the real handler if breakFlags==0.
25934 */
25935    ldrb   r3, [rSELF, #offThread_breakFlags]
25936    adrl   lr, dvmAsmInstructionStart + (479 * 64)
25937    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25938    cmp    r3, #0
25939    bxeq   lr                   @ nothing to do - jump to real handler
25940    EXPORT_PC()
25941    mov    r0, rPC              @ arg0
25942    mov    r1, rFP              @ arg1
25943    mov    r2, rSELF            @ arg2
25944    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25945
25946/* ------------------------------ */
25947    .balign 64
25948.L_ALT_OP_UNUSED_E0FF: /* 0x1e0 */
25949/* File: armv5te/alt_stub.S */
25950/*
25951 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25952 * any interesting requests and then jump to the real instruction
25953 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25954 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25955 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25956 * bail to the real handler if breakFlags==0.
25957 */
25958    ldrb   r3, [rSELF, #offThread_breakFlags]
25959    adrl   lr, dvmAsmInstructionStart + (480 * 64)
25960    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25961    cmp    r3, #0
25962    bxeq   lr                   @ nothing to do - jump to real handler
25963    EXPORT_PC()
25964    mov    r0, rPC              @ arg0
25965    mov    r1, rFP              @ arg1
25966    mov    r2, rSELF            @ arg2
25967    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25968
25969/* ------------------------------ */
25970    .balign 64
25971.L_ALT_OP_UNUSED_E1FF: /* 0x1e1 */
25972/* File: armv5te/alt_stub.S */
25973/*
25974 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25975 * any interesting requests and then jump to the real instruction
25976 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25977 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25978 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25979 * bail to the real handler if breakFlags==0.
25980 */
25981    ldrb   r3, [rSELF, #offThread_breakFlags]
25982    adrl   lr, dvmAsmInstructionStart + (481 * 64)
25983    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25984    cmp    r3, #0
25985    bxeq   lr                   @ nothing to do - jump to real handler
25986    EXPORT_PC()
25987    mov    r0, rPC              @ arg0
25988    mov    r1, rFP              @ arg1
25989    mov    r2, rSELF            @ arg2
25990    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25991
25992/* ------------------------------ */
25993    .balign 64
25994.L_ALT_OP_UNUSED_E2FF: /* 0x1e2 */
25995/* File: armv5te/alt_stub.S */
25996/*
25997 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25998 * any interesting requests and then jump to the real instruction
25999 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26000 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26001 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26002 * bail to the real handler if breakFlags==0.
26003 */
26004    ldrb   r3, [rSELF, #offThread_breakFlags]
26005    adrl   lr, dvmAsmInstructionStart + (482 * 64)
26006    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26007    cmp    r3, #0
26008    bxeq   lr                   @ nothing to do - jump to real handler
26009    EXPORT_PC()
26010    mov    r0, rPC              @ arg0
26011    mov    r1, rFP              @ arg1
26012    mov    r2, rSELF            @ arg2
26013    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26014
26015/* ------------------------------ */
26016    .balign 64
26017.L_ALT_OP_UNUSED_E3FF: /* 0x1e3 */
26018/* File: armv5te/alt_stub.S */
26019/*
26020 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26021 * any interesting requests and then jump to the real instruction
26022 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26023 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26024 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26025 * bail to the real handler if breakFlags==0.
26026 */
26027    ldrb   r3, [rSELF, #offThread_breakFlags]
26028    adrl   lr, dvmAsmInstructionStart + (483 * 64)
26029    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26030    cmp    r3, #0
26031    bxeq   lr                   @ nothing to do - jump to real handler
26032    EXPORT_PC()
26033    mov    r0, rPC              @ arg0
26034    mov    r1, rFP              @ arg1
26035    mov    r2, rSELF            @ arg2
26036    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26037
26038/* ------------------------------ */
26039    .balign 64
26040.L_ALT_OP_UNUSED_E4FF: /* 0x1e4 */
26041/* File: armv5te/alt_stub.S */
26042/*
26043 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26044 * any interesting requests and then jump to the real instruction
26045 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26046 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26047 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26048 * bail to the real handler if breakFlags==0.
26049 */
26050    ldrb   r3, [rSELF, #offThread_breakFlags]
26051    adrl   lr, dvmAsmInstructionStart + (484 * 64)
26052    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26053    cmp    r3, #0
26054    bxeq   lr                   @ nothing to do - jump to real handler
26055    EXPORT_PC()
26056    mov    r0, rPC              @ arg0
26057    mov    r1, rFP              @ arg1
26058    mov    r2, rSELF            @ arg2
26059    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26060
26061/* ------------------------------ */
26062    .balign 64
26063.L_ALT_OP_UNUSED_E5FF: /* 0x1e5 */
26064/* File: armv5te/alt_stub.S */
26065/*
26066 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26067 * any interesting requests and then jump to the real instruction
26068 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26069 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26070 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26071 * bail to the real handler if breakFlags==0.
26072 */
26073    ldrb   r3, [rSELF, #offThread_breakFlags]
26074    adrl   lr, dvmAsmInstructionStart + (485 * 64)
26075    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26076    cmp    r3, #0
26077    bxeq   lr                   @ nothing to do - jump to real handler
26078    EXPORT_PC()
26079    mov    r0, rPC              @ arg0
26080    mov    r1, rFP              @ arg1
26081    mov    r2, rSELF            @ arg2
26082    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26083
26084/* ------------------------------ */
26085    .balign 64
26086.L_ALT_OP_UNUSED_E6FF: /* 0x1e6 */
26087/* File: armv5te/alt_stub.S */
26088/*
26089 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26090 * any interesting requests and then jump to the real instruction
26091 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26092 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26093 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26094 * bail to the real handler if breakFlags==0.
26095 */
26096    ldrb   r3, [rSELF, #offThread_breakFlags]
26097    adrl   lr, dvmAsmInstructionStart + (486 * 64)
26098    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26099    cmp    r3, #0
26100    bxeq   lr                   @ nothing to do - jump to real handler
26101    EXPORT_PC()
26102    mov    r0, rPC              @ arg0
26103    mov    r1, rFP              @ arg1
26104    mov    r2, rSELF            @ arg2
26105    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26106
26107/* ------------------------------ */
26108    .balign 64
26109.L_ALT_OP_UNUSED_E7FF: /* 0x1e7 */
26110/* File: armv5te/alt_stub.S */
26111/*
26112 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26113 * any interesting requests and then jump to the real instruction
26114 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26115 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26116 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26117 * bail to the real handler if breakFlags==0.
26118 */
26119    ldrb   r3, [rSELF, #offThread_breakFlags]
26120    adrl   lr, dvmAsmInstructionStart + (487 * 64)
26121    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26122    cmp    r3, #0
26123    bxeq   lr                   @ nothing to do - jump to real handler
26124    EXPORT_PC()
26125    mov    r0, rPC              @ arg0
26126    mov    r1, rFP              @ arg1
26127    mov    r2, rSELF            @ arg2
26128    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26129
26130/* ------------------------------ */
26131    .balign 64
26132.L_ALT_OP_UNUSED_E8FF: /* 0x1e8 */
26133/* File: armv5te/alt_stub.S */
26134/*
26135 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26136 * any interesting requests and then jump to the real instruction
26137 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26138 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26139 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26140 * bail to the real handler if breakFlags==0.
26141 */
26142    ldrb   r3, [rSELF, #offThread_breakFlags]
26143    adrl   lr, dvmAsmInstructionStart + (488 * 64)
26144    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26145    cmp    r3, #0
26146    bxeq   lr                   @ nothing to do - jump to real handler
26147    EXPORT_PC()
26148    mov    r0, rPC              @ arg0
26149    mov    r1, rFP              @ arg1
26150    mov    r2, rSELF            @ arg2
26151    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26152
26153/* ------------------------------ */
26154    .balign 64
26155.L_ALT_OP_UNUSED_E9FF: /* 0x1e9 */
26156/* File: armv5te/alt_stub.S */
26157/*
26158 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26159 * any interesting requests and then jump to the real instruction
26160 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26161 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26162 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26163 * bail to the real handler if breakFlags==0.
26164 */
26165    ldrb   r3, [rSELF, #offThread_breakFlags]
26166    adrl   lr, dvmAsmInstructionStart + (489 * 64)
26167    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26168    cmp    r3, #0
26169    bxeq   lr                   @ nothing to do - jump to real handler
26170    EXPORT_PC()
26171    mov    r0, rPC              @ arg0
26172    mov    r1, rFP              @ arg1
26173    mov    r2, rSELF            @ arg2
26174    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26175
26176/* ------------------------------ */
26177    .balign 64
26178.L_ALT_OP_UNUSED_EAFF: /* 0x1ea */
26179/* File: armv5te/alt_stub.S */
26180/*
26181 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26182 * any interesting requests and then jump to the real instruction
26183 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26184 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26185 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26186 * bail to the real handler if breakFlags==0.
26187 */
26188    ldrb   r3, [rSELF, #offThread_breakFlags]
26189    adrl   lr, dvmAsmInstructionStart + (490 * 64)
26190    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26191    cmp    r3, #0
26192    bxeq   lr                   @ nothing to do - jump to real handler
26193    EXPORT_PC()
26194    mov    r0, rPC              @ arg0
26195    mov    r1, rFP              @ arg1
26196    mov    r2, rSELF            @ arg2
26197    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26198
26199/* ------------------------------ */
26200    .balign 64
26201.L_ALT_OP_UNUSED_EBFF: /* 0x1eb */
26202/* File: armv5te/alt_stub.S */
26203/*
26204 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26205 * any interesting requests and then jump to the real instruction
26206 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26207 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26208 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26209 * bail to the real handler if breakFlags==0.
26210 */
26211    ldrb   r3, [rSELF, #offThread_breakFlags]
26212    adrl   lr, dvmAsmInstructionStart + (491 * 64)
26213    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26214    cmp    r3, #0
26215    bxeq   lr                   @ nothing to do - jump to real handler
26216    EXPORT_PC()
26217    mov    r0, rPC              @ arg0
26218    mov    r1, rFP              @ arg1
26219    mov    r2, rSELF            @ arg2
26220    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26221
26222/* ------------------------------ */
26223    .balign 64
26224.L_ALT_OP_UNUSED_ECFF: /* 0x1ec */
26225/* File: armv5te/alt_stub.S */
26226/*
26227 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26228 * any interesting requests and then jump to the real instruction
26229 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26230 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26231 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26232 * bail to the real handler if breakFlags==0.
26233 */
26234    ldrb   r3, [rSELF, #offThread_breakFlags]
26235    adrl   lr, dvmAsmInstructionStart + (492 * 64)
26236    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26237    cmp    r3, #0
26238    bxeq   lr                   @ nothing to do - jump to real handler
26239    EXPORT_PC()
26240    mov    r0, rPC              @ arg0
26241    mov    r1, rFP              @ arg1
26242    mov    r2, rSELF            @ arg2
26243    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26244
26245/* ------------------------------ */
26246    .balign 64
26247.L_ALT_OP_UNUSED_EDFF: /* 0x1ed */
26248/* File: armv5te/alt_stub.S */
26249/*
26250 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26251 * any interesting requests and then jump to the real instruction
26252 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26253 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26254 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26255 * bail to the real handler if breakFlags==0.
26256 */
26257    ldrb   r3, [rSELF, #offThread_breakFlags]
26258    adrl   lr, dvmAsmInstructionStart + (493 * 64)
26259    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26260    cmp    r3, #0
26261    bxeq   lr                   @ nothing to do - jump to real handler
26262    EXPORT_PC()
26263    mov    r0, rPC              @ arg0
26264    mov    r1, rFP              @ arg1
26265    mov    r2, rSELF            @ arg2
26266    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26267
26268/* ------------------------------ */
26269    .balign 64
26270.L_ALT_OP_UNUSED_EEFF: /* 0x1ee */
26271/* File: armv5te/alt_stub.S */
26272/*
26273 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26274 * any interesting requests and then jump to the real instruction
26275 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26276 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26277 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26278 * bail to the real handler if breakFlags==0.
26279 */
26280    ldrb   r3, [rSELF, #offThread_breakFlags]
26281    adrl   lr, dvmAsmInstructionStart + (494 * 64)
26282    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26283    cmp    r3, #0
26284    bxeq   lr                   @ nothing to do - jump to real handler
26285    EXPORT_PC()
26286    mov    r0, rPC              @ arg0
26287    mov    r1, rFP              @ arg1
26288    mov    r2, rSELF            @ arg2
26289    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26290
26291/* ------------------------------ */
26292    .balign 64
26293.L_ALT_OP_UNUSED_EFFF: /* 0x1ef */
26294/* File: armv5te/alt_stub.S */
26295/*
26296 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26297 * any interesting requests and then jump to the real instruction
26298 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26299 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26300 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26301 * bail to the real handler if breakFlags==0.
26302 */
26303    ldrb   r3, [rSELF, #offThread_breakFlags]
26304    adrl   lr, dvmAsmInstructionStart + (495 * 64)
26305    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26306    cmp    r3, #0
26307    bxeq   lr                   @ nothing to do - jump to real handler
26308    EXPORT_PC()
26309    mov    r0, rPC              @ arg0
26310    mov    r1, rFP              @ arg1
26311    mov    r2, rSELF            @ arg2
26312    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26313
26314/* ------------------------------ */
26315    .balign 64
26316.L_ALT_OP_UNUSED_F0FF: /* 0x1f0 */
26317/* File: armv5te/alt_stub.S */
26318/*
26319 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26320 * any interesting requests and then jump to the real instruction
26321 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26322 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26323 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26324 * bail to the real handler if breakFlags==0.
26325 */
26326    ldrb   r3, [rSELF, #offThread_breakFlags]
26327    adrl   lr, dvmAsmInstructionStart + (496 * 64)
26328    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26329    cmp    r3, #0
26330    bxeq   lr                   @ nothing to do - jump to real handler
26331    EXPORT_PC()
26332    mov    r0, rPC              @ arg0
26333    mov    r1, rFP              @ arg1
26334    mov    r2, rSELF            @ arg2
26335    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26336
26337/* ------------------------------ */
26338    .balign 64
26339.L_ALT_OP_UNUSED_F1FF: /* 0x1f1 */
26340/* File: armv5te/alt_stub.S */
26341/*
26342 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26343 * any interesting requests and then jump to the real instruction
26344 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26345 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26346 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26347 * bail to the real handler if breakFlags==0.
26348 */
26349    ldrb   r3, [rSELF, #offThread_breakFlags]
26350    adrl   lr, dvmAsmInstructionStart + (497 * 64)
26351    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26352    cmp    r3, #0
26353    bxeq   lr                   @ nothing to do - jump to real handler
26354    EXPORT_PC()
26355    mov    r0, rPC              @ arg0
26356    mov    r1, rFP              @ arg1
26357    mov    r2, rSELF            @ arg2
26358    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26359
26360/* ------------------------------ */
26361    .balign 64
26362.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
26363/* File: armv5te/alt_stub.S */
26364/*
26365 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26366 * any interesting requests and then jump to the real instruction
26367 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26368 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26369 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26370 * bail to the real handler if breakFlags==0.
26371 */
26372    ldrb   r3, [rSELF, #offThread_breakFlags]
26373    adrl   lr, dvmAsmInstructionStart + (498 * 64)
26374    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26375    cmp    r3, #0
26376    bxeq   lr                   @ nothing to do - jump to real handler
26377    EXPORT_PC()
26378    mov    r0, rPC              @ arg0
26379    mov    r1, rFP              @ arg1
26380    mov    r2, rSELF            @ arg2
26381    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26382
26383/* ------------------------------ */
26384    .balign 64
26385.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
26386/* File: armv5te/alt_stub.S */
26387/*
26388 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26389 * any interesting requests and then jump to the real instruction
26390 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26391 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26392 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26393 * bail to the real handler if breakFlags==0.
26394 */
26395    ldrb   r3, [rSELF, #offThread_breakFlags]
26396    adrl   lr, dvmAsmInstructionStart + (499 * 64)
26397    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26398    cmp    r3, #0
26399    bxeq   lr                   @ nothing to do - jump to real handler
26400    EXPORT_PC()
26401    mov    r0, rPC              @ arg0
26402    mov    r1, rFP              @ arg1
26403    mov    r2, rSELF            @ arg2
26404    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26405
26406/* ------------------------------ */
26407    .balign 64
26408.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
26409/* File: armv5te/alt_stub.S */
26410/*
26411 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26412 * any interesting requests and then jump to the real instruction
26413 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26414 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26415 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26416 * bail to the real handler if breakFlags==0.
26417 */
26418    ldrb   r3, [rSELF, #offThread_breakFlags]
26419    adrl   lr, dvmAsmInstructionStart + (500 * 64)
26420    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26421    cmp    r3, #0
26422    bxeq   lr                   @ nothing to do - jump to real handler
26423    EXPORT_PC()
26424    mov    r0, rPC              @ arg0
26425    mov    r1, rFP              @ arg1
26426    mov    r2, rSELF            @ arg2
26427    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26428
26429/* ------------------------------ */
26430    .balign 64
26431.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
26432/* File: armv5te/alt_stub.S */
26433/*
26434 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26435 * any interesting requests and then jump to the real instruction
26436 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26437 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26438 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26439 * bail to the real handler if breakFlags==0.
26440 */
26441    ldrb   r3, [rSELF, #offThread_breakFlags]
26442    adrl   lr, dvmAsmInstructionStart + (501 * 64)
26443    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26444    cmp    r3, #0
26445    bxeq   lr                   @ nothing to do - jump to real handler
26446    EXPORT_PC()
26447    mov    r0, rPC              @ arg0
26448    mov    r1, rFP              @ arg1
26449    mov    r2, rSELF            @ arg2
26450    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26451
26452/* ------------------------------ */
26453    .balign 64
26454.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
26455/* File: armv5te/alt_stub.S */
26456/*
26457 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26458 * any interesting requests and then jump to the real instruction
26459 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26460 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26461 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26462 * bail to the real handler if breakFlags==0.
26463 */
26464    ldrb   r3, [rSELF, #offThread_breakFlags]
26465    adrl   lr, dvmAsmInstructionStart + (502 * 64)
26466    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26467    cmp    r3, #0
26468    bxeq   lr                   @ nothing to do - jump to real handler
26469    EXPORT_PC()
26470    mov    r0, rPC              @ arg0
26471    mov    r1, rFP              @ arg1
26472    mov    r2, rSELF            @ arg2
26473    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26474
26475/* ------------------------------ */
26476    .balign 64
26477.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
26478/* File: armv5te/alt_stub.S */
26479/*
26480 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26481 * any interesting requests and then jump to the real instruction
26482 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26483 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26484 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26485 * bail to the real handler if breakFlags==0.
26486 */
26487    ldrb   r3, [rSELF, #offThread_breakFlags]
26488    adrl   lr, dvmAsmInstructionStart + (503 * 64)
26489    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26490    cmp    r3, #0
26491    bxeq   lr                   @ nothing to do - jump to real handler
26492    EXPORT_PC()
26493    mov    r0, rPC              @ arg0
26494    mov    r1, rFP              @ arg1
26495    mov    r2, rSELF            @ arg2
26496    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26497
26498/* ------------------------------ */
26499    .balign 64
26500.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
26501/* File: armv5te/alt_stub.S */
26502/*
26503 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26504 * any interesting requests and then jump to the real instruction
26505 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26506 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26507 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26508 * bail to the real handler if breakFlags==0.
26509 */
26510    ldrb   r3, [rSELF, #offThread_breakFlags]
26511    adrl   lr, dvmAsmInstructionStart + (504 * 64)
26512    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26513    cmp    r3, #0
26514    bxeq   lr                   @ nothing to do - jump to real handler
26515    EXPORT_PC()
26516    mov    r0, rPC              @ arg0
26517    mov    r1, rFP              @ arg1
26518    mov    r2, rSELF            @ arg2
26519    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26520
26521/* ------------------------------ */
26522    .balign 64
26523.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
26524/* File: armv5te/alt_stub.S */
26525/*
26526 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26527 * any interesting requests and then jump to the real instruction
26528 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26529 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26530 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26531 * bail to the real handler if breakFlags==0.
26532 */
26533    ldrb   r3, [rSELF, #offThread_breakFlags]
26534    adrl   lr, dvmAsmInstructionStart + (505 * 64)
26535    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26536    cmp    r3, #0
26537    bxeq   lr                   @ nothing to do - jump to real handler
26538    EXPORT_PC()
26539    mov    r0, rPC              @ arg0
26540    mov    r1, rFP              @ arg1
26541    mov    r2, rSELF            @ arg2
26542    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26543
26544/* ------------------------------ */
26545    .balign 64
26546.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
26547/* File: armv5te/alt_stub.S */
26548/*
26549 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26550 * any interesting requests and then jump to the real instruction
26551 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26552 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26553 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26554 * bail to the real handler if breakFlags==0.
26555 */
26556    ldrb   r3, [rSELF, #offThread_breakFlags]
26557    adrl   lr, dvmAsmInstructionStart + (506 * 64)
26558    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26559    cmp    r3, #0
26560    bxeq   lr                   @ nothing to do - jump to real handler
26561    EXPORT_PC()
26562    mov    r0, rPC              @ arg0
26563    mov    r1, rFP              @ arg1
26564    mov    r2, rSELF            @ arg2
26565    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26566
26567/* ------------------------------ */
26568    .balign 64
26569.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
26570/* File: armv5te/alt_stub.S */
26571/*
26572 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26573 * any interesting requests and then jump to the real instruction
26574 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26575 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26576 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26577 * bail to the real handler if breakFlags==0.
26578 */
26579    ldrb   r3, [rSELF, #offThread_breakFlags]
26580    adrl   lr, dvmAsmInstructionStart + (507 * 64)
26581    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26582    cmp    r3, #0
26583    bxeq   lr                   @ nothing to do - jump to real handler
26584    EXPORT_PC()
26585    mov    r0, rPC              @ arg0
26586    mov    r1, rFP              @ arg1
26587    mov    r2, rSELF            @ arg2
26588    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26589
26590/* ------------------------------ */
26591    .balign 64
26592.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
26593/* File: armv5te/alt_stub.S */
26594/*
26595 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26596 * any interesting requests and then jump to the real instruction
26597 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26598 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26599 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26600 * bail to the real handler if breakFlags==0.
26601 */
26602    ldrb   r3, [rSELF, #offThread_breakFlags]
26603    adrl   lr, dvmAsmInstructionStart + (508 * 64)
26604    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26605    cmp    r3, #0
26606    bxeq   lr                   @ nothing to do - jump to real handler
26607    EXPORT_PC()
26608    mov    r0, rPC              @ arg0
26609    mov    r1, rFP              @ arg1
26610    mov    r2, rSELF            @ arg2
26611    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26612
26613/* ------------------------------ */
26614    .balign 64
26615.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
26616/* File: armv5te/alt_stub.S */
26617/*
26618 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26619 * any interesting requests and then jump to the real instruction
26620 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26621 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26622 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26623 * bail to the real handler if breakFlags==0.
26624 */
26625    ldrb   r3, [rSELF, #offThread_breakFlags]
26626    adrl   lr, dvmAsmInstructionStart + (509 * 64)
26627    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26628    cmp    r3, #0
26629    bxeq   lr                   @ nothing to do - jump to real handler
26630    EXPORT_PC()
26631    mov    r0, rPC              @ arg0
26632    mov    r1, rFP              @ arg1
26633    mov    r2, rSELF            @ arg2
26634    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26635
26636/* ------------------------------ */
26637    .balign 64
26638.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
26639/* File: armv5te/alt_stub.S */
26640/*
26641 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26642 * any interesting requests and then jump to the real instruction
26643 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26644 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26645 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26646 * bail to the real handler if breakFlags==0.
26647 */
26648    ldrb   r3, [rSELF, #offThread_breakFlags]
26649    adrl   lr, dvmAsmInstructionStart + (510 * 64)
26650    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26651    cmp    r3, #0
26652    bxeq   lr                   @ nothing to do - jump to real handler
26653    EXPORT_PC()
26654    mov    r0, rPC              @ arg0
26655    mov    r1, rFP              @ arg1
26656    mov    r2, rSELF            @ arg2
26657    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26658
26659/* ------------------------------ */
26660    .balign 64
26661.L_ALT_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
26662/* File: armv5te/alt_stub.S */
26663/*
26664 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26665 * any interesting requests and then jump to the real instruction
26666 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26667 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26668 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26669 * bail to the real handler if breakFlags==0.
26670 */
26671    ldrb   r3, [rSELF, #offThread_breakFlags]
26672    adrl   lr, dvmAsmInstructionStart + (511 * 64)
26673    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26674    cmp    r3, #0
26675    bxeq   lr                   @ nothing to do - jump to real handler
26676    EXPORT_PC()
26677    mov    r0, rPC              @ arg0
26678    mov    r1, rFP              @ arg1
26679    mov    r2, rSELF            @ arg2
26680    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26681
26682    .balign 64
26683    .size   dvmAsmAltInstructionStart, .-dvmAsmAltInstructionStart
26684    .global dvmAsmAltInstructionEnd
26685dvmAsmAltInstructionEnd:
26686/* File: armv5te/footer.S */
26687/*
26688 * ===========================================================================
26689 *  Common subroutines and data
26690 * ===========================================================================
26691 */
26692
26693    .text
26694    .align  2
26695
26696#if defined(WITH_JIT)
26697
26698#if defined(WITH_SELF_VERIFICATION)
26699/*
26700 * "longjmp" to a translation after single-stepping.  Before returning
26701 * to translation, must save state for self-verification.
26702 */
26703    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26704dvmJitResumeTranslation:
26705    mov    rSELF, r0                             @ restore self
26706    mov    rPC, r1                               @ restore Dalvik pc
26707    mov    rFP, r2                               @ restore Dalvik fp
26708    ldr    r10, [rSELF,#offThread_jitResumeNPC]  @ resume address
26709    mov    r2, #0
26710    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26711    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26712    b      jitSVShadowRunStart                   @ resume as if cache hit
26713                                                 @ expects resume addr in r10
26714
26715    .global dvmJitToInterpPunt
26716dvmJitToInterpPunt:
26717    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
26718    mov    r3, #0
26719    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26720    b      jitSVShadowRunEnd            @ doesn't return
26721
26722    .global dvmJitToInterpSingleStep
26723dvmJitToInterpSingleStep:
26724    mov    rPC, r0              @ set up dalvik pc
26725    EXPORT_PC()
26726    str    lr, [rSELF,#offThread_jitResumeNPC]
26727    str    sp, [rSELF,#offThread_jitResumeNSP]
26728    str    r1, [rSELF,#offThread_jitResumeDPC]
26729    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
26730    b      jitSVShadowRunEnd            @ doesn't return
26731
26732
26733    .global dvmJitToInterpNoChainNoProfile
26734dvmJitToInterpNoChainNoProfile:
26735    mov    r0,rPC                       @ pass our target PC
26736    mov    r2,#kSVSNoProfile            @ r2<- interpreter entry point
26737    mov    r3, #0                       @ 0 means !inJitCodeCache
26738    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26739    b      jitSVShadowRunEnd            @ doesn't return
26740
26741    .global dvmJitToInterpTraceSelectNoChain
26742dvmJitToInterpTraceSelectNoChain:
26743    mov    r0,rPC                       @ pass our target PC
26744    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26745    mov    r3, #0                       @ 0 means !inJitCodeCache
26746    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26747    b      jitSVShadowRunEnd            @ doesn't return
26748
26749    .global dvmJitToInterpTraceSelect
26750dvmJitToInterpTraceSelect:
26751    ldr    r0,[lr, #-1]                 @ pass our target PC
26752    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26753    mov    r3, #0                       @ 0 means !inJitCodeCache
26754    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26755    b      jitSVShadowRunEnd            @ doesn't return
26756
26757    .global dvmJitToInterpBackwardBranch
26758dvmJitToInterpBackwardBranch:
26759    ldr    r0,[lr, #-1]                 @ pass our target PC
26760    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
26761    mov    r3, #0                       @ 0 means !inJitCodeCache
26762    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26763    b      jitSVShadowRunEnd            @ doesn't return
26764
26765    .global dvmJitToInterpNormal
26766dvmJitToInterpNormal:
26767    ldr    r0,[lr, #-1]                 @ pass our target PC
26768    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
26769    mov    r3, #0                       @ 0 means !inJitCodeCache
26770    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26771    b      jitSVShadowRunEnd            @ doesn't return
26772
26773    .global dvmJitToInterpNoChain
26774dvmJitToInterpNoChain:
26775    mov    r0,rPC                       @ pass our target PC
26776    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
26777    mov    r3, #0                       @ 0 means !inJitCodeCache
26778    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26779    b      jitSVShadowRunEnd            @ doesn't return
26780#else
26781
26782/*
26783 * "longjmp" to a translation after single-stepping.
26784 */
26785    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26786dvmJitResumeTranslation:
26787    mov    rSELF, r0                             @ restore self
26788    mov    rPC, r1                               @ restore Dalvik pc
26789    mov    rFP, r2                               @ restore Dalvik fp
26790    ldr    r0, [rSELF,#offThread_jitResumeNPC]
26791    mov    r2, #0
26792    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26793    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26794    bx     r0                                    @ resume translation
26795
26796/*
26797 * Return from the translation cache to the interpreter when the compiler is
26798 * having issues translating/executing a Dalvik instruction. We have to skip
26799 * the code cache lookup otherwise it is possible to indefinitely bouce
26800 * between the interpreter and the code cache if the instruction that fails
26801 * to be compiled happens to be at a trace start.
26802 */
26803    .global dvmJitToInterpPunt
26804dvmJitToInterpPunt:
26805    mov    rPC, r0
26806#if defined(WITH_JIT_TUNING)
26807    mov    r0,lr
26808    bl     dvmBumpPunt;
26809#endif
26810    EXPORT_PC()
26811    mov    r0, #0
26812    str    r0, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26813    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26814    FETCH_INST()
26815    GET_INST_OPCODE(ip)
26816    GOTO_OPCODE(ip)
26817
26818/*
26819 * Return to the interpreter to handle a single instruction.
26820 * We'll use the normal single-stepping mechanism via interpBreak,
26821 * but also save the native pc of the resume point in the translation
26822 * and the native sp so that we can later do the equivalent of a
26823 * longjmp() to resume.
26824 * On entry:
26825 *    dPC <= Dalvik PC of instrucion to interpret
26826 *    lr <= resume point in translation
26827 *    r1 <= Dalvik PC of next instruction
26828 */
26829    .global dvmJitToInterpSingleStep
26830dvmJitToInterpSingleStep:
26831    mov    rPC, r0              @ set up dalvik pc
26832    EXPORT_PC()
26833    str    lr, [rSELF,#offThread_jitResumeNPC]
26834    str    sp, [rSELF,#offThread_jitResumeNSP]
26835    str    r1, [rSELF,#offThread_jitResumeDPC]
26836    mov    r1, #1
26837    str    r1, [rSELF,#offThread_singleStepCount]  @ just step once
26838    mov    r0, rSELF
26839    mov    r1, #kSubModeCountedStep
26840    bl     dvmEnableSubMode     @ (self, newMode)
26841    ldr    rIBASE, [rSELF,#offThread_curHandlerTable]
26842    FETCH_INST()
26843    GET_INST_OPCODE(ip)
26844    GOTO_OPCODE(ip)
26845
26846/*
26847 * Return from the translation cache and immediately request
26848 * a translation for the exit target.  Commonly used for callees.
26849 */
26850    .global dvmJitToInterpTraceSelectNoChain
26851dvmJitToInterpTraceSelectNoChain:
26852#if defined(WITH_JIT_TUNING)
26853    bl     dvmBumpNoChain
26854#endif
26855    mov    r0,rPC
26856    mov    r1,rSELF
26857    bl     dvmJitGetTraceAddrThread @ (pc, self)
26858    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26859    mov    r1, rPC                  @ arg1 of translation may need this
26860    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26861    cmp    r0,#0                    @ !0 means translation exists
26862    bxne   r0                       @ continue native execution if so
26863    b      2f                       @ branch over to use the interpreter
26864
26865/*
26866 * Return from the translation cache and immediately request
26867 * a translation for the exit target.  Commonly used following
26868 * invokes.
26869 */
26870    .global dvmJitToInterpTraceSelect
26871dvmJitToInterpTraceSelect:
26872    ldr    rPC,[lr, #-1]           @ get our target PC
26873    add    rINST,lr,#-5            @ save start of chain branch
26874    add    rINST, #-4              @  .. which is 9 bytes back
26875    mov    r0,rPC
26876    mov    r1,rSELF
26877    bl     dvmJitGetTraceAddrThread @ (pc, self)
26878    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26879    cmp    r0,#0
26880    beq    2f
26881    mov    r1,rINST
26882    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26883    mov    r1, rPC                  @ arg1 of translation may need this
26884    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
26885    cmp    r0,#0                    @ successful chain?
26886    bxne   r0                       @ continue native execution
26887    b      toInterpreter            @ didn't chain - resume with interpreter
26888
26889/* No translation, so request one if profiling isn't disabled*/
268902:
26891    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26892    ldr    r0, [rSELF, #offThread_pJitProfTable]
26893    FETCH_INST()
26894    cmp    r0, #0
26895    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
26896    bne    common_selectTrace
26897    GET_INST_OPCODE(ip)
26898    GOTO_OPCODE(ip)
26899
26900/*
26901 * Return from the translation cache to the interpreter.
26902 * The return was done with a BLX from thumb mode, and
26903 * the following 32-bit word contains the target rPC value.
26904 * Note that lr (r14) will have its low-order bit set to denote
26905 * its thumb-mode origin.
26906 *
26907 * We'll need to stash our lr origin away, recover the new
26908 * target and then check to see if there is a translation available
26909 * for our new target.  If so, we do a translation chain and
26910 * go back to native execution.  Otherwise, it's back to the
26911 * interpreter (after treating this entry as a potential
26912 * trace start).
26913 */
26914    .global dvmJitToInterpNormal
26915dvmJitToInterpNormal:
26916    ldr    rPC,[lr, #-1]           @ get our target PC
26917    add    rINST,lr,#-5            @ save start of chain branch
26918    add    rINST,#-4               @ .. which is 9 bytes back
26919#if defined(WITH_JIT_TUNING)
26920    bl     dvmBumpNormal
26921#endif
26922    mov    r0,rPC
26923    mov    r1,rSELF
26924    bl     dvmJitGetTraceAddrThread @ (pc, self)
26925    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26926    cmp    r0,#0
26927    beq    toInterpreter            @ go if not, otherwise do chain
26928    mov    r1,rINST
26929    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26930    mov    r1, rPC                  @ arg1 of translation may need this
26931    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26932    cmp    r0,#0                    @ successful chain?
26933    bxne   r0                       @ continue native execution
26934    b      toInterpreter            @ didn't chain - resume with interpreter
26935
26936/*
26937 * Return from the translation cache to the interpreter to do method invocation.
26938 * Check if translation exists for the callee, but don't chain to it.
26939 */
26940    .global dvmJitToInterpNoChainNoProfile
26941dvmJitToInterpNoChainNoProfile:
26942#if defined(WITH_JIT_TUNING)
26943    bl     dvmBumpNoChain
26944#endif
26945    mov    r0,rPC
26946    mov    r1,rSELF
26947    bl     dvmJitGetTraceAddrThread @ (pc, self)
26948    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26949    mov    r1, rPC                  @ arg1 of translation may need this
26950    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26951    cmp    r0,#0
26952    bxne   r0                       @ continue native execution if so
26953    EXPORT_PC()
26954    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26955    FETCH_INST()
26956    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26957    GOTO_OPCODE(ip)                     @ jump to next instruction
26958
26959/*
26960 * Return from the translation cache to the interpreter to do method invocation.
26961 * Check if translation exists for the callee, but don't chain to it.
26962 */
26963    .global dvmJitToInterpNoChain
26964dvmJitToInterpNoChain:
26965#if defined(WITH_JIT_TUNING)
26966    bl     dvmBumpNoChain
26967#endif
26968    mov    r0,rPC
26969    mov    r1,rSELF
26970    bl     dvmJitGetTraceAddrThread @ (pc, self)
26971    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26972    mov    r1, rPC                  @ arg1 of translation may need this
26973    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26974    cmp    r0,#0
26975    bxne   r0                       @ continue native execution if so
26976#endif
26977
26978/*
26979 * No translation, restore interpreter regs and start interpreting.
26980 * rSELF & rFP were preserved in the translated code, and rPC has
26981 * already been restored by the time we get here.  We'll need to set
26982 * up rIBASE & rINST, and load the address of the JitTable into r0.
26983 */
26984toInterpreter:
26985    EXPORT_PC()
26986    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26987    FETCH_INST()
26988    ldr    r0, [rSELF, #offThread_pJitProfTable]
26989    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26990    @ NOTE: intended fallthrough
26991
26992/*
26993 * Similar to common_updateProfile, but tests for null pJitProfTable
26994 * r0 holds pJifProfTAble, rINST is loaded, rPC is current and
26995 * rIBASE has been recently refreshed.
26996 */
26997common_testUpdateProfile:
26998    cmp     r0, #0               @ JIT switched off?
26999    beq     4f                   @ return to interp if so
27000
27001/*
27002 * Common code to update potential trace start counter, and initiate
27003 * a trace-build if appropriate.
27004 * On entry here:
27005 *    r0    <= pJitProfTable (verified non-NULL)
27006 *    rPC   <= Dalvik PC
27007 *    rINST <= next instruction
27008 */
27009common_updateProfile:
27010    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
27011    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
27012    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
27013    GET_INST_OPCODE(ip)
27014    subs    r1,r1,#1           @ decrement counter
27015    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
27016    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
27017
27018    /* Looks good, reset the counter */
27019    ldr     r1, [rSELF, #offThread_jitThreshold]
27020    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
27021    EXPORT_PC()
27022    mov     r0,rPC
27023    mov     r1,rSELF
27024    bl      dvmJitGetTraceAddrThread    @ (pc, self)
27025    str     r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
27026    mov     r1, rPC                     @ arg1 of translation may need this
27027    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
27028    cmp     r0,#0
27029#if !defined(WITH_SELF_VERIFICATION)
27030    bxne    r0                          @ jump to the translation
27031    mov     r2,#kJitTSelectRequest      @ ask for trace selection
27032    @ fall-through to common_selectTrace
27033#else
27034    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
27035    beq     common_selectTrace
27036    /*
27037     * At this point, we have a target translation.  However, if
27038     * that translation is actually the interpret-only pseudo-translation
27039     * we want to treat it the same as no translation.
27040     */
27041    mov     r10, r0                     @ save target
27042    bl      dvmCompilerGetInterpretTemplate
27043    cmp     r0, r10                     @ special case?
27044    bne     jitSVShadowRunStart         @ set up self verification shadow space
27045    @ Need to clear the inJitCodeCache flag
27046    mov    r3, #0                       @ 0 means not in the JIT code cache
27047    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
27048    GET_INST_OPCODE(ip)
27049    GOTO_OPCODE(ip)
27050    /* no return */
27051#endif
27052
27053/*
27054 * On entry:
27055 *  r2 is jit state.
27056 */
27057common_selectTrace:
27058    ldrh    r0,[rSELF,#offThread_subMode]
27059    ands    r0, #(kSubModeJitTraceBuild | kSubModeJitSV)
27060    bne     3f                         @ already doing JIT work, continue
27061    str     r2,[rSELF,#offThread_jitState]
27062    mov     r0, rSELF
27063/*
27064 * Call out to validate trace-building request.  If successful,
27065 * rIBASE will be swapped to to send us into single-stepping trace
27066 * building mode, so we need to refresh before we continue.
27067 */
27068    EXPORT_PC()
27069    SAVE_PC_FP_TO_SELF()                 @ copy of pc/fp to Thread
27070    bl      dvmJitCheckTraceRequest
270713:
27072    FETCH_INST()
27073    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
270744:
27075    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27076    GOTO_OPCODE(ip)
27077    /* no return */
27078#endif
27079
27080#if defined(WITH_SELF_VERIFICATION)
27081/*
27082 * Save PC and registers to shadow memory for self verification mode
27083 * before jumping to native translation.
27084 * On entry:
27085 *    rPC, rFP, rSELF: the values that they should contain
27086 *    r10: the address of the target translation.
27087 */
27088jitSVShadowRunStart:
27089    mov     r0,rPC                      @ r0<- program counter
27090    mov     r1,rFP                      @ r1<- frame pointer
27091    mov     r2,rSELF                    @ r2<- self (Thread) pointer
27092    mov     r3,r10                      @ r3<- target translation
27093    bl      dvmSelfVerificationSaveState @ save registers to shadow space
27094    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
27095    bx      r10                         @ jump to the translation
27096
27097/*
27098 * Restore PC, registers, and interpreter state to original values
27099 * before jumping back to the interpreter.
27100 * On entry:
27101 *   r0:  dPC
27102 *   r2:  self verification state
27103 */
27104jitSVShadowRunEnd:
27105    mov    r1,rFP                        @ pass ending fp
27106    mov    r3,rSELF                      @ pass self ptr for convenience
27107    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
27108    LOAD_PC_FP_FROM_SELF()               @ restore pc, fp
27109    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
27110    cmp    r1,#0                         @ check for punt condition
27111    beq    1f
27112    @ Set up SV single-stepping
27113    mov    r0, rSELF
27114    mov    r1, #kSubModeJitSV
27115    bl     dvmEnableSubMode              @ (self, subMode)
27116    mov    r2,#kJitSelfVerification      @ ask for self verification
27117    str    r2,[rSELF,#offThread_jitState]
27118    @ intentional fallthrough
271191:                                       @ exit to interpreter without check
27120    EXPORT_PC()
27121    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
27122    FETCH_INST()
27123    GET_INST_OPCODE(ip)
27124    GOTO_OPCODE(ip)
27125#endif
27126
27127/*
27128 * The equivalent of "goto bail", this calls through the "bail handler".
27129 * It will end this interpreter activation, and return to the caller
27130 * of dvmMterpStdRun.
27131 *
27132 * State registers will be saved to the "thread" area before bailing
27133 * debugging purposes
27134 */
27135common_gotoBail:
27136    SAVE_PC_FP_TO_SELF()                @ export state to "thread"
27137    mov     r0, rSELF                   @ r0<- self ptr
27138    b       dvmMterpStdBail             @ call(self, changeInterp)
27139
27140/*
27141 * The JIT's invoke method needs to remember the callsite class and
27142 * target pair.  Save them here so that they are available to
27143 * dvmCheckJit following the interpretation of this invoke.
27144 */
27145#if defined(WITH_JIT)
27146save_callsiteinfo:
27147    cmp     r9, #0
27148    ldrne   r9, [r9, #offObject_clazz]
27149    str     r0, [rSELF, #offThread_methodToCall]
27150    str     r9, [rSELF, #offThread_callsiteClass]
27151    bx      lr
27152#endif
27153
27154/*
27155 * Common code for jumbo method invocation.
27156 * NOTE: this adjusts rPC to account for the difference in instruction width.
27157 * As a result, the savedPc in the stack frame will not be wholly accurate. So
27158 * long as that is only used for source file line number calculations, we're
27159 * okay.
27160 */
27161common_invokeMethodJumboNoThis:
27162#if defined(WITH_JIT)
27163 /* On entry: r0 is "Method* methodToCall */
27164    mov     r9, #0                      @ clear "this"
27165#endif
27166common_invokeMethodJumbo:
27167 /* On entry: r0 is "Method* methodToCall, r9 is "this" */
27168.LinvokeNewJumbo:
27169#if defined(WITH_JIT)
27170    ldrh    r1, [rSELF, #offThread_subMode]
27171    ands    r1, #kSubModeJitTraceBuild
27172    blne    save_callsiteinfo
27173#endif
27174    @ prepare to copy args to "outs" area of current frame
27175    add     rPC, rPC, #4                @ adjust pc to make return consistent
27176    FETCH(r2, 1)                        @ r2<- BBBB (arg count)
27177    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
27178    cmp     r2, #0                      @ no args?
27179    beq     .LinvokeArgsDone            @ if no args, skip the rest
27180    FETCH(r1, 2)                        @ r1<- CCCC
27181    b       .LinvokeRangeArgs           @ handle args like invoke range
27182
27183/*
27184 * Common code for method invocation with range.
27185 *
27186 * On entry:
27187 *  r0 is "Method* methodToCall", r9 is "this"
27188 */
27189common_invokeMethodRange:
27190.LinvokeNewRange:
27191#if defined(WITH_JIT)
27192    ldrh    r1, [rSELF, #offThread_subMode]
27193    ands    r1, #kSubModeJitTraceBuild
27194    blne    save_callsiteinfo
27195#endif
27196    @ prepare to copy args to "outs" area of current frame
27197    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
27198    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
27199    beq     .LinvokeArgsDone            @ if no args, skip the rest
27200    FETCH(r1, 2)                        @ r1<- CCCC
27201
27202.LinvokeRangeArgs:
27203    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
27204    @ (very few methods have > 10 args; could unroll for common cases)
27205    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
27206    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
272071:  ldr     r1, [r3], #4                @ val = *fp++
27208    subs    r2, r2, #1                  @ count--
27209    str     r1, [r10], #4               @ *outs++ = val
27210    bne     1b                          @ ...while count != 0
27211    b       .LinvokeArgsDone
27212
27213/*
27214 * Common code for method invocation without range.
27215 *
27216 * On entry:
27217 *  r0 is "Method* methodToCall", r9 is "this"
27218 */
27219common_invokeMethodNoRange:
27220.LinvokeNewNoRange:
27221#if defined(WITH_JIT)
27222    ldrh    r1, [rSELF, #offThread_subMode]
27223    ands    r1, #kSubModeJitTraceBuild
27224    blne    save_callsiteinfo
27225#endif
27226    @ prepare to copy args to "outs" area of current frame
27227    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
27228    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
27229    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
27230    beq     .LinvokeArgsDone
27231
27232    @ r0=methodToCall, r1=GFED, r2=count, r10=outs
27233.LinvokeNonRange:
27234    rsb     r2, r2, #5                  @ r2<- 5-r2
27235    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
27236    bl      common_abort                @ (skipped due to ARM prefetch)
272375:  and     ip, rINST, #0x0f00          @ isolate A
27238    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
27239    mov     r0, r0                      @ nop
27240    str     r2, [r10, #-4]!             @ *--outs = vA
272414:  and     ip, r1, #0xf000             @ isolate G
27242    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
27243    mov     r0, r0                      @ nop
27244    str     r2, [r10, #-4]!             @ *--outs = vG
272453:  and     ip, r1, #0x0f00             @ isolate F
27246    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
27247    mov     r0, r0                      @ nop
27248    str     r2, [r10, #-4]!             @ *--outs = vF
272492:  and     ip, r1, #0x00f0             @ isolate E
27250    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
27251    mov     r0, r0                      @ nop
27252    str     r2, [r10, #-4]!             @ *--outs = vE
272531:  and     ip, r1, #0x000f             @ isolate D
27254    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
27255    mov     r0, r0                      @ nop
27256    str     r2, [r10, #-4]!             @ *--outs = vD
272570:  @ fall through to .LinvokeArgsDone
27258
27259.LinvokeArgsDone: @ r0=methodToCall
27260    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
27261    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
27262    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
27263    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
27264    @ find space for the new stack frame, check for overflow
27265    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
27266    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
27267    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
27268@    bl      common_dumpRegs
27269    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
27270    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
27271    cmp     r3, r9                      @ bottom < interpStackEnd?
27272    ldrh    lr, [rSELF, #offThread_subMode]
27273    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
27274    blo     .LstackOverflow             @ yes, this frame will overflow stack
27275
27276    @ set up newSaveArea
27277#ifdef EASY_GDB
27278    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
27279    str     ip, [r10, #offStackSaveArea_prevSave]
27280#endif
27281    str     rFP, [r10, #offStackSaveArea_prevFrame]
27282    str     rPC, [r10, #offStackSaveArea_savedPc]
27283#if defined(WITH_JIT)
27284    mov     r9, #0
27285    str     r9, [r10, #offStackSaveArea_returnAddr]
27286#endif
27287    str     r0, [r10, #offStackSaveArea_method]
27288
27289    @ Profiling?
27290    cmp     lr, #0                      @ any special modes happening?
27291    bne     2f                          @ go if so
272921:
27293    tst     r3, #ACC_NATIVE
27294    bne     .LinvokeNative
27295
27296    /*
27297    stmfd   sp!, {r0-r3}
27298    bl      common_printNewline
27299    mov     r0, rFP
27300    mov     r1, #0
27301    bl      dvmDumpFp
27302    ldmfd   sp!, {r0-r3}
27303    stmfd   sp!, {r0-r3}
27304    mov     r0, r1
27305    mov     r1, r10
27306    bl      dvmDumpFp
27307    bl      common_printNewline
27308    ldmfd   sp!, {r0-r3}
27309    */
27310
27311    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
27312    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
27313    mov     rPC, r2                         @ publish new rPC
27314
27315    @ Update state values for the new method
27316    @ r0=methodToCall, r1=newFp, r3=newMethodClass, r9=newINST
27317    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
27318    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
27319    mov     r2, #1
27320    str     r2, [rSELF, #offThread_debugIsMethodEntry]
27321#if defined(WITH_JIT)
27322    ldr     r0, [rSELF, #offThread_pJitProfTable]
27323    mov     rFP, r1                         @ fp = newFp
27324    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
27325    mov     rINST, r9                       @ publish new rINST
27326    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
27327    cmp     r0,#0
27328    bne     common_updateProfile
27329    GOTO_OPCODE(ip)                         @ jump to next instruction
27330#else
27331    mov     rFP, r1                         @ fp = newFp
27332    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
27333    mov     rINST, r9                       @ publish new rINST
27334    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
27335    GOTO_OPCODE(ip)                         @ jump to next instruction
27336#endif
27337
273382:
27339    @ Profiling - record method entry.  r0: methodToCall
27340    stmfd   sp!, {r0-r3}                @ preserve r0-r3
27341    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
27342    mov     r1, r0
27343    mov     r0, rSELF
27344    bl      dvmReportInvoke             @ (self, method)
27345    ldmfd   sp!, {r0-r3}                @ restore r0-r3
27346    b       1b
27347
27348.LinvokeNative:
27349    @ Prep for the native call
27350    @ r0=methodToCall, r1=newFp, r10=newSaveArea
27351    ldrh    lr, [rSELF, #offThread_subMode]
27352    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
27353    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
27354    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
27355    mov     r2, r0                      @ r2<- methodToCall
27356    mov     r0, r1                      @ r0<- newFp (points to args)
27357    add     r1, rSELF, #offThread_retval  @ r1<- &retval
27358    mov     r3, rSELF                   @ arg3<- self
27359
27360#ifdef ASSIST_DEBUGGER
27361    /* insert fake function header to help gdb find the stack frame */
27362    b       .Lskip
27363    .type   dalvik_mterp, %function
27364dalvik_mterp:
27365    .fnstart
27366    MTERP_ENTRY1
27367    MTERP_ENTRY2
27368.Lskip:
27369#endif
27370
27371    cmp     lr, #0                      @ any special SubModes active?
27372    bne     11f                         @ go handle them if so
27373    ldr     ip, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
27374    blx     ip
273757:
27376
27377    @ native return; r10=newSaveArea
27378    @ equivalent to dvmPopJniLocals
27379    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
27380    ldr     r1, [rSELF, #offThread_exception] @ check for exception
27381    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
27382    cmp     r1, #0                      @ null?
27383    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
27384    bne     common_exceptionThrown      @ no, handle exception
27385
27386    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
27387    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27388    GOTO_OPCODE(ip)                     @ jump to next instruction
27389
2739011:
27391    @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
27392    stmfd   sp!, {r0-r3}                @ save all but subModes
27393    mov     r0, r2                      @ r0<- methodToCall
27394    mov     r1, rSELF
27395    mov     r2, rFP
27396    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
27397    ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
27398
27399    @ Call the native method
27400    ldr     ip, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
27401    blx     ip
27402
27403    @ Restore the pre-call arguments
27404    ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
27405
27406    @ Finish up any post-invoke subMode requirements
27407    mov     r0, r2                      @ r0<- methodToCall
27408    mov     r1, rSELF
27409    mov     r2, rFP
27410    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
27411    b       7b                          @ resume
27412
27413.LstackOverflow:    @ r0=methodToCall
27414    mov     r1, r0                      @ r1<- methodToCall
27415    mov     r0, rSELF                   @ r0<- self
27416    bl      dvmHandleStackOverflow
27417    b       common_exceptionThrown
27418#ifdef ASSIST_DEBUGGER
27419    .fnend
27420    .size   dalvik_mterp, .-dalvik_mterp
27421#endif
27422
27423
27424    /*
27425     * Common code for method invocation, calling through "glue code".
27426     *
27427     * TODO: now that we have range and non-range invoke handlers, this
27428     *       needs to be split into two.  Maybe just create entry points
27429     *       that set r9 and jump here?
27430     *
27431     * On entry:
27432     *  r0 is "Method* methodToCall", the method we're trying to call
27433     *  r9 is "bool methodCallRange", indicating if this is a /range variant
27434     */
27435     .if    0
27436.LinvokeOld:
27437    sub     sp, sp, #8                  @ space for args + pad
27438    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
27439    mov     r2, r0                      @ A2<- methodToCall
27440    mov     r0, rSELF                   @ A0<- self
27441    SAVE_PC_FP_TO_SELF()                @ export state to "self"
27442    mov     r1, r9                      @ A1<- methodCallRange
27443    mov     r3, rINST, lsr #8           @ A3<- AA
27444    str     ip, [sp, #0]                @ A4<- ip
27445    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
27446    add     sp, sp, #8                  @ remove arg area
27447    b       common_resumeAfterGlueCall  @ continue to next instruction
27448    .endif
27449
27450
27451
27452/*
27453 * Common code for handling a return instruction.
27454 *
27455 * This does not return.
27456 */
27457common_returnFromMethod:
27458.LreturnNew:
27459    ldrh    lr, [rSELF, #offThread_subMode]
27460    SAVEAREA_FROM_FP(r0, rFP)
27461    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
27462    cmp     lr, #0                      @ any special subMode handling needed?
27463    bne     19f
2746414:
27465    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
27466    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
27467                                        @ r2<- method we're returning to
27468    cmp     r2, #0                      @ is this a break frame?
27469#if defined(WORKAROUND_CORTEX_A9_745320)
27470    /* Don't use conditional loads if the HW defect exists */
27471    beq     15f
27472    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
2747315:
27474#else
27475    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
27476#endif
27477    beq     common_gotoBail             @ break frame, bail out completely
27478
27479    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
27480    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
27481    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
27482    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
27483    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
27484#if defined(WITH_JIT)
27485    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
27486    mov     rPC, r9                     @ publish new rPC
27487    str     r1, [rSELF, #offThread_methodClassDex]
27488    str     r10, [rSELF, #offThread_inJitCodeCache]  @ may return to JIT'ed land
27489    cmp     r10, #0                      @ caller is compiled code
27490    blxne   r10
27491    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27492    GOTO_OPCODE(ip)                     @ jump to next instruction
27493#else
27494    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27495    mov     rPC, r9                     @ publish new rPC
27496    str     r1, [rSELF, #offThread_methodClassDex]
27497    GOTO_OPCODE(ip)                     @ jump to next instruction
27498#endif
27499
2750019:
27501    @ Handle special actions
27502    @ On entry, r0: StackSaveArea
27503    ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
27504    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
27505    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
27506    mov     r0, rSELF
27507    bl      dvmReportReturn             @ (self)
27508    SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
27509    b       14b                         @ continue
27510
27511    /*
27512     * Return handling, calls through "glue code".
27513     */
27514     .if    0
27515.LreturnOld:
27516    SAVE_PC_FP_TO_SELF()                @ export state
27517    mov     r0, rSELF                   @ arg to function
27518    bl      dvmMterp_returnFromMethod
27519    b       common_resumeAfterGlueCall
27520    .endif
27521
27522
27523/*
27524 * Somebody has thrown an exception.  Handle it.
27525 *
27526 * If the exception processing code returns to us (instead of falling
27527 * out of the interpreter), continue with whatever the next instruction
27528 * now happens to be.
27529 *
27530 * This does not return.
27531 */
27532     .global dvmMterpCommonExceptionThrown
27533dvmMterpCommonExceptionThrown:
27534common_exceptionThrown:
27535.LexceptionNew:
27536
27537    EXPORT_PC()
27538
27539    mov     r0, rSELF
27540    bl      dvmCheckSuspendPending
27541
27542    ldr     r9, [rSELF, #offThread_exception] @ r9<- self->exception
27543    mov     r1, rSELF                   @ r1<- self
27544    mov     r0, r9                      @ r0<- exception
27545    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
27546    ldrh    r2, [rSELF, #offThread_subMode]  @ get subMode flags
27547    mov     r3, #0                      @ r3<- NULL
27548    str     r3, [rSELF, #offThread_exception] @ self->exception = NULL
27549
27550    @ Special subMode?
27551    cmp     r2, #0                      @ any special subMode handling needed?
27552    bne     7f                          @ go if so
275538:
27554    /* set up args and a local for "&fp" */
27555    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
27556    str     rFP, [sp, #-4]!             @ *--sp = fp
27557    mov     ip, sp                      @ ip<- &fp
27558    mov     r3, #0                      @ r3<- false
27559    str     ip, [sp, #-4]!              @ *--sp = &fp
27560    ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
27561    mov     r0, rSELF                   @ r0<- self
27562    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
27563    ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
27564    mov     r2, r9                      @ r2<- exception
27565    sub     r1, rPC, r1                 @ r1<- pc - method->insns
27566    mov     r1, r1, asr #1              @ r1<- offset in code units
27567
27568    /* call, r0 gets catchRelPc (a code-unit offset) */
27569    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
27570
27571    /* fix earlier stack overflow if necessary; may trash rFP */
27572    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27573    cmp     r1, #0                      @ did we overflow earlier?
27574    beq     1f                          @ no, skip ahead
27575    mov     rFP, r0                     @ save relPc result in rFP
27576    mov     r0, rSELF                   @ r0<- self
27577    mov     r1, r9                      @ r1<- exception
27578    bl      dvmCleanupStackOverflow     @ call(self)
27579    mov     r0, rFP                     @ restore result
275801:
27581
27582    /* update frame pointer and check result from dvmFindCatchBlock */
27583    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
27584    cmp     r0, #0                      @ is catchRelPc < 0?
27585    add     sp, sp, #8                  @ restore stack
27586    bmi     .LnotCaughtLocally
27587
27588    /* adjust locals to match self->interpSave.curFrame and updated PC */
27589    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
27590    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
27591    str     r1, [rSELF, #offThread_method]  @ self->method = new method
27592    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
27593    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
27594    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
27595    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
27596    str     r2, [rSELF, #offThread_methodClassDex] @ self->pDvmDex = meth...
27597
27598    /* release the tracked alloc on the exception */
27599    mov     r0, r9                      @ r0<- exception
27600    mov     r1, rSELF                   @ r1<- self
27601    bl      dvmReleaseTrackedAlloc      @ release the exception
27602
27603    /* restore the exception if the handler wants it */
27604    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
27605    FETCH_INST()                        @ load rINST from rPC
27606    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27607    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
27608    streq   r9, [rSELF, #offThread_exception] @ yes, restore the exception
27609    GOTO_OPCODE(ip)                     @ jump to next instruction
27610
27611    @ Manage debugger bookkeeping
276127:
27613    str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
27614    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
27615    mov     r0, rSELF                       @ arg0<- self
27616    mov     r1, r9                          @ arg1<- exception
27617    bl      dvmReportExceptionThrow         @ (self, exception)
27618    b       8b                              @ resume with normal handling
27619
27620.LnotCaughtLocally: @ r9=exception
27621    /* fix stack overflow if necessary */
27622    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27623    cmp     r1, #0                      @ did we overflow earlier?
27624    movne   r0, rSELF                   @ if yes: r0<- self
27625    movne   r1, r9                      @ if yes: r1<- exception
27626    blne    dvmCleanupStackOverflow     @ if yes: call(self)
27627
27628    @ may want to show "not caught locally" debug messages here
27629#if DVM_SHOW_EXCEPTION >= 2
27630    /* call __android_log_print(prio, tag, format, ...) */
27631    /* "Exception %s from %s:%d not caught locally" */
27632    @ dvmLineNumFromPC(method, pc - method->insns)
27633    ldr     r0, [rSELF, #offThread_method]
27634    ldr     r1, [r0, #offMethod_insns]
27635    sub     r1, rPC, r1
27636    asr     r1, r1, #1
27637    bl      dvmLineNumFromPC
27638    str     r0, [sp, #-4]!
27639    @ dvmGetMethodSourceFile(method)
27640    ldr     r0, [rSELF, #offThread_method]
27641    bl      dvmGetMethodSourceFile
27642    str     r0, [sp, #-4]!
27643    @ exception->clazz->descriptor
27644    ldr     r3, [r9, #offObject_clazz]
27645    ldr     r3, [r3, #offClassObject_descriptor]
27646    @
27647    ldr     r2, strExceptionNotCaughtLocally
27648    ldr     r1, strLogTag
27649    mov     r0, #3                      @ LOG_DEBUG
27650    bl      __android_log_print
27651#endif
27652    str     r9, [rSELF, #offThread_exception] @ restore exception
27653    mov     r0, r9                      @ r0<- exception
27654    mov     r1, rSELF                   @ r1<- self
27655    bl      dvmReleaseTrackedAlloc      @ release the exception
27656    b       common_gotoBail             @ bail out
27657
27658
27659    /*
27660     * Exception handling, calls through "glue code".
27661     */
27662    .if     0
27663.LexceptionOld:
27664    SAVE_PC_FP_TO_SELF()                @ export state
27665    mov     r0, rSELF                   @ arg to function
27666    bl      dvmMterp_exceptionThrown
27667    b       common_resumeAfterGlueCall
27668    .endif
27669
27670#if defined(WITH_JIT)
27671    /*
27672     * If the JIT is actively building a trace we need to make sure
27673     * that the field is fully resolved before including the current
27674     * instruction.
27675     *
27676     * On entry:
27677     *     r10: &dvmDex->pResFields[field]
27678     *     r0:  field pointer (must preserve)
27679     */
27680common_verifyField:
27681    ldrh    r3, [rSELF, #offThread_subMode]  @ r3 <- submode byte
27682    ands    r3, #kSubModeJitTraceBuild
27683    bxeq    lr                          @ Not building trace, continue
27684    ldr     r1, [r10]                   @ r1<- reload resolved StaticField ptr
27685    cmp     r1, #0                      @ resolution complete?
27686    bxne    lr                          @ yes, continue
27687    stmfd   sp!, {r0-r2,lr}             @ save regs
27688    mov     r0, rSELF
27689    mov     r1, rPC
27690    bl      dvmJitEndTraceSelect        @ (self,pc) end trace before this inst
27691    ldmfd   sp!, {r0-r2, lr}
27692    bx      lr                          @ return
27693#endif
27694
27695/*
27696 * After returning from a "glued" function, pull out the updated
27697 * values and start executing at the next instruction.
27698 */
27699common_resumeAfterGlueCall:
27700    LOAD_PC_FP_FROM_SELF()              @ pull rPC and rFP out of thread
27701    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh
27702    FETCH_INST()                        @ load rINST from rPC
27703    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27704    GOTO_OPCODE(ip)                     @ jump to next instruction
27705
27706/*
27707 * Invalid array index. Note that our calling convention is strange; we use r1
27708 * and r3 because those just happen to be the registers all our callers are
27709 * using. We move r3 before calling the C function, but r1 happens to match.
27710 * r1: index
27711 * r3: size
27712 */
27713common_errArrayIndex:
27714    EXPORT_PC()
27715    mov     r0, r3
27716    bl      dvmThrowArrayIndexOutOfBoundsException
27717    b       common_exceptionThrown
27718
27719/*
27720 * Integer divide or mod by zero.
27721 */
27722common_errDivideByZero:
27723    EXPORT_PC()
27724    ldr     r0, strDivideByZero
27725    bl      dvmThrowArithmeticException
27726    b       common_exceptionThrown
27727
27728/*
27729 * Attempt to allocate an array with a negative size.
27730 * On entry: length in r1
27731 */
27732common_errNegativeArraySize:
27733    EXPORT_PC()
27734    mov     r0, r1                                @ arg0 <- len
27735    bl      dvmThrowNegativeArraySizeException    @ (len)
27736    b       common_exceptionThrown
27737
27738/*
27739 * Invocation of a non-existent method.
27740 * On entry: method name in r1
27741 */
27742common_errNoSuchMethod:
27743    EXPORT_PC()
27744    mov     r0, r1
27745    bl      dvmThrowNoSuchMethodError
27746    b       common_exceptionThrown
27747
27748/*
27749 * We encountered a null object when we weren't expecting one.  We
27750 * export the PC, throw a NullPointerException, and goto the exception
27751 * processing code.
27752 */
27753common_errNullObject:
27754    EXPORT_PC()
27755    mov     r0, #0
27756    bl      dvmThrowNullPointerException
27757    b       common_exceptionThrown
27758
27759/*
27760 * For debugging, cause an immediate fault.  The source address will
27761 * be in lr (use a bl instruction to jump here).
27762 */
27763common_abort:
27764    ldr     pc, .LdeadFood
27765.LdeadFood:
27766    .word   0xdeadf00d
27767
27768/*
27769 * Spit out a "we were here", preserving all registers.  (The attempt
27770 * to save ip won't work, but we need to save an even number of
27771 * registers for EABI 64-bit stack alignment.)
27772 */
27773    .macro  SQUEAK num
27774common_squeak\num:
27775    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27776    ldr     r0, strSqueak
27777    mov     r1, #\num
27778    bl      printf
27779    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27780    bx      lr
27781    .endm
27782
27783    SQUEAK  0
27784    SQUEAK  1
27785    SQUEAK  2
27786    SQUEAK  3
27787    SQUEAK  4
27788    SQUEAK  5
27789
27790/*
27791 * Spit out the number in r0, preserving registers.
27792 */
27793common_printNum:
27794    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27795    mov     r1, r0
27796    ldr     r0, strSqueak
27797    bl      printf
27798    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27799    bx      lr
27800
27801/*
27802 * Print a newline, preserving registers.
27803 */
27804common_printNewline:
27805    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27806    ldr     r0, strNewline
27807    bl      printf
27808    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27809    bx      lr
27810
27811    /*
27812     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
27813     */
27814common_printHex:
27815    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27816    mov     r1, r0
27817    ldr     r0, strPrintHex
27818    bl      printf
27819    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27820    bx      lr
27821
27822/*
27823 * Print the 64-bit quantity in r0-r1, preserving registers.
27824 */
27825common_printLong:
27826    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27827    mov     r3, r1
27828    mov     r2, r0
27829    ldr     r0, strPrintLong
27830    bl      printf
27831    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27832    bx      lr
27833
27834/*
27835 * Print full method info.  Pass the Method* in r0.  Preserves regs.
27836 */
27837common_printMethod:
27838    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27839    bl      dvmMterpPrintMethod
27840    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27841    bx      lr
27842
27843/*
27844 * Call a C helper function that dumps regs and possibly some
27845 * additional info.  Requires the C function to be compiled in.
27846 */
27847    .if     0
27848common_dumpRegs:
27849    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27850    bl      dvmMterpDumpArmRegs
27851    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27852    bx      lr
27853    .endif
27854
27855#if 0
27856/*
27857 * Experiment on VFP mode.
27858 *
27859 * uint32_t setFPSCR(uint32_t val, uint32_t mask)
27860 *
27861 * Updates the bits specified by "mask", setting them to the values in "val".
27862 */
27863setFPSCR:
27864    and     r0, r0, r1                  @ make sure no stray bits are set
27865    fmrx    r2, fpscr                   @ get VFP reg
27866    mvn     r1, r1                      @ bit-invert mask
27867    and     r2, r2, r1                  @ clear masked bits
27868    orr     r2, r2, r0                  @ set specified bits
27869    fmxr    fpscr, r2                   @ set VFP reg
27870    mov     r0, r2                      @ return new value
27871    bx      lr
27872
27873    .align  2
27874    .global dvmConfigureFP
27875    .type   dvmConfigureFP, %function
27876dvmConfigureFP:
27877    stmfd   sp!, {ip, lr}
27878    /* 0x03000000 sets DN/FZ */
27879    /* 0x00009f00 clears the six exception enable flags */
27880    bl      common_squeak0
27881    mov     r0, #0x03000000             @ r0<- 0x03000000
27882    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
27883    bl      setFPSCR
27884    ldmfd   sp!, {ip, pc}
27885#endif
27886
27887
27888/*
27889 * String references, must be close to the code that uses them.
27890 */
27891    .align  2
27892strDivideByZero:
27893    .word   .LstrDivideByZero
27894strLogTag:
27895    .word   .LstrLogTag
27896strExceptionNotCaughtLocally:
27897    .word   .LstrExceptionNotCaughtLocally
27898
27899strNewline:
27900    .word   .LstrNewline
27901strSqueak:
27902    .word   .LstrSqueak
27903strPrintHex:
27904    .word   .LstrPrintHex
27905strPrintLong:
27906    .word   .LstrPrintLong
27907
27908/*
27909 * Zero-terminated ASCII string data.
27910 *
27911 * On ARM we have two choices: do like gcc does, and LDR from a .word
27912 * with the address, or use an ADR pseudo-op to get the address
27913 * directly.  ADR saves 4 bytes and an indirection, but it's using a
27914 * PC-relative addressing mode and hence has a limited range, which
27915 * makes it not work well with mergeable string sections.
27916 */
27917    .section .rodata.str1.4,"aMS",%progbits,1
27918
27919.LstrBadEntryPoint:
27920    .asciz  "Bad entry point %d\n"
27921.LstrFilledNewArrayNotImpl:
27922    .asciz  "filled-new-array only implemented for objects and 'int'"
27923.LstrDivideByZero:
27924    .asciz  "divide by zero"
27925.LstrLogTag:
27926    .asciz  "mterp"
27927.LstrExceptionNotCaughtLocally:
27928    .asciz  "Exception %s from %s:%d not caught locally\n"
27929
27930.LstrNewline:
27931    .asciz  "\n"
27932.LstrSqueak:
27933    .asciz  "<%d>"
27934.LstrPrintHex:
27935    .asciz  "<%#x>"
27936.LstrPrintLong:
27937    .asciz  "<%lld>"
27938
27939